works fine here on i386, tested gaim, gqview, gvim, and xnmap both locally and remote through ssh -X
mozilla-firefox didn't work however, but there's probably more to it than just fixing gtk+ ok david@ * steven mestdagh <[EMAIL PROTECTED]> [060610 08:38]: > Brad [2006-06-10, 06:06:07]: > > I noticed this from the Gtk+ 2.9.2 release notes.. > > > > * Make GTK+ work as an untrused X client > > applies reasonably well to the in tree version. i did some very minimal > testing on i386, it seems to work. obviously, more testing with this is > appreciated... > > Index: Makefile > =================================================================== > RCS file: /cvs/ports/x11/gtk+2/Makefile,v > retrieving revision 1.38 > diff -u -r1.38 Makefile > --- Makefile 2006/06/03 19:56:56 1.38 > +++ Makefile 2006/06/10 12:57:43 > @@ -7,7 +7,7 @@ > > VERSION= 2.8.18 > DISTNAME= gtk+-${VERSION} > -PKGNAME= gtk+2-${VERSION}p1 > +PKGNAME= gtk+2-${VERSION}p2 > PKGNAME-docs= gtk+2-docs-${VERSION} > CATEGORIES= x11 devel > > Index: patches/patch-gdk_x11_gdkdisplay-x11_c > =================================================================== > RCS file: patch-gdk_x11_gdkdisplay-x11_c > diff -N patch-gdk_x11_gdkdisplay-x11_c > --- /dev/null Sat Aug 30 18:16:59 1997 > +++ patches/patch-gdk_x11_gdkdisplay-x11_c Sat Jun 10 12:57:43 2006 > @@ -0,0 +1,38 @@ > +$OpenBSD$ > +--- gdk/x11/gdkdisplay-x11.c.orig Thu Jun 30 05:35:30 2005 > ++++ gdk/x11/gdkdisplay-x11.c Sat Jun 10 14:32:57 2006 > +@@ -224,6 +224,24 @@ gdk_display_open (const gchar *display_n > + #endif > + display_x11->have_xfixes = FALSE; > + > ++ display_x11->trusted_client = TRUE; > ++ { > ++ Window root, child; > ++ int rootx, rooty, winx, winy; > ++ unsigned int xmask; > ++ > ++ gdk_error_trap_push (); > ++ XQueryPointer (display_x11->xdisplay, > ++ GDK_SCREEN_X11 (display_x11->default_screen)->xroot_window, > ++ &root, &child, &rootx, &rooty, &winx, &winy, &xmask); > ++ gdk_flush (); > ++ if (G_UNLIKELY (gdk_error_trap_pop () == BadWindow)) > ++ { > ++ g_warning ("Connection to display %s appears to be untrusted. Pointer > and keyboard grabs and inter-client communication may not work as expected.", > gdk_display_get_name (display)); > ++ display_x11->trusted_client = FALSE; > ++ } > ++ } > ++ > + if (_gdk_synchronize) > + XSynchronize (display_x11->xdisplay, True); > + > +@@ -1043,6 +1061,9 @@ gdk_notify_startup_complete (void) > + display_x11 = GDK_DISPLAY_X11 (display); > + > + if (display_x11->startup_notification_id == NULL) > ++ return; > ++ > ++ if (!G_LIKELY (display_x11->trusted_client)) > + return; > + > + escaped_id = escape_for_xmessage (display_x11->startup_notification_id); > Index: patches/patch-gdk_x11_gdkdisplay-x11_h > =================================================================== > RCS file: patch-gdk_x11_gdkdisplay-x11_h > diff -N patch-gdk_x11_gdkdisplay-x11_h > --- /dev/null Sat Aug 30 18:16:59 1997 > +++ patches/patch-gdk_x11_gdkdisplay-x11_h Sat Jun 10 12:57:43 2006 > @@ -0,0 +1,15 @@ > +$OpenBSD$ > +--- gdk/x11/gdkdisplay-x11.h.orig Thu Jun 30 05:35:30 2005 > ++++ gdk/x11/gdkdisplay-x11.h Sat Jun 10 14:32:57 2006 > +@@ -81,6 +81,11 @@ struct _GdkDisplayX11 > + gboolean have_xfixes; > + gint xfixes_event_base; > + > ++ /* If the SECURITY extension is in place, whether this client holds > ++ * a trusted authorization and so is allowed to make various requests > ++ * (grabs, properties etc.) Otherwise always TRUE. */ > ++ gboolean trusted_client; > ++ > + /* Information about current pointer and keyboard grabs held by this > + * client. If gdk_pointer_xgrab_window or gdk_keyboard_xgrab_window > + * window is NULL, then the other associated fields are ignored > Index: patches/patch-gdk_x11_gdkdnd-x11_c > =================================================================== > RCS file: patch-gdk_x11_gdkdnd-x11_c > diff -N patch-gdk_x11_gdkdnd-x11_c > --- /dev/null Sat Aug 30 18:16:59 1997 > +++ patches/patch-gdk_x11_gdkdnd-x11_c Sat Jun 10 12:57:43 2006 > @@ -0,0 +1,39 @@ > +$OpenBSD$ > +--- gdk/x11/gdkdnd-x11.c.orig Thu May 18 20:15:40 2006 > ++++ gdk/x11/gdkdnd-x11.c Sat Jun 10 14:32:57 2006 > +@@ -489,6 +489,25 @@ gdk_window_cache_new (GdkScreen *screen) > + > + XGetWindowAttributes (xdisplay, GDK_WINDOW_XWINDOW (root_window), &xwa); > + result->old_event_mask = xwa.your_event_mask; > ++ > ++ if (G_UNLIKELY (!GDK_DISPLAY_X11 (GDK_SCREEN_X11 > (screen)->display)->trusted_client)) > ++ { > ++ GList *toplevel_windows, *list; > ++ GdkWindow *window; > ++ gint x, y, width, height; > ++ > ++ toplevel_windows = gdk_screen_get_toplevel_windows (screen); > ++ for (list = toplevel_windows; list; list = list->next) { > ++ window = GDK_WINDOW (list->data); > ++ gdk_window_get_geometry (window, &x, &y, &width, &height, NULL); > ++ gdk_window_cache_add (result, GDK_WINDOW_XID (window), > ++ x, y, width, height, > ++ gdk_window_is_visible (window)); > ++ } > ++ g_list_free (toplevel_windows); > ++ return result; > ++ } > ++ > + XSelectInput (xdisplay, GDK_WINDOW_XWINDOW (root_window), > + result->old_event_mask | SubstructureNotifyMask); > + gdk_window_add_filter (root_window, gdk_window_cache_filter, result); > +@@ -1315,6 +1334,9 @@ motif_send_enter (GdkDragContext *conte > + GdkDragContextPrivateX11 *private = PRIVATE_DATA (context); > + GdkDisplay *display = GDK_DRAWABLE_DISPLAY (context->source_window); > + XEvent xev; > ++ > ++ if (!G_LIKELY (GDK_DISPLAY_X11 (display)->trusted_client)) > ++ return; /* Motif Dnd requires getting properties on the root window */ > + > + xev.xclient.type = ClientMessage; > + xev.xclient.message_type = gdk_x11_get_xatom_by_name_for_display > (display, "_MOTIF_DRAG_AND_DROP_MESSAGE"); > Index: patches/patch-gdk_x11_gdkevents-x11_c > =================================================================== > RCS file: patch-gdk_x11_gdkevents-x11_c > diff -N patch-gdk_x11_gdkevents-x11_c > --- /dev/null Sat Aug 30 18:16:59 1997 > +++ patches/patch-gdk_x11_gdkevents-x11_c Sat Jun 10 12:57:43 2006 > @@ -0,0 +1,32 @@ > +$OpenBSD$ > +--- gdk/x11/gdkevents-x11.c.orig Wed Jan 11 07:30:38 2006 > ++++ gdk/x11/gdkevents-x11.c Sat Jun 10 14:32:57 2006 > +@@ -2551,6 +2551,8 @@ fetch_net_wm_check_window (GdkScreen *sc > + > + screen_x11 = GDK_SCREEN_X11 (screen); > + display = screen_x11->display; > ++ > ++ g_return_if_fail (GDK_DISPLAY_X11 (display)->trusted_client); > + > + if (screen_x11->wmspec_check_window != None) > + return; /* already have it */ > +@@ -2608,6 +2610,9 @@ gdk_x11_screen_get_window_manager_name ( > + > + screen_x11 = GDK_SCREEN_X11 (screen); > + > ++ if (!G_LIKELY (GDK_DISPLAY_X11 (screen_x11->display)->trusted_client)) > ++ return screen_x11->window_manager_name; > ++ > + fetch_net_wm_check_window (screen); > + > + if (screen_x11->need_refetch_wm_name) > +@@ -2702,6 +2707,9 @@ gdk_x11_screen_supports_net_wm_hint (Gdk > + > + screen_x11 = GDK_SCREEN_X11 (screen); > + display = screen_x11->display; > ++ > ++ if (!G_LIKELY (GDK_DISPLAY_X11 (display)->trusted_client)) > ++ return FALSE; > + > + supported_atoms = g_object_get_data (G_OBJECT (screen), > "gdk-net-wm-supported-atoms"); > + if (!supported_atoms) > Index: patches/patch-gdk_x11_gdkmain-x11_c > =================================================================== > RCS file: patch-gdk_x11_gdkmain-x11_c > diff -N patch-gdk_x11_gdkmain-x11_c > --- /dev/null Sat Aug 30 18:16:59 1997 > +++ patches/patch-gdk_x11_gdkmain-x11_c Sat Jun 10 12:57:43 2006 > @@ -0,0 +1,70 @@ > +$OpenBSD$ > +--- gdk/x11/gdkmain-x11.c.orig Thu Jul 7 21:05:33 2005 > ++++ gdk/x11/gdkmain-x11.c Sat Jun 10 14:32:57 2006 > +@@ -191,6 +191,7 @@ gdk_pointer_grab (GdkWindow * window, > + { > + gint return_val; > + GdkCursorPrivate *cursor_private; > ++ GdkDisplayX11 *display_x11; > + guint xevent_mask; > + Window xwindow; > + Window xconfine_to; > +@@ -202,6 +203,8 @@ gdk_pointer_grab (GdkWindow * window, > + g_return_val_if_fail (GDK_IS_WINDOW (window), 0); > + g_return_val_if_fail (confine_to == NULL || GDK_IS_WINDOW (confine_to), > 0); > + > ++ display_x11 = GDK_DISPLAY_X11 (GDK_WINDOW_DISPLAY (window)); > ++ > + cursor_private = (GdkCursorPrivate*) cursor; > + > + xwindow = GDK_WINDOW_XID (window); > +@@ -233,7 +236,8 @@ gdk_pointer_grab (GdkWindow * window, > + confine_to, > + time); > + > +- if (return_val == GrabSuccess) > ++ if (return_val == GrabSuccess || > ++ G_UNLIKELY (!display_x11->trusted_client && return_val == > AlreadyGrabbed)) > + { > + if (!GDK_WINDOW_DESTROYED (window)) > + { > +@@ -257,7 +261,6 @@ gdk_pointer_grab (GdkWindow * window, > + > + if (return_val == GrabSuccess) > + { > +- GdkDisplayX11 *display_x11 = GDK_DISPLAY_X11 (GDK_WINDOW_DISPLAY > (window)); > + if (display_x11->pointer_xgrab_window != NULL && > + display_x11->pointer_xgrab_window != (GdkWindowObject *)window) > + generate_grab_broken_event (GDK_WINDOW > (display_x11->pointer_xgrab_window), > +@@ -338,10 +341,13 @@ gdk_keyboard_grab (GdkWindow * window > + { > + gint return_val; > + unsigned long serial; > ++ GdkDisplayX11 *display_x11; > + > + g_return_val_if_fail (window != NULL, 0); > + g_return_val_if_fail (GDK_IS_WINDOW (window), 0); > + > ++ display_x11 = GDK_DISPLAY_X11 (GDK_WINDOW_DISPLAY (window)); > ++ > + serial = NextRequest (GDK_WINDOW_XDISPLAY (window)); > + > + if (!GDK_WINDOW_DESTROYED (window)) > +@@ -356,13 +362,16 @@ gdk_keyboard_grab (GdkWindow * window > + owner_events, > + GrabModeAsync, GrabModeAsync, > + time); > ++ if (G_UNLIKELY (!display_x11->trusted_client && > ++ return_val == AlreadyGrabbed)) > ++ /* we can't grab the keyboard, but we can do a GTK-local grab */ > ++ return_val = GrabSuccess; > + } > + else > + return_val = AlreadyGrabbed; > + > + if (return_val == GrabSuccess) > + { > +- GdkDisplayX11 *display_x11 = GDK_DISPLAY_X11 > (gdk_drawable_get_display (window)); > + if (display_x11->keyboard_xgrab_window != NULL && > + display_x11->keyboard_xgrab_window != (GdkWindowObject *)window) > + generate_grab_broken_event (GDK_WINDOW > (display_x11->keyboard_xgrab_window), > Index: patches/patch-gdk_x11_gdkwindow-x11_c > =================================================================== > RCS file: patch-gdk_x11_gdkwindow-x11_c > diff -N patch-gdk_x11_gdkwindow-x11_c > --- /dev/null Sat Aug 30 18:16:59 1997 > +++ patches/patch-gdk_x11_gdkwindow-x11_c Sat Jun 10 12:57:43 2006 > @@ -0,0 +1,275 @@ > +$OpenBSD$ > +--- gdk/x11/gdkwindow-x11.c.orig Sun Apr 16 07:05:03 2006 > ++++ gdk/x11/gdkwindow-x11.c Sat Jun 10 14:37:24 2006 > +@@ -89,6 +89,7 @@ static void gdk_window_add_colormap_ > + static void set_wm_name (GdkDisplay *display, > + Window xwindow, > + const gchar *name); > ++static void move_to_current_desktop (GdkWindow *window); > + > + static GdkColormap* gdk_window_impl_x11_get_colormap (GdkDrawable > *drawable); > + static void gdk_window_impl_x11_set_colormap (GdkDrawable *drawable, > +@@ -761,6 +762,17 @@ gdk_window_new (GdkWindow *parent, > + else > + private->window_type = attributes->window_type; > + > ++ /* Work around a bug where Xorg refuses to map toplevel InputOnly windows > ++ * from an untrusted client: > http://bugs.freedesktop.org/show_bug.cgi?id=6988 > ++ */ > ++ if (attributes->wclass == GDK_INPUT_ONLY && > ++ GDK_WINDOW_TYPE (parent) == GDK_WINDOW_ROOT && > ++ !G_LIKELY (GDK_DISPLAY_X11 (GDK_WINDOW_DISPLAY > (parent))->trusted_client)) > ++ { > ++ g_warning ("Coercing GDK_INPUT_ONLY toplevel window to > GDK_INPUT_OUTPUT to work around bug in Xorg server"); > ++ attributes->wclass = GDK_INPUT_OUTPUT; > ++ } > ++ > + _gdk_window_init_position (GDK_WINDOW (private)); > + if (impl->position_info.big) > + private->guffaw_gravity = TRUE; > +@@ -2040,7 +2052,13 @@ gdk_x11_window_move_to_current_desktop ( > + > + if (toplevel->on_all_desktops) > + return; > ++ > ++ move_to_current_desktop (window); > ++} > + > ++static void > ++move_to_current_desktop (GdkWindow *window) > ++{ > + if (gdk_x11_screen_supports_net_wm_hint (GDK_WINDOW_SCREEN (window), > + gdk_atom_intern ("_NET_WM_DESKTOP", > FALSE))) > + { > +@@ -3374,6 +3392,8 @@ _gdk_windowing_get_pointer (GdkDisplay > + GdkModifierType *mask) > + { > + GdkScreen *default_screen; > ++ Display *xdisplay; > ++ Window xwindow; > + Window root = None; > + Window child; > + int rootx, rooty; > +@@ -3385,10 +3405,27 @@ _gdk_windowing_get_pointer (GdkDisplay > + return; > + > + default_screen = gdk_display_get_default_screen (display); > ++ > ++ xdisplay = GDK_SCREEN_XDISPLAY (default_screen); > ++ xwindow = GDK_SCREEN_XROOTWIN (default_screen); > + > +- XQueryPointer (GDK_SCREEN_XDISPLAY (default_screen), > +- GDK_SCREEN_XROOTWIN (default_screen), > +- &root, &child, &rootx, &rooty, &winx, &winy, &xmask); > ++ if (G_LIKELY (GDK_DISPLAY_X11 (display)->trusted_client)) > ++ { > ++ XQueryPointer (xdisplay, xwindow, > ++ &root, &child, &rootx, &rooty, &winx, &winy, &xmask); > ++ } > ++ else > ++ { > ++ XSetWindowAttributes attributes; > ++ Window w; > ++ > ++ w = XCreateWindow (xdisplay, xwindow, 0, 0, 1, 1, 0, > ++ CopyFromParent, InputOnly, CopyFromParent, > ++ 0, &attributes); > ++ XQueryPointer (xdisplay, w, > ++ &root, &child, &rootx, &rooty, &winx, &winy, &xmask); > ++ XDestroyWindow (xdisplay, w); > ++ } > + > + if (root != None) > + { > +@@ -3422,13 +3459,28 @@ _gdk_windowing_window_get_pointer (GdkDi > + _gdk_windowing_window_get_offsets (window, &xoffset, &yoffset); > + > + return_val = NULL; > +- if (!GDK_WINDOW_DESTROYED (window) && > +- XQueryPointer (GDK_WINDOW_XDISPLAY (window), > +- GDK_WINDOW_XID (window), > +- &root, &child, &rootx, &rooty, &winx, &winy, &xmask)) > ++ if (!GDK_WINDOW_DESTROYED (window)) > + { > +- if (child) > +- return_val = gdk_window_lookup_for_display (GDK_WINDOW_DISPLAY > (window), child); > ++ if (G_LIKELY (GDK_DISPLAY_X11 (display)->trusted_client)) > ++ { > ++ if (XQueryPointer (GDK_WINDOW_XDISPLAY (window), > ++ GDK_WINDOW_XID (window), > ++ &root, &child, &rootx, &rooty, &winx, &winy, > &xmask)) > ++ { > ++ if (child) > ++ return_val = gdk_window_lookup_for_display (GDK_WINDOW_DISPLAY > (window), child); > ++ } > ++ } > ++ else > ++ { > ++ GdkScreen *screen; > ++ int originx, originy; > ++ _gdk_windowing_get_pointer (gdk_drawable_get_display (window), > &screen, > ++ &rootx, &rooty, &xmask); > ++ gdk_window_get_origin (window, &originx, &originy); > ++ winx = rootx - originx; > ++ winy = rooty - originy; > ++ } > + } > + > + *x = winx + xoffset; > +@@ -3501,24 +3553,89 @@ _gdk_windowing_window_at_pointer (GdkDis > + * and the result. > + */ > + gdk_x11_display_grab (display); > +- XQueryPointer (xdisplay, xwindow, > +- &root, &child, &rootx, &rooty, &winx, &winy, &xmask); > +- > +- if (root == xwindow) > +- xwindow = child; > +- else > +- xwindow = root; > +- > +- while (xwindow) > ++ if (G_LIKELY (GDK_DISPLAY_X11 (display)->trusted_client)) > + { > +- xwindow_last = xwindow; > + XQueryPointer (xdisplay, xwindow, > +- &root, &xwindow, &rootx, &rooty, &winx, &winy, &xmask); > ++ &root, &child, &rootx, &rooty, &winx, &winy, &xmask); > ++ if (root == xwindow) > ++ xwindow = child; > ++ else > ++ xwindow = root; > ++ > ++ while (xwindow) > ++ { > ++ xwindow_last = xwindow; > ++ XQueryPointer (xdisplay, xwindow, > ++ &root, &xwindow, &rootx, &rooty, &winx, &winy, &xmask); > ++ } > ++ } > ++ else > ++ { > ++ gint i, screens, width, height; > ++ GList *toplevels, *list; > ++ Window pointer_window; > ++ > ++ pointer_window = None; > ++ screens = gdk_display_get_n_screens (display); > ++ for (i = 0; i < screens; ++i) { > ++ screen = gdk_display_get_screen (display, i); > ++ toplevels = gdk_screen_get_toplevel_windows (screen); > ++ for (list = toplevels; list != NULL; list = g_list_next (list)) { > ++ window = GDK_WINDOW (list->data); > ++ xwindow = GDK_WINDOW_XWINDOW (window); > ++ gdk_error_trap_push (); > ++ XQueryPointer (xdisplay, xwindow, > ++ &root, &child, &rootx, &rooty, &winx, &winy, &xmask); > ++ gdk_flush (); > ++ if (gdk_error_trap_pop ()) > ++ continue; > ++ if (child != None) > ++ { > ++ pointer_window = child; > ++ break; > ++ } > ++ gdk_window_get_geometry (window, NULL, NULL, &width, &height, NULL); > ++ if (winx >= 0 && winy >= 0 && winx < width && winy < height) > ++ { > ++ /* A childless toplevel, or below another window? */ > ++ XSetWindowAttributes attributes; > ++ Window w; > ++ > ++ w = XCreateWindow (xdisplay, xwindow, winx, winy, 1, 1, 0, > ++ CopyFromParent, InputOnly, CopyFromParent, > ++ 0, &attributes); > ++ XMapWindow (xdisplay, w); > ++ XQueryPointer (xdisplay, xwindow, > ++ &root, &child, &rootx, &rooty, &winx, &winy, > &xmask); > ++ XDestroyWindow (xdisplay, w); > ++ if (child == w) > ++ { > ++ pointer_window = xwindow; > ++ break; > ++ } > ++ } > ++ } > ++ g_list_free (toplevels); > ++ if (pointer_window != None) > ++ break; > ++ } > ++ xwindow = pointer_window; > ++ > ++ while (xwindow) > ++ { > ++ xwindow_last = xwindow; > ++ gdk_error_trap_push (); > ++ XQueryPointer (xdisplay, xwindow, > ++ &root, &xwindow, &rootx, &rooty, &winx, &winy, &xmask); > ++ gdk_flush (); > ++ if (gdk_error_trap_pop ()) > ++ break; > ++ } > + } > ++ > + gdk_x11_display_ungrab (display); > + > +- window = gdk_window_lookup_for_display (GDK_SCREEN_DISPLAY(screen), > +- xwindow_last); > ++ window = gdk_window_lookup_for_display (display, xwindow_last); > + *win_x = window ? winx : -1; > + *win_y = window ? winy : -1; > + > +@@ -4353,52 +4470,12 @@ gdk_window_unstick (GdkWindow *window) > + > + if (GDK_WINDOW_IS_MAPPED (window)) > + { > +- XEvent xev; > +- Atom type; > +- gint format; > +- gulong nitems; > +- gulong bytes_after; > +- guchar *data; > +- gulong *current_desktop; > +- GdkDisplay *display = gdk_drawable_get_display (window); > +- > + /* Request unstick from viewport */ > + gdk_wmspec_change_state (FALSE, window, > + gdk_atom_intern ("_NET_WM_STATE_STICKY", FALSE), > + NULL); > + > +- /* Get current desktop, then set it; this is a race, but not > +- * one that matters much in practice. > +- */ > +- XGetWindowProperty (GDK_DISPLAY_XDISPLAY (display), > GDK_WINDOW_XROOTWIN (window), > +- gdk_x11_get_xatom_by_name_for_display (display, > "_NET_CURRENT_DESKTOP"), > +- 0, G_MAXLONG, > +- False, XA_CARDINAL, &type, &format, &nitems, > +- &bytes_after, &data); > +- > +- if (type == XA_CARDINAL) > +- { > +- current_desktop = (gulong *)data; > +- > +- xev.xclient.type = ClientMessage; > +- xev.xclient.serial = 0; > +- xev.xclient.send_event = True; > +- xev.xclient.window = GDK_WINDOW_XWINDOW (window); > +- xev.xclient.message_type = gdk_x11_get_xatom_by_name_for_display > (display, "_NET_WM_DESKTOP"); > +- xev.xclient.format = 32; > +- > +- xev.xclient.data.l[0] = *current_desktop; > +- xev.xclient.data.l[1] = 0; > +- xev.xclient.data.l[2] = 0; > +- xev.xclient.data.l[3] = 0; > +- xev.xclient.data.l[4] = 0; > +- > +- XSendEvent (GDK_DISPLAY_XDISPLAY (display), GDK_WINDOW_XROOTWIN > (window), False, > +- SubstructureRedirectMask | SubstructureNotifyMask, > +- &xev); > +- > +- XFree (current_desktop); > +- } > ++ move_to_current_desktop (window); > + } > + else > + { > Index: patches/patch-gtk_gtkcolorsel_c > =================================================================== > RCS file: patch-gtk_gtkcolorsel_c > diff -N patch-gtk_gtkcolorsel_c > --- /dev/null Sat Aug 30 18:16:59 1997 > +++ patches/patch-gtk_gtkcolorsel_c Sat Jun 10 12:57:43 2006 > @@ -0,0 +1,35 @@ > +$OpenBSD$ > +--- gtk/gtkcolorsel.c.orig Sat Jun 25 09:09:58 2005 > ++++ gtk/gtkcolorsel.c Sat Jun 10 14:32:20 2006 > +@@ -1227,6 +1227,17 @@ grab_color_at_mouse (GdkScreen *screen, > + priv = colorsel->private_data; > + > + image = gdk_drawable_get_image (root_window, x_root, y_root, 1, 1); > ++ if (!image) > ++ { > ++ gint x, y; > ++ GdkDisplay *display = gdk_screen_get_display (screen); > ++ GdkWindow *window = gdk_display_get_window_at_pointer (display, &x, > &y); > ++ if (!window) > ++ return; > ++ image = gdk_drawable_get_image (window, x, y, 1, 1); > ++ if (!image) > ++ return; > ++ } > + pixel = gdk_image_get_pixel (image, 0, 0); > + g_object_unref (image); > + > +@@ -1436,11 +1447,11 @@ get_screen_color (GtkWidget *button) > + gtk_widget_add_events (priv->dropper_grab_widget, > + GDK_BUTTON_RELEASE_MASK | > GDK_BUTTON_PRESS_MASK | GDK_POINTER_MOTION_MASK); > + > ++ gtk_widget_set_parent_window (priv->dropper_grab_widget, > ++ GTK_WIDGET (colorsel)->window); > + gtk_widget_show (priv->dropper_grab_widget); > + > + gdk_window_set_user_data (priv->dropper_grab_widget->window, > colorsel); > +- gdk_window_reparent (priv->dropper_grab_widget->window, > +- GTK_WIDGET (colorsel)->window, 0, 0); > + } > + > + if (gdk_keyboard_grab (priv->dropper_grab_widget->window, > Index: patches/patch-gtk_gtkinvisible_c > =================================================================== > RCS file: patch-gtk_gtkinvisible_c > diff -N patch-gtk_gtkinvisible_c > --- /dev/null Sat Aug 30 18:16:59 1997 > +++ patches/patch-gtk_gtkinvisible_c Sat Jun 10 12:57:43 2006 > @@ -0,0 +1,30 @@ > +$OpenBSD$ > +--- gtk/gtkinvisible.c.orig Tue Mar 22 03:14:55 2005 > ++++ gtk/gtkinvisible.c Sat Jun 10 14:32:20 2006 > +@@ -246,11 +246,16 @@ gtk_invisible_get_screen (GtkInvisible * > + static void > + gtk_invisible_realize (GtkWidget *widget) > + { > ++ GdkWindow *parent; > + GdkWindowAttr attributes; > + gint attributes_mask; > + > + GTK_WIDGET_SET_FLAGS (widget, GTK_REALIZED); > + > ++ parent = gtk_widget_get_parent_window (widget); > ++ if (parent == NULL) > ++ parent = gtk_widget_get_root_window (widget); > ++ > + attributes.x = -100; > + attributes.y = -100; > + attributes.width = 10; > +@@ -262,8 +267,7 @@ gtk_invisible_realize (GtkWidget *widget > + > + attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_NOREDIR; > + > +- widget->window = gdk_window_new (gtk_widget_get_root_window (widget), > +- &attributes, attributes_mask); > ++ widget->window = gdk_window_new (parent, &attributes, attributes_mask); > + > + gdk_window_set_user_data (widget->window, widget); > + > Index: patches/patch-gtk_gtkwidget_c > =================================================================== > RCS file: patch-gtk_gtkwidget_c > diff -N patch-gtk_gtkwidget_c > --- /dev/null Sat Aug 30 18:16:59 1997 > +++ patches/patch-gtk_gtkwidget_c Sat Jun 10 12:57:43 2006 > @@ -0,0 +1,17 @@ > +$OpenBSD$ > +--- gtk/gtkwidget.c.orig Sat Apr 29 08:58:25 2006 > ++++ gtk/gtkwidget.c Sat Jun 10 14:32:20 2006 > +@@ -5616,11 +5616,11 @@ gtk_widget_get_parent_window (GtkWidge > + GdkWindow *parent_window; > + > + g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL); > +- g_return_val_if_fail (widget->parent != NULL, NULL); > + > + parent_window = g_object_get_qdata (G_OBJECT (widget), > quark_parent_window); > + > +- return (parent_window != NULL) ? parent_window : widget->parent->window; > ++ return (parent_window != NULL) ? parent_window : > ++ (widget->parent != NULL) ? widget->parent->window : NULL; > + } > + > + /** > > Disclaimer: http://www.kuleuven.be/cwis/email_disclaimer.htm