diff options
-rw-r--r-- | ChangeLog | 20 | ||||
-rw-r--r-- | ChangeLog.pre-2-10 | 20 | ||||
-rw-r--r-- | ChangeLog.pre-2-4 | 20 | ||||
-rw-r--r-- | ChangeLog.pre-2-6 | 20 | ||||
-rw-r--r-- | ChangeLog.pre-2-8 | 20 | ||||
-rw-r--r-- | docs/reference/ChangeLog | 9 | ||||
-rw-r--r-- | docs/reference/gdk/gdk-sections.txt | 2 | ||||
-rw-r--r-- | docs/reference/gdk/tmpl/event_structs.sgml | 4 | ||||
-rw-r--r-- | docs/reference/gtk/gtk-sections.txt | 2 | ||||
-rw-r--r-- | gdk/gdk.def | 2 | ||||
-rw-r--r-- | gdk/gdkevents.h | 4 | ||||
-rw-r--r-- | gdk/gdkwindow.h | 4 | ||||
-rw-r--r-- | gdk/x11/gdkwindow-x11.c | 71 | ||||
-rwxr-xr-x | gtk/gtk.def | 2 | ||||
-rw-r--r-- | gtk/gtkwindow.c | 107 | ||||
-rw-r--r-- | gtk/gtkwindow.h | 4 | ||||
-rw-r--r-- | tests/testgtk.c | 50 |
17 files changed, 357 insertions, 4 deletions
@@ -1,5 +1,25 @@ 2003-08-11 Matthias Clasen <maclas@gmx.de> + Add support for EWMH "Above" and "Below" window states. (105100, Manuel Clos) + + * tests/testgtk.c: Add "Above" and "Below" to the the "Window State" demo. + + * gtk/gtkwindow.h: Add gtk_window_set_keep_above and gtk_window_set_keep_below. + + * gtk/gtk.def: Add gtk_window_set_keep_above and gtk_window_set_keep_below. + + * gtk/gtkwindow.c (gtk_window_set_keep_below): + (gtk_window_set_keep_above): New functions, call the corresponding gdk functions. + + * gdk/x11/gdkwindow-x11.c (gdk_window_set_keep_below): New function, sets _NET_WM_STATE_BELOW. + (gdk_window_set_keep_above): New function, sets _NET_WM_STATE_ABOVE. + + * gdk/gdkwindow.h: Add gdk_window_set_keep_above and gdk_window_set_keep_below. + + * gdk/gdkevents.h (GdkWindowState): Add GDK_WINDOW_STATE_ABOVE and GDK_WINDOW_STATE_BELOW. + + * gdk/gdk.def: Add gdk_window_set_keep_above and gdk_window_set_keep_below. + * acinclude.m4: Copy newer versions of JH_CHECK_XML_CATALOG and JH_PATH_XML_CATALOG from gtk-doc to enable configuring without xmlcatalog in PATH. (#119115) diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index c4e7bd1c00..316f554b34 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,5 +1,25 @@ 2003-08-11 Matthias Clasen <maclas@gmx.de> + Add support for EWMH "Above" and "Below" window states. (105100, Manuel Clos) + + * tests/testgtk.c: Add "Above" and "Below" to the the "Window State" demo. + + * gtk/gtkwindow.h: Add gtk_window_set_keep_above and gtk_window_set_keep_below. + + * gtk/gtk.def: Add gtk_window_set_keep_above and gtk_window_set_keep_below. + + * gtk/gtkwindow.c (gtk_window_set_keep_below): + (gtk_window_set_keep_above): New functions, call the corresponding gdk functions. + + * gdk/x11/gdkwindow-x11.c (gdk_window_set_keep_below): New function, sets _NET_WM_STATE_BELOW. + (gdk_window_set_keep_above): New function, sets _NET_WM_STATE_ABOVE. + + * gdk/gdkwindow.h: Add gdk_window_set_keep_above and gdk_window_set_keep_below. + + * gdk/gdkevents.h (GdkWindowState): Add GDK_WINDOW_STATE_ABOVE and GDK_WINDOW_STATE_BELOW. + + * gdk/gdk.def: Add gdk_window_set_keep_above and gdk_window_set_keep_below. + * acinclude.m4: Copy newer versions of JH_CHECK_XML_CATALOG and JH_PATH_XML_CATALOG from gtk-doc to enable configuring without xmlcatalog in PATH. (#119115) diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4 index c4e7bd1c00..316f554b34 100644 --- a/ChangeLog.pre-2-4 +++ b/ChangeLog.pre-2-4 @@ -1,5 +1,25 @@ 2003-08-11 Matthias Clasen <maclas@gmx.de> + Add support for EWMH "Above" and "Below" window states. (105100, Manuel Clos) + + * tests/testgtk.c: Add "Above" and "Below" to the the "Window State" demo. + + * gtk/gtkwindow.h: Add gtk_window_set_keep_above and gtk_window_set_keep_below. + + * gtk/gtk.def: Add gtk_window_set_keep_above and gtk_window_set_keep_below. + + * gtk/gtkwindow.c (gtk_window_set_keep_below): + (gtk_window_set_keep_above): New functions, call the corresponding gdk functions. + + * gdk/x11/gdkwindow-x11.c (gdk_window_set_keep_below): New function, sets _NET_WM_STATE_BELOW. + (gdk_window_set_keep_above): New function, sets _NET_WM_STATE_ABOVE. + + * gdk/gdkwindow.h: Add gdk_window_set_keep_above and gdk_window_set_keep_below. + + * gdk/gdkevents.h (GdkWindowState): Add GDK_WINDOW_STATE_ABOVE and GDK_WINDOW_STATE_BELOW. + + * gdk/gdk.def: Add gdk_window_set_keep_above and gdk_window_set_keep_below. + * acinclude.m4: Copy newer versions of JH_CHECK_XML_CATALOG and JH_PATH_XML_CATALOG from gtk-doc to enable configuring without xmlcatalog in PATH. (#119115) diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6 index c4e7bd1c00..316f554b34 100644 --- a/ChangeLog.pre-2-6 +++ b/ChangeLog.pre-2-6 @@ -1,5 +1,25 @@ 2003-08-11 Matthias Clasen <maclas@gmx.de> + Add support for EWMH "Above" and "Below" window states. (105100, Manuel Clos) + + * tests/testgtk.c: Add "Above" and "Below" to the the "Window State" demo. + + * gtk/gtkwindow.h: Add gtk_window_set_keep_above and gtk_window_set_keep_below. + + * gtk/gtk.def: Add gtk_window_set_keep_above and gtk_window_set_keep_below. + + * gtk/gtkwindow.c (gtk_window_set_keep_below): + (gtk_window_set_keep_above): New functions, call the corresponding gdk functions. + + * gdk/x11/gdkwindow-x11.c (gdk_window_set_keep_below): New function, sets _NET_WM_STATE_BELOW. + (gdk_window_set_keep_above): New function, sets _NET_WM_STATE_ABOVE. + + * gdk/gdkwindow.h: Add gdk_window_set_keep_above and gdk_window_set_keep_below. + + * gdk/gdkevents.h (GdkWindowState): Add GDK_WINDOW_STATE_ABOVE and GDK_WINDOW_STATE_BELOW. + + * gdk/gdk.def: Add gdk_window_set_keep_above and gdk_window_set_keep_below. + * acinclude.m4: Copy newer versions of JH_CHECK_XML_CATALOG and JH_PATH_XML_CATALOG from gtk-doc to enable configuring without xmlcatalog in PATH. (#119115) diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index c4e7bd1c00..316f554b34 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,5 +1,25 @@ 2003-08-11 Matthias Clasen <maclas@gmx.de> + Add support for EWMH "Above" and "Below" window states. (105100, Manuel Clos) + + * tests/testgtk.c: Add "Above" and "Below" to the the "Window State" demo. + + * gtk/gtkwindow.h: Add gtk_window_set_keep_above and gtk_window_set_keep_below. + + * gtk/gtk.def: Add gtk_window_set_keep_above and gtk_window_set_keep_below. + + * gtk/gtkwindow.c (gtk_window_set_keep_below): + (gtk_window_set_keep_above): New functions, call the corresponding gdk functions. + + * gdk/x11/gdkwindow-x11.c (gdk_window_set_keep_below): New function, sets _NET_WM_STATE_BELOW. + (gdk_window_set_keep_above): New function, sets _NET_WM_STATE_ABOVE. + + * gdk/gdkwindow.h: Add gdk_window_set_keep_above and gdk_window_set_keep_below. + + * gdk/gdkevents.h (GdkWindowState): Add GDK_WINDOW_STATE_ABOVE and GDK_WINDOW_STATE_BELOW. + + * gdk/gdk.def: Add gdk_window_set_keep_above and gdk_window_set_keep_below. + * acinclude.m4: Copy newer versions of JH_CHECK_XML_CATALOG and JH_PATH_XML_CATALOG from gtk-doc to enable configuring without xmlcatalog in PATH. (#119115) diff --git a/docs/reference/ChangeLog b/docs/reference/ChangeLog index a9b3902768..929743dd02 100644 --- a/docs/reference/ChangeLog +++ b/docs/reference/ChangeLog @@ -1,3 +1,12 @@ +2003-08-11 Matthias Clasen <maclas@gmx.de> + + * gdk/gdk-sections.txt: Add gdk_window_set_keep_above and gdk_window_set_keep_below. + + * gtk/gtk-sections.txt: Add gtk_window_set_keep_above and gtk_window_set_keep_below. + + * gdk/tmpl/event_structs.sgml: Document GDK_WINDOW_STATE_FULLSCREEN, + GDK_WINDOW_STATE_ABOVE and GDK_WINDOW_STATE_BELOW. + 2003-08-10 Matthias Clasen <maclas@gmx.de> * gtk/tmpl/gtkwidget.sgml: Document public GtkWidget members. (#119463) diff --git a/docs/reference/gdk/gdk-sections.txt b/docs/reference/gdk/gdk-sections.txt index e3a6c7eed2..3082aad420 100644 --- a/docs/reference/gdk/gdk-sections.txt +++ b/docs/reference/gdk/gdk-sections.txt @@ -614,6 +614,8 @@ gdk_window_maximize gdk_window_unmaximize gdk_window_fullscreen gdk_window_unfullscreen +gdk_window_set_keep_above +gdk_window_set_keep_below gdk_window_move gdk_window_resize gdk_window_move_resize diff --git a/docs/reference/gdk/tmpl/event_structs.sgml b/docs/reference/gdk/tmpl/event_structs.sgml index e993cfd2db..9767a81f09 100644 --- a/docs/reference/gdk/tmpl/event_structs.sgml +++ b/docs/reference/gdk/tmpl/event_structs.sgml @@ -471,7 +471,9 @@ Specifies the state of a toplevel window. @GDK_WINDOW_STATE_ICONIFIED: the window is minimized. @GDK_WINDOW_STATE_MAXIMIZED: the window is maximized. @GDK_WINDOW_STATE_STICKY: the window is sticky. -@GDK_WINDOW_STATE_FULLSCREEN: +@GDK_WINDOW_STATE_FULLSCREEN: the window is maximized without decorations. +@GDK_WINDOW_STATE_ABOVE: the window is kept above other windows. +@GDK_WINDOW_STATE_BELOW: the window is kept below other windows. <!-- ##### ENUM GdkSettingAction ##### --> <para> diff --git a/docs/reference/gtk/gtk-sections.txt b/docs/reference/gtk/gtk-sections.txt index d5463404df..c3908a4ead 100644 --- a/docs/reference/gtk/gtk-sections.txt +++ b/docs/reference/gtk/gtk-sections.txt @@ -3952,6 +3952,8 @@ gtk_window_maximize gtk_window_unmaximize gtk_window_fullscreen gtk_window_unfullscreen +gtk_window_set_keep_above +gtk_window_set_keep_below gtk_window_begin_resize_drag gtk_window_begin_move_drag gtk_window_set_decorated diff --git a/gdk/gdk.def b/gdk/gdk.def index 01901f788d..280da60ba1 100644 --- a/gdk/gdk.def +++ b/gdk/gdk.def @@ -521,6 +521,8 @@ EXPORTS gdk_window_set_icon gdk_window_set_icon_list gdk_window_set_icon_name + gdk_window_set_keep_above + gdk_window_set_keep_below gdk_window_set_modal_hint gdk_window_set_override_redirect gdk_window_set_role diff --git a/gdk/gdkevents.h b/gdk/gdkevents.h index c4dbf51c60..e7cafb9130 100644 --- a/gdk/gdkevents.h +++ b/gdk/gdkevents.h @@ -207,7 +207,9 @@ typedef enum GDK_WINDOW_STATE_ICONIFIED = 1 << 1, GDK_WINDOW_STATE_MAXIMIZED = 1 << 2, GDK_WINDOW_STATE_STICKY = 1 << 3, - GDK_WINDOW_STATE_FULLSCREEN = 1 << 4 + GDK_WINDOW_STATE_FULLSCREEN = 1 << 4, + GDK_WINDOW_STATE_ABOVE = 1 << 5, + GDK_WINDOW_STATE_BELOW = 1 << 6 } GdkWindowState; typedef enum diff --git a/gdk/gdkwindow.h b/gdk/gdkwindow.h index f8f944b44a..0c60f21d2a 100644 --- a/gdk/gdkwindow.h +++ b/gdk/gdkwindow.h @@ -502,6 +502,10 @@ void gdk_window_maximize (GdkWindow *window); void gdk_window_unmaximize (GdkWindow *window); void gdk_window_fullscreen (GdkWindow *window); void gdk_window_unfullscreen (GdkWindow *window); +void gdk_window_set_keep_above (GdkWindow *window, + gboolean setting); +void gdk_window_set_keep_below (GdkWindow *window, + gboolean setting); void gdk_window_register_dnd (GdkWindow *window); diff --git a/gdk/x11/gdkwindow-x11.c b/gdk/x11/gdkwindow-x11.c index bf098e1e15..ce7804b3af 100644 --- a/gdk/x11/gdkwindow-x11.c +++ b/gdk/x11/gdkwindow-x11.c @@ -3792,6 +3792,77 @@ gdk_window_unfullscreen (GdkWindow *window) 0); } +/** + * gdk_window_set_keep_above: + * @window: a toplevel #GdkWindow + * @setting: whether to keep @window above other windows + * + * Set if @window must be kept above other windows. If the + * window was already above, then this function does nothing. + * + * On X11, asks the window manager to keep @window above, if the window + * manager supports this operation. Not all window managers support + * this, and some deliberately ignore it or don't have a concept of + * "keep above"; so you can't rely on the window being kept above. + * But it will happen with most standard window managers, + * and GDK makes a best effort to get it to happen. + * + * Since: 2.4 + **/ +void +gdk_window_set_keep_above (GdkWindow *window, gboolean setting) +{ + g_return_if_fail (GDK_IS_WINDOW (window)); + + if (GDK_WINDOW_DESTROYED (window)) + return; + + if (GDK_WINDOW_IS_MAPPED (window)) + gdk_wmspec_change_state (setting, window, + gdk_atom_intern ("_NET_WM_STATE_ABOVE", setting), + setting ? gdk_atom_intern ("_NET_WM_STATE_BELOW", FALSE) + : GDK_NONE); + else + gdk_synthesize_window_state (window, + setting ? GDK_WINDOW_STATE_BELOW : GDK_WINDOW_STATE_ABOVE, + setting ? GDK_WINDOW_STATE_ABOVE : 0); +} + +/** + * gdk_window_set_keep_below: + * @window: a toplevel #GdkWindow + * @setting: whether to keep @window below other windows + * + * Set if @window must be kept below other windows. If the + * window was already below, then this function does nothing. + * + * On X11, asks the window manager to keep @window below, if the window + * manager supports this operation. Not all window managers support + * this, and some deliberately ignore it or don't have a concept of + * "keep below"; so you can't rely on the window being kept below. + * But it will happen with most standard window managers, + * and GDK makes a best effort to get it to happen. + * + * Since: 2.4 + **/ +void +gdk_window_set_keep_below (GdkWindow *window, gboolean setting) +{ + g_return_if_fail (GDK_IS_WINDOW (window)); + + if (GDK_WINDOW_DESTROYED (window)) + return; + + if (GDK_WINDOW_IS_MAPPED (window)) + gdk_wmspec_change_state (setting, window, + gdk_atom_intern ("_NET_WM_STATE_BELOW", setting), + setting ? gdk_atom_intern ("_NET_WM_STATE_ABOVE", FALSE) + : GDK_NONE); + else + gdk_synthesize_window_state (window, + setting ? GDK_WINDOW_STATE_ABOVE : GDK_WINDOW_STATE_BELOW, + setting ? GDK_WINDOW_STATE_BELOW : 0); +} /** * gdk_window_set_group: diff --git a/gtk/gtk.def b/gtk/gtk.def index 9f19793c42..0b8f330a52 100755 --- a/gtk/gtk.def +++ b/gtk/gtk.def @@ -2367,6 +2367,8 @@ EXPORTS gtk_window_set_icon gtk_window_set_icon_from_file gtk_window_set_icon_list + gtk_window_set_keep_above + gtk_window_set_keep_below gtk_window_set_mnemonic_modifier gtk_window_set_modal gtk_window_set_policy diff --git a/gtk/gtkwindow.c b/gtk/gtkwindow.c index a44c299b12..a721b16858 100644 --- a/gtk/gtkwindow.c +++ b/gtk/gtkwindow.c @@ -3185,7 +3185,7 @@ gtk_window_get_size (GtkWindow *window, * <literal>gtk_window_move (window, gdk_screen_width () - window_width, * gdk_screen_height () - window_height)</literal>. * - * The extended window manager hints specification at <ulink + * The Extended Window Manager Hints specification at <ulink * url="http://www.freedesktop.org/standards/wm-spec.html"> * http://www.freedesktop.org/standards/wm-spec.html</ulink> has a * nice table of gravities in the "implementation notes" section. @@ -3671,6 +3671,10 @@ gtk_window_map (GtkWidget *widget) else gdk_window_unfullscreen (toplevel); + gdk_window_set_keep_above (toplevel, window->above_initially); + + gdk_window_set_keep_below (toplevel, window->below_initially); + /* No longer use the default settings */ window->need_default_size = FALSE; window->need_default_position = FALSE; @@ -3721,6 +3725,8 @@ gtk_window_unmap (GtkWidget *widget) window->iconify_initially = state & GDK_WINDOW_STATE_ICONIFIED; window->maximize_initially = state & GDK_WINDOW_STATE_MAXIMIZED; window->stick_initially = state & GDK_WINDOW_STATE_STICKY; + window->above_initially = state & GDK_WINDOW_STATE_ABOVE; + window->below_initially = state & GDK_WINDOW_STATE_BELOW; } static void @@ -5943,6 +5949,105 @@ gtk_window_unfullscreen (GtkWindow *window) gdk_window_unfullscreen (toplevel); } +/** + * gtk_window_set_keep_above: + * @window: a #GtkWindow + * @setting: whether to keep @window above other windows + * + * Asks to keep @window above, so that it stays on top. Note that + * you shouldn't assume the window is definitely above afterward, + * because other entities (e.g. the user or <link + * linkend="gtk-X11-arch">window manager</link>) could not keep it above, + * and not all window managers support keeping windows above. But + * normally the window will end kept above. Just don't write code + * that crashes if not. + * + * It's permitted to call this function before showing a window, + * in which case the window will be kept above when it appears onscreen + * initially. + * + * You can track the above state via the "window_state_event" signal + * on #GtkWidget. + * + * Note that, according to the <ulink + * url="http://www.freedesktop.org/standards/wm-spec.html">Extended Window Manager Hints</ulink> + * specification, the above state is mainly meant for user preferences and should not be used + * by applications e.g. for drawing attention to their dialogs. + * + * Since: 2.4 + **/ +void +gtk_window_set_keep_above (GtkWindow *window, gboolean setting) +{ + GtkWidget *widget; + GdkWindow *toplevel; + + g_return_if_fail (GTK_IS_WINDOW (window)); + + widget = GTK_WIDGET (window); + + window->above_initially = setting; + if (setting) + window->below_initially = FALSE; + + if (window->frame) + toplevel = window->frame; + else + toplevel = widget->window; + + if (toplevel != NULL) + gdk_window_set_keep_above (toplevel, setting); +} + +/** + * gtk_window_set_keep_below: + * @window: a #GtkWindow + * @setting: whether to keep @window below other windows + * + * Asks to keep @window below, so that it stays in bottom. Note that + * you shouldn't assume the window is definitely below afterward, + * because other entities (e.g. the user or <link + * linkend="gtk-X11-arch">window manager</link>) could not keep it below, + * and not all window managers support putting windows below. But + * normally the window will be kept below. Just don't write code + * that crashes if not. + * + * It's permitted to call this function before showing a window, + * in which case the window will be kept below when it appears onscreen + * initially. + * + * You can track the below state via the "window_state_event" signal + * on #GtkWidget. + * + * Note that, according to the <ulink + * url="http://www.freedesktop.org/standards/wm-spec.html">Extended Window Manager Hints</ulink> + * specification, the above state is mainly meant for user preferences and should not be used + * by applications e.g. for drawing attention to their dialogs. + * + * Since: 2.4 + **/ +void +gtk_window_set_keep_below (GtkWindow *window, gboolean setting) +{ + GtkWidget *widget; + GdkWindow *toplevel; + + g_return_if_fail (GTK_IS_WINDOW (window)); + + widget = GTK_WIDGET (window); + + window->below_initially = setting; + if (setting) + window->above_initially = FALSE; + + if (window->frame) + toplevel = window->frame; + else + toplevel = widget->window; + + if (toplevel != NULL) + gdk_window_set_keep_below (toplevel, setting); +} /** * gtk_window_set_resizable: diff --git a/gtk/gtkwindow.h b/gtk/gtkwindow.h index 1c982cb030..c0d984cf2f 100644 --- a/gtk/gtkwindow.h +++ b/gtk/gtkwindow.h @@ -96,6 +96,8 @@ struct _GtkWindow guint stick_initially : 1; guint maximize_initially : 1; guint decorated : 1; + guint above_initially : 1; + guint below_initially : 1; guint type_hint : 3; /* GdkWindowTypeHint */ guint gravity : 5; /* GdkGravity */ @@ -286,6 +288,8 @@ void gtk_window_maximize (GtkWindow *window); void gtk_window_unmaximize (GtkWindow *window); void gtk_window_fullscreen (GtkWindow *window); void gtk_window_unfullscreen (GtkWindow *window); +void gtk_window_set_keep_above (GtkWindow *window, gboolean setting); +void gtk_window_set_keep_below (GtkWindow *window, gboolean setting); void gtk_window_begin_resize_drag (GtkWindow *window, GdkWindowEdge edge, diff --git a/tests/testgtk.c b/tests/testgtk.c index 093aa6daab..5223415f04 100644 --- a/tests/testgtk.c +++ b/tests/testgtk.c @@ -9436,6 +9436,10 @@ window_state_callback (GtkWidget *widget, "maximized" : "not maximized", ", ", (event->new_window_state & GDK_WINDOW_STATE_FULLSCREEN) ? "fullscreen" : "not fullscreen", + (event->new_window_state & GDK_WINDOW_STATE_ABOVE) ? + "above" : "not above", ", ", + (event->new_window_state & GDK_WINDOW_STATE_BELOW) ? + "below" : "not below", ", ", NULL); gtk_label_set_text (GTK_LABEL (label), msg); @@ -9522,11 +9526,38 @@ tracking_label (GtkWidget *window) return hbox; } +void +keep_window_above (GtkToggleButton *togglebutton, gpointer data) +{ + GtkWidget *button = g_object_get_data (G_OBJECT (togglebutton), "radio"); + + gtk_window_set_keep_above (GTK_WINDOW (data), + gtk_toggle_button_get_active (togglebutton)); + + if (gtk_toggle_button_get_active (togglebutton)) + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), FALSE); +} + +void +keep_window_below (GtkToggleButton *togglebutton, gpointer data) +{ + GtkWidget *button = g_object_get_data (G_OBJECT (togglebutton), "radio"); + + gtk_window_set_keep_below (GTK_WINDOW (data), + gtk_toggle_button_get_active (togglebutton)); + + if (gtk_toggle_button_get_active (togglebutton)) + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), FALSE); +} + + static GtkWidget* get_state_controls (GtkWidget *window) { GtkWidget *vbox; GtkWidget *button; + GtkWidget *button_above; + GtkWidget *button_below; vbox = gtk_vbox_new (FALSE, 0); @@ -9585,7 +9616,24 @@ get_state_controls (GtkWidget *window) window, G_CONNECT_SWAPPED); gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0); - + + button_above = gtk_toggle_button_new_with_label ("Keep above"); + g_signal_connect (button_above, + "toggled", + G_CALLBACK (keep_window_above), + window); + gtk_box_pack_start (GTK_BOX (vbox), button_above, FALSE, FALSE, 0); + + button_below = gtk_toggle_button_new_with_label ("Keep below"); + g_signal_connect (button_below, + "toggled", + G_CALLBACK (keep_window_below), + window); + gtk_box_pack_start (GTK_BOX (vbox), button_below, FALSE, FALSE, 0); + + g_object_set_data (G_OBJECT (button_above), "radio", button_below); + g_object_set_data (G_OBJECT (button_below), "radio", button_above); + button = gtk_button_new_with_label ("Hide (withdraw)"); g_signal_connect_object (button, "clicked", |