forked from AuroraMiddleware/gtk
GTK is a multi-platform toolkit for creating graphical user interfaces.
9ca38c4647
According to the XEmbed specification, a window should be created "elsewhere" and then reparented into the target parent window. Instead, GTK+ creates the window directly in desired target parent window. This allows some races to occur. Another program that does not follow XEmbed is tabbed. XEmbed requires an _XEMBED_INFO property on the to-be-embedded window, but tabbed does not check for this property. Thus, as soon as GTK+ creates its window, tabbed starts managing this window and now GTK+ setting up the window races with tabbed starting to manage the window. If tabbed is fast enough to map the window, GTK+ never sees a MapNotify event, because it did not yet select StructureNotifyMask on its window. This results in a black window inside of tabbed. Note that this cannot really be fixed in tabbed, since XEmbed says that the _XEMBED_INFO property must be already present when the window appears. Thus, patching tabbed to wait for _XEMBED_INFO to appear is not something that the spec requires/allows. Instead, this commit changes GTK+ so that it directly sets the right event mask when the window is created. This means that there is no more race between tabbed mapping the window and GTK+ selecting StructureNotifyMask. Note that the proper fix would be to do as XEmbed requires: Create the window elsewhere and then reparent it into the target window. However, that would require a more invasive patch, so this commit only takes the "easy approach" of fixing this one race. Hopefully, all the other races that can occur during window setup are harmless, because the embedder/socket will hopefully watch for PropertyNotify events as needed. Fixes: https://gitlab.gnome.org/GNOME/gtk/issues/757 See-also: https://github.com/awesomeWM/awesome/issues/2385 Signed-off-by: Uli Schlachter <psychon@znc.in> |
||
---|---|---|
.gitlab-ci | ||
build | ||
build-aux/flatpak | ||
demos | ||
docs | ||
examples | ||
gdk | ||
gtk | ||
libgail-util | ||
m4 | ||
m4macros | ||
modules | ||
po | ||
po-properties | ||
tests | ||
testsuite | ||
.gitlab-ci.yml | ||
acinclude.m4 | ||
AUTHORS | ||
autogen.sh | ||
config.h.win32.in | ||
configure.ac | ||
COPYING | ||
gail-3.0.pc.in | ||
gdk-3.0.pc.in | ||
git.mk | ||
gtk-zip.sh.in | ||
gtk+-3.0.pc.in | ||
gtk+-unix-print-3.0.pc.in | ||
gtk+.doap | ||
HACKING | ||
INSTALL.in | ||
MAINTAINERS | ||
make-pot | ||
Makefile.am | ||
Makefile.decl | ||
makefile.msc | ||
NEWS | ||
NEWS.pre-1-0 | ||
README.commits | ||
README.in | ||
README.win32 | ||
sanitize-la.sh |
The Win32 backend in GTK+ is not as stable or correct as the X11 one. For prebuilt runtime and developer packages see http://ftp.gnome.org/pub/gnome/binaries/win32/ Building GTK+ on Win32 ====================== First you obviously need developer packages for the compile-time dependencies: GDK-Pixbuf, Pango, atk, glib, gettext-runtime, libiconv at least. See http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies . For people compiling GTK+ with Visual C++ 2005 or later, it is recommended that the same compiler is used for at least GDK-Pixbuf, Pango, atk and glib so that crashes and errors caused by different CRTs can be avoided. The VS 2008 project files and/or VS Makefiles are either already available or will be available in the next stable release. Unfortunately compiling with Microsoft's compilers versions 2003 or earlier is not supported as compiling the latest stable GLib (which *is* required for building this GTK+ release) requires features from newer compilers and/or Platform SDKs After installing the dependencies, there are two ways to build GTK+ for win32. 1) GNU tools, ./configure && make install ----------------------------------------- This requires you have mingw and MSYS. Use the configure script, and the resulting Makefiles (which use libtool and gcc to do the compilation). I use this myself, but it can be hard to setup correctly. The full script I run to build GTK+ 2.16 unpacked from a source distribution is as below. This is from bulding GTK+ 2.16.5. I don't use any script like this to build the development branch, as I don't distribute any binaries from development branches. # This is a shell script that calls functions and scripts from # tml@iki.fi's personal work envíronment. It is not expected to be # usable unmodified by others, and is included only for reference. MOD=gtk+ VER=2.16.5 REV=1 ARCH=win32 THIS=${MOD}_${VER}-${REV}_${ARCH} RUNZIP=${MOD}_${VER}-${REV}_${ARCH}.zip DEVZIP=${MOD}-dev_${VER}-${REV}_${ARCH}.zip HEX=`echo $THIS | md5sum | cut -d' ' -f1` TARGET=c:/devel/target/$HEX usedev usemsvs6 ( set -x DEPS=`latest --arch=${ARCH} glib atk cairo pango libpng zlib libtiff jpeg` PROXY_LIBINTL=`latest --arch=${ARCH} proxy-libintl` PKG_CONFIG_PATH= for D in $DEPS; do PATH=/devel/dist/${ARCH}/$D/bin:$PATH [ -d /devel/dist/${ARCH}/$D/lib/pkgconfig ] && PKG_CONFIG_PATH=/devel/dist/${ARCH}/$D/lib/pkgconfig:$PKG_CONFIG_PATH done LIBPNG=`latest --arch=${ARCH} libpng` ZLIB=`latest --arch=${ARCH} zlib` LIBTIFF=`latest --arch=${ARCH} libtiff` JPEG=`latest --arch=${ARCH} jpeg` patch -p0 <<'EOF' EOF lt_cv_deplibs_check_method='pass_all' \ CC='gcc -mtune=pentium3 -mthreads' \ CPPFLAGS="-I/devel/dist/${ARCH}/${LIBPNG}/include \ -I/devel/dist/${ARCH}/${ZLIB}/include \ -I/devel/dist/${ARCH}/${LIBTIFF}/include \ -I/devel/dist/${ARCH}/${JPEG}/include \ -I/devel/dist/${ARCH}/${PROXY_LIBINTL}/include" \ LDFLAGS="-L/devel/dist/${ARCH}/${LIBPNG}/lib \ -L/devel/dist/${ARCH}/${ZLIB}/lib \ -L/devel/dist/${ARCH}/${LIBTIFF}/lib \ -L/devel/dist/${ARCH}/${JPEG}/lib \ -L/devel/dist/${ARCH}/${PROXY_LIBINTL}/lib -Wl,--exclude-libs=libintl.a \ -Wl,--enable-auto-image-base" \ LIBS=-lintl \ CFLAGS=-O2 \ ./configure \ --enable-win32-backend \ --disable-gdiplus \ --with-included-immodules \ --without-libjasper \ --enable-debug=yes \ --enable-explicit-deps=no \ --disable-gtk-doc \ --disable-static \ --prefix=$TARGET && libtoolcacheize && rm gtk/gtk.def && (PATH="$PWD/gdk-pixbuf/.libs:/devel/target/$HEX/bin:$PATH" make -j3 install || (rm .libtool-cache* && PATH="/devel/target/$HEX/bin:$PATH" make -j3 install)) && PATH="/devel/target/$HEX/bin:$PATH" gdk-pixbuf-query-loaders >/devel/target/$HEX/etc/gtk-2.0/gdk-pixbuf.loaders && grep -v -E 'Automatically generated|Created by|LoaderDir =' <$TARGET/etc/gtk-2.0/gdk-pixbuf.loaders >$TARGET/etc/gtk-2.0/gdk-pixbuf.loaders.temp && mv $TARGET/etc/gtk-2.0/gdk-pixbuf.loaders.temp $TARGET/etc/gtk-2.0/gdk-pixbuf.loaders && grep -v -E 'Automatically generated|Created by|ModulesPath =' <$TARGET/etc/gtk-2.0/gtk.immodules >$TARGET/etc/gtk-2.0/gtk.immodules.temp && mv $TARGET/etc/gtk-2.0/gtk.immodules.temp $TARGET/etc/gtk-2.0/gtk.immodules && ./gtk-zip.sh && mv /tmp/${MOD}-${VER}.zip /tmp/$RUNZIP && mv /tmp/${MOD}-dev-${VER}.zip /tmp/$DEVZIP ) 2>&1 | tee /devel/src/tml/packaging/$THIS.log (cd /devel && zip /tmp/$DEVZIP src/tml/packaging/$THIS.{sh,log}) && manifestify /tmp/$RUNZIP /tmp/$DEVZIP You should not just copy the above blindly. There are some things in the script that are very specific to *my* build setup on *my* current machine. For instance the "latest" command, the "usedev" and "usemsvs6" shell functions, the /devel/dist folder. The above script is really just meant for reference, to give an idea. You really need to understand what things like PKG_CONFIG_PATH are and set them up properly after installing the dependencies before building GTK+. As you see above, after running configure, one can just say "make install", like on Unix. A post-build fix is needed, running gdk-pixbuf-query-loaders once more to get a correct gdk-pixbuf.loaders file. For a 64-bit build you need to remove the gtk/gtk.def file and let it be regenerated by the makefilery. This is because the 64-bit GTK dll has a slightly different list of exported function names. This is on purpose and not a bug. The API is the same at the source level, and the same #defines of some function names to actually have a _utf8 suffix is used (just to keep the header simpler). But the corresponding non-suffixed function to maintain ABI stability are not needed in the 64-bit case (because there are no older EXEs around that would require such for ABI stability). 2) Microsoft's tools -------------------- Use the Microsoft compiler, cl and Make, nmake. Say nmake -f makefile.msc in gdk and gtk. Be prepared to manually edit various makefile.msc files, and the makefile snippets in build/win32. There are also VS 2008/2010 solution and project files to build GTK+, which are maintained by Chun-wei Fan. They should build GTK+ out of the box, provided that the afore-mentioned dependencies are installed. They will build GDK with the Win32 backend, GTK+ itself (with GAIL/a11y built in), the GAIL-Util library and the gtk-demo program. Please refer to the following GNOME Live! page for a more detailed ouline on the process of building the GTK+ stack and its dependencies with Visual C++: https://wiki.gnome.org/Projects/GTK+/Win32/MSVCCompilationOfGTKStack Alternative 1 also generates Microsoft import libraries (.lib), if you have lib.exe available. It might also work for cross-compilation from Unix. I (Tor) use method 1 myself. Hans Breuer has been taking care of the MSVC makefiles. At times, we disagree a bit about various issues, and for instance the makefile.msc files might not produce identically named DLLs and import libraries as the "autoconfiscated" makefiles and libtool do. If this bothers you, you will have to fix the makefiles. Using GTK+ on Win32 =================== To use GTK+ on Win32, you also need either one of the above mentioned compilers. Other compilers might work, but don't count on it. Look for prebuilt developer packages (DLLs, import libraries, headers) on the above website. Multi-threaded use of GTK+ on Win32 =================================== Multi-threaded GTK+ programs might work on Windows in special simple cases, but not in general. Sorry. If you have all GTK+ and GDK calls in the same thread, it might work. Otherwise, probably not at all. Possible ways to fix this are being investigated. Wintab ====== The tablet support uses the Wintab API. The Wintab development kit is no longer required. The wintab.h header file is bundled with GTK+ sources. Unfortunately it seems that only Wacom tablets come with support for the Wintab API nowadays. --Tor Lillqvist <tml@iki.fi>, <tml@novell.com> --Updated by Fan, Chun-wei <fanc999@yahoo.com.tw>