Re: gtk-x11 on top of win32, experiences.



On Sat, 2006-10-14 at 20:11 +0200, Jesús López wrote:
> Hi, and greetings to the developer force, beatifull work.
> 
> The following is about compiling GTK targeting win32 binaries, but 
> insiting in the use of a X11 backend. 

GTK should compile and run fine on windows under cygwin, targeting X11.
You cannot compile it with mingw, however.  And the resulting
application is a cygwin executable, meaning it depends on cygwin1.dll
(and any other dlls).

There's no need to waste your time doing this, however, as cygwin
already has ready-made GTK2 X11 packages available.  And the nice thing
about this package is that it will coexist fine with the native win32
runtime, allowing you to switch back and forth between the X11 and win32
gdi targets without many hassles.

http://www.cygwin.com/packages/gtk2-x11-runtime/gtk2-x11-runtime-2.6.8-1

If you don't want to use cygwin, then the only other choice is to try to
use Microsoft's free unix tools (which includes, ironically, GCC
compiled by Microsoft and distributed under the terms of the GPL).

On Windows, there is no posix layer, so to get GTK on X11 you must use
either cygwin or the microsoft unix tools to get the posix layer.  

Michael

  

> 
> > To fully explain my problem I guess a bit of background is necessary:
> > There is a product which compiles for a variety of platforms including but
> > not limited to linux, solaris, freebsd, windows. I have been working on
> > some user interface issues using gtk+. In general the aim of the exercise
> > is to generate an application that is an X client. Under the *NIX systems
> > this was no problem since the default binding of gtk+ is X11. The problem
> > arose when trying to port the software on Windows, where the default
> > binding is win32. Does anyone has experience with compiling gtk with x
> > support (I suppose Xlib will be necessary) on Windows? Solutions with both
> > MinGW and Cygwin are possible although the former is preferred.
> 
> I've spent several weeks in this task and I have achieved results, I 
> obtained a working version of gtk-demo that seems ok with a xming 
> win32 X server. Its a very time consuming task at least to figure out 
> how from scratch. I compiled the X11 libraries under MSYS, and cross 
> compiled gtk+, pango and cairo in an ubuntu box. I needed to apply 
> some hacks to the X11 source and also to gtk's. I have an sketchy 
> draft in Spanish of the changes and procedure, but lack the time to 
> try to push this changes in the due way (I am a auto*, CVS, bugzilla 
> et al illiterate)
> 
> If there's interest in the little changes done to get gtk-demo 
> running I will discuss them here.
> 
> I just discuss one of the changes. In gdk/x11/
> 
> In _gdk_events_init() one sees:
> 
> >   int connection_number = ConnectionNumber (display_x11->xdisplay);
> >   GDK_NOTE (MISC, g_message ("connection number: %d", connection_number));
> > 
> > 
> >   source = display_x11->event_source = gdk_display_source_new (display);
> >   display_source = (GdkDisplaySource*) source; g_source_set_priority
> >   (source, GDK_PRIORITY_EVENTS);
> > 
> >   display_source->event_poll_fd.fd = connection_number;
> >   display_source->event_poll_fd.events = G_IO_IN;
> 
> basically here connection_number is the file descriptor of the socket 
> of communication between X11 client and server. 
> 
> Now analyzing the gtk event loop you know, we enter in GLib realm and 
> have the call tree:
> 
> gtk-main
> g_main_loop_run
> g_main_context_iterate
> g_main_context_poll
> g_poll
> 
> and in g_poll is where the external events of the app are waited, in 
> a WaitForMultipleObjects call that accepts win32 HANDLEs instead of 
> file descriptors of the runtime C library msvcrt.  So my solution was 
> to change:
> 
> 
> >  display_source->event_poll_fd.fd = connection_number;
> 
> by
> 
> >  display_event = CreateEventA(NULL, 0, 0, "DisplayEvent");
> >  WSAEventSelect(connection_number, display_event, FD_READ);
> >  display_source->event_poll_fd.fd = display_event;
> 
> Anyhow not all is like in heaven and I would thank a lot some help 
> with the following problem. The symptoms are seen in a sample 
> gtksocket & plug app:
> 
> socket:
> int main(int argc, char **argv) {
> 	GtkWidget *window, *socket;
> 	gtk_init(&argc, &argv);
> 
> 	window = gtk_window_new ( GTK_WINDOW_TOPLEVEL );
> 	socket = gtk_socket_new ();
> 	gtk_widget_show (socket);
> 	gtk_container_add (GTK_CONTAINER (window), socket);
> 	gtk_widget_realize (socket);
> 	g_print ("The ID of the sockets window is %d\n", 
> 	         gtk_socket_get_id ((GtkSocket *)socket));
> 	gtk_widget_show_all ( window );
> 	
> 	gtk_main();
> 	return 0;
> }
> 
> plug:
> int main(int argc, char **argv) {
> 	GtkWidget *plug;
> 	GtkWidget *entry;
> 
> 	gtk_init(&argc, &argv);
> 	plug = gtk_plug_new(atoi(argv[1]));
> 	entry = gtk_entry_new();
> 	gtk_container_add ( GTK_CONTAINER ( plug ), entry );
> 	gtk_widget_show ( plug );
> 	gtk_widget_show ( entry );
> 	gtk_main();
> }
> 
> The app works well in linux and in windows with libgtk-win32.dll
> But when compiled against libgtk-x11.dll, while gtk-demo has a nice 
> text input boxes, this app has time delays and unresponsivenes. I've 
> put an 'x' to print after any event in g_poll, and I note that the 
> mouse events, and the key-up and down events of shift, ctrl, and alt 
> keys work ok both in plug and socket processes, but the other 
> keypresses don't break the wait, and are queued and only processed 
> until some timeout or mouse action. Thank you for your time.-
> 
> Jesús López
> 
> 
> 
> 
> 
> 
> _______________________________________________
> gtk-devel-list mailing list
> gtk-devel-list gnome org
> http://mail.gnome.org/mailman/listinfo/gtk-devel-list
> 




[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]