Make gdk_window_present() move the window to the current desktop, instead

2005-07-11  Matthias Clasen  <mclasen@redhat.com>

	Make gdk_window_present() move the window to the current
	desktop, instead of letting the WM change the current
	desktop to where the window is.  (#166379, Elijah Newren)

	* gdk/gdk.symbols:
	* gdk/x11/gdkx.h:
	* gdk/x11/gdkwindow-x11.c (gdk_x11_window_move_to_current_desktop):
	New function to move a window to the current desktop.

	* gtk/gtkwindow.c (gtk_window_present_with_time): Move the
	window to the current desktop before giving it focus.
This commit is contained in:
Matthias Clasen 2005-07-11 18:28:23 +00:00 committed by Matthias Clasen
parent 13a341e0e9
commit e5f444e9a8
7 changed files with 133 additions and 23 deletions

View File

@ -1,3 +1,17 @@
2005-07-11 Matthias Clasen <mclasen@redhat.com>
Make gdk_window_present() move the window to the current
desktop, instead of letting the WM change the current
desktop to where the window is. (#166379, Elijah Newren)
* gdk/gdk.symbols:
* gdk/x11/gdkx.h:
* gdk/x11/gdkwindow-x11.c (gdk_x11_window_move_to_current_desktop):
New function to move a window to the current desktop.
* gtk/gtkwindow.c (gtk_window_present_with_time): Move the
window to the current desktop before giving it focus.
2005-07-11 Matthias Clasen <mclasen@redhat.com>
When dragging text, use a drag icon showing the (ellipsized)

View File

@ -1,3 +1,17 @@
2005-07-11 Matthias Clasen <mclasen@redhat.com>
Make gdk_window_present() move the window to the current
desktop, instead of letting the WM change the current
desktop to where the window is. (#166379, Elijah Newren)
* gdk/gdk.symbols:
* gdk/x11/gdkx.h:
* gdk/x11/gdkwindow-x11.c (gdk_x11_window_move_to_current_desktop):
New function to move a window to the current desktop.
* gtk/gtkwindow.c (gtk_window_present_with_time): Move the
window to the current desktop before giving it focus.
2005-07-11 Matthias Clasen <mclasen@redhat.com>
When dragging text, use a drag icon showing the (ellipsized)

View File

@ -1,3 +1,17 @@
2005-07-11 Matthias Clasen <mclasen@redhat.com>
Make gdk_window_present() move the window to the current
desktop, instead of letting the WM change the current
desktop to where the window is. (#166379, Elijah Newren)
* gdk/gdk.symbols:
* gdk/x11/gdkx.h:
* gdk/x11/gdkwindow-x11.c (gdk_x11_window_move_to_current_desktop):
New function to move a window to the current desktop.
* gtk/gtkwindow.c (gtk_window_present_with_time): Move the
window to the current desktop before giving it focus.
2005-07-11 Matthias Clasen <mclasen@redhat.com>
When dragging text, use a drag icon showing the (ellipsized)

View File

@ -1181,6 +1181,7 @@ gdkx_visual_get
#if IN_FILE(__GDK_WINDOW_X11_C__)
gdk_x11_window_set_user_time
gdk_x11_window_move_to_current_desktop
#endif
#if IN_FILE(__GDK_XID_C__)

View File

@ -2020,14 +2020,79 @@ gdk_window_lower (GdkWindow *window)
XLowerWindow (GDK_WINDOW_XDISPLAY (window), GDK_WINDOW_XID (window));
}
/**
* gdk_x11_window_move_to_current_desktop:
* @window: a #GdkWindow
*
* Moves the window to the correct workspace when running under a
* window manager that supports multiple workspaces, as described
* in the <ulink url="http://www.freedesktop.org/Standards/wm-spec">Extended
* Window Manager Hints</ulink>.
*
* Since: 2.8
*/
void
gdk_x11_window_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)))
{
XEvent xev;
Atom type;
gint format;
gulong nitems;
gulong bytes_after;
guchar *data;
gulong *current_desktop;
GdkDisplay *display;
display = gdk_drawable_get_display (window);
/* 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);
}
}
}
/**
* gdk_window_focus:
* @window: a #GdkWindow
* @timestamp: timestamp of the event triggering the window focus
*
* Sets keyboard focus to @window. If @window is not onscreen this
* will not work. In most cases, gtk_window_present() should be used on
* a #GtkWindow, rather than calling this function.
* Sets keyboard focus to @window. In most cases, gtk_window_present()
* should be used on a #GtkWindow, rather than calling this function.
*
**/
void
@ -5785,9 +5850,8 @@ emulate_move_drag (GdkWindow *window,
* Begins a window resize operation (for a toplevel window).
* You might use this function to implement a "window resize grip," for
* example; in fact #GtkStatusbar uses it. The function works best
* with window managers that support the Extended Window Manager Hints spec
* (see http://www.freedesktop.org), but has a fallback implementation
* for other window managers.
* with window managers that support the <ulink url="http://www.freedesktop.org/Standards/wm-spec">Extended Window Manager Hints</ulink>, but has a
* fallback implementation for other window managers.
*
**/
void
@ -5821,8 +5885,8 @@ gdk_window_begin_resize_drag (GdkWindow *window,
* Begins a window move operation (for a toplevel window). You might
* use this function to implement a "window move grip," for
* example. The function works best with window managers that support
* the Extended Window Manager Hints spec (see
* http://www.freedesktop.org), but has a fallback implementation for
* the <ulink url="http://www.freedesktop.org/Standards/wm-spec">Extended
* Window Manager Hints</ulink>, but has a fallback implementation for
* other window managers.
*
**/

View File

@ -55,6 +55,7 @@ Screen * gdk_x11_screen_get_xscreen (GdkScreen *screen);
int gdk_x11_screen_get_screen_number (GdkScreen *screen);
void gdk_x11_window_set_user_time (GdkWindow *window,
guint32 timestamp);
void gdk_x11_window_move_to_current_desktop (GdkWindow *window);
const char* gdk_x11_screen_get_window_manager_name (GdkScreen *screen);
@ -154,7 +155,6 @@ gpointer gdk_xid_table_lookup (XID xid);
gboolean gdk_net_wm_supports (GdkAtom property);
void gdk_x11_grab_server (void);
void gdk_x11_ungrab_server (void);
#endif
GdkDisplay *gdk_x11_lookup_xdisplay (Display *xdisplay);

View File

@ -6007,17 +6007,7 @@ gtk_window_set_frame_dimensions (GtkWindow *window,
void
gtk_window_present (GtkWindow *window)
{
guint32 timestamp;
#ifdef GDK_WINDOWING_X11
GdkDisplay *display;
display = gtk_widget_get_display (GTK_WIDGET (window));
timestamp = gdk_x11_display_get_user_time (display);
#else
timestamp = gtk_get_current_event_time ();
#endif
gtk_window_present_with_time (window, timestamp);
gtk_window_present_with_time (window, GDK_CURRENT_TIME);
}
/**
@ -6048,9 +6038,22 @@ gtk_window_present_with_time (GtkWindow *window,
gdk_window_show (widget->window);
/* note that gdk_window_focus() will also move the window to
* the current desktop, for WM spec compliant window managers.
*/
/* Translate a timestamp of GDK_CURRENT_TIME appropriately */
if (timestamp == GDK_CURRENT_TIME)
{
#ifdef GDK_WINDOWING_X11
GdkDisplay *display;
display = gtk_widget_get_display (GTK_WIDGET (window));
timestamp = gdk_x11_display_get_user_time (display);
#else
timestamp = gtk_get_current_event_time ();
#endif
}
#ifdef GDK_WINDOWING_X11
gdk_x11_window_move_to_current_desktop (widget->window);
#endif
gdk_window_focus (widget->window, timestamp);
}
else