diff options
author | Vincent Untz <vuntz@gnome.org> | 2007-07-07 09:22:25 +0000 |
---|---|---|
committer | Vincent Untz <vuntz@src.gnome.org> | 2007-07-07 09:22:25 +0000 |
commit | bedcb5785b7b0e6062307140208c582291141321 (patch) | |
tree | 901d3d2c77f3a0320d8288da13e15e99d900e15f | |
parent | e5abf682f930be6d1112c2ff415a216cc8ccf331 (diff) | |
download | libwnck-bedcb5785b7b0e6062307140208c582291141321.tar.gz |
Add wnck_window_is_below()/make_below()/unmake_below() Fix bug #453982.
2007-07-07 Vincent Untz <vuntz@gnome.org>
Add wnck_window_is_below()/make_below()/unmake_below()
Fix bug #453982.
* doc/libwnck-sections.txt:
* doc/tmpl/window.sgml: update doc
* libwnck/window.c: (wnck_window_init): init new field
(wnck_window_class_init): update doc
(wnck_window_is_below), (wnck_window_make_below),
(wnck_window_unmake_below): new
(update_state): handle below
* libwnck/window.h: updated
* libwnck/wnckprop.c: add --make-below and --unmake-below
(validate_options), (update_window): handle new options
(print_window): print below state, and add FIXME
svn path=/trunk/; revision=1395
-rw-r--r-- | doc/libwnck-sections.txt | 3 | ||||
-rw-r--r-- | doc/tmpl/window.sgml | 26 | ||||
-rw-r--r-- | libwnck/window.c | 74 | ||||
-rw-r--r-- | libwnck/window.h | 8 | ||||
-rw-r--r-- | libwnck/wnckprop.c | 12 |
5 files changed, 119 insertions, 4 deletions
diff --git a/doc/libwnck-sections.txt b/doc/libwnck-sections.txt index e73c35b..f0dfe4d 100644 --- a/doc/libwnck-sections.txt +++ b/doc/libwnck-sections.txt @@ -37,6 +37,7 @@ wnck_window_is_shaded wnck_window_is_pinned wnck_window_is_sticky wnck_window_is_above +wnck_window_is_below wnck_window_is_skip_pager wnck_window_is_skip_tasklist wnck_window_is_fullscreen @@ -60,6 +61,8 @@ wnck_window_stick wnck_window_unstick wnck_window_make_above wnck_window_unmake_above +wnck_window_make_below +wnck_window_unmake_below wnck_window_set_skip_pager wnck_window_set_skip_tasklist wnck_window_set_fullscreen diff --git a/doc/tmpl/window.sgml b/doc/tmpl/window.sgml index f1c776c..343cb77 100644 --- a/doc/tmpl/window.sgml +++ b/doc/tmpl/window.sgml @@ -289,6 +289,7 @@ WnckWindow @WNCK_WINDOW_STATE_DEMANDS_ATTENTION: @WNCK_WINDOW_STATE_URGENT: @WNCK_WINDOW_STATE_ABOVE: +@WNCK_WINDOW_STATE_BELOW: <!-- ##### FUNCTION wnck_window_get_state ##### --> <para> @@ -371,6 +372,15 @@ WnckWindow @Returns: +<!-- ##### FUNCTION wnck_window_is_below ##### --> +<para> + +</para> + +@window: +@Returns: + + <!-- ##### FUNCTION wnck_window_is_skip_pager ##### --> <para> @@ -579,6 +589,22 @@ WnckWindow @window: +<!-- ##### FUNCTION wnck_window_make_below ##### --> +<para> + +</para> + +@window: + + +<!-- ##### FUNCTION wnck_window_unmake_below ##### --> +<para> + +</para> + +@window: + + <!-- ##### FUNCTION wnck_window_set_skip_pager ##### --> <para> diff --git a/libwnck/window.c b/libwnck/window.c index 122fdd2..6d7b2fe 100644 --- a/libwnck/window.c +++ b/libwnck/window.c @@ -66,7 +66,8 @@ static GHashTable *window_hash = NULL; ((window)->priv->is_fullscreen << 8) | \ ((window)->priv->demands_attention << 9) | \ ((window)->priv->is_urgent << 10)| \ - ((window)->priv->is_above << 11)) + ((window)->priv->is_above << 11)| \ + ((window)->priv->is_below << 12)) struct _WnckWindowPrivate { @@ -120,6 +121,7 @@ struct _WnckWindowPrivate guint is_maximized_vert : 1; guint is_shaded : 1; guint is_above : 1; + guint is_below : 1; guint skip_pager : 1; guint skip_taskbar : 1; guint is_sticky : 1; @@ -260,6 +262,7 @@ wnck_window_init (WnckWindow *window) window->priv->is_maximized_vert = FALSE; window->priv->is_shaded = FALSE; window->priv->is_above = FALSE; + window->priv->is_below = FALSE; window->priv->skip_pager = FALSE; window->priv->skip_taskbar = FALSE; window->priv->is_sticky = FALSE; @@ -325,8 +328,8 @@ wnck_window_class_init (WnckWindowClass *klass) * * Emitted when the state of @window changes. This can happen when @window is * (un)minimized, (un)maximized, (un)sticked, (un)shaded, (un)made above, - * (un)set fullscreen, when it needs attention, etc. See #WnckWindowState for - * the complete list of states that might have changed. + * (un)made below, (un)set fullscreen, when it needs attention, etc. See + * #WnckWindowState for the complete list of states that might have changed. */ signals[STATE_CHANGED] = g_signal_new ("state_changed", @@ -1231,6 +1234,27 @@ wnck_window_is_above (WnckWindow *window) } /** + * wnck_window_is_below: + * @window: a #WnckWindow. + * + * Returns whether @window is below other windows. This state may change + * anytime a #WnckWindow::state-changed signal gets emitted. + * + * See wnck_window_make_below() for more details on this state. + * + * Return value: %TRUE if @window is below other windows, %FALSE otherwise. + * + * Since: 2.20 + **/ +gboolean +wnck_window_is_below (WnckWindow *window) +{ + g_return_val_if_fail (WNCK_IS_WINDOW (window), FALSE); + + return window->priv->is_below; +} + +/** * wnck_window_is_skip_pager: * @window: a #WnckWindow. * @@ -1609,6 +1633,47 @@ wnck_window_unmake_above (WnckWindow *window) } /** + * wnck_window_make_below: + * @window: a #WnckWindow. + * + * Asks the window manager to put @window below most windows. + * + * Since: 2.20 + **/ +void +wnck_window_make_below (WnckWindow *window) +{ + g_return_if_fail (WNCK_IS_WINDOW (window)); + + _wnck_change_state (WNCK_SCREEN_XSCREEN (window->priv->screen), + window->priv->xwindow, + TRUE, + _wnck_atom_get ("_NET_WM_STATE_BELOW"), + 0); +} + +/** + * wnck_window_unmake_below: + * @window: a #WnckWindow. + * + * Asks the window manager to not put @window below most windows, and to + * put it again in the stack with other windows. + * + * Since: 2.20 + **/ +void +wnck_window_unmake_below (WnckWindow *window) +{ + g_return_if_fail (WNCK_IS_WINDOW (window)); + + _wnck_change_state (WNCK_SCREEN_XSCREEN (window->priv->screen), + window->priv->xwindow, + FALSE, + _wnck_atom_get ("_NET_WM_STATE_BELOW"), + 0); +} + +/** * wnck_window_stick: * @window: a #WnckWindow. * @@ -2558,6 +2623,7 @@ update_state (WnckWindow *window) window->priv->is_sticky = FALSE; window->priv->is_shaded = FALSE; window->priv->is_above = FALSE; + window->priv->is_below = FALSE; window->priv->skip_taskbar = FALSE; window->priv->skip_pager = FALSE; window->priv->net_wm_state_hidden = FALSE; @@ -2585,6 +2651,8 @@ update_state (WnckWindow *window) window->priv->is_shaded = TRUE; else if (atoms[i] == _wnck_atom_get ("_NET_WM_STATE_ABOVE")) window->priv->is_above = TRUE; + else if (atoms[i] == _wnck_atom_get ("_NET_WM_STATE_BELOW")) + window->priv->is_below = TRUE; else if (atoms[i] == _wnck_atom_get ("_NET_WM_STATE_FULLSCREEN")) window->priv->is_fullscreen = TRUE; else if (atoms[i] == _wnck_atom_get ("_NET_WM_STATE_SKIP_TASKBAR")) diff --git a/libwnck/window.h b/libwnck/window.h index 75f331d..bbdda96 100644 --- a/libwnck/window.h +++ b/libwnck/window.h @@ -54,6 +54,8 @@ G_BEGIN_DECLS * @WNCK_WINDOW_STATE_URGENT: the window requires a response from the user. * @WNCK_WINDOW_STATE_ABOVE: the window is above other windows (see * wnck_window_make_above()). + * @WNCK_WINDOW_STATE_BELOW: the window is below other windows (see + * wnck_window_make_below()). * * Type used as a bitmask to describe the state of a #WnckWindow. */ @@ -70,7 +72,8 @@ typedef enum WNCK_WINDOW_STATE_FULLSCREEN = 1 << 8, WNCK_WINDOW_STATE_DEMANDS_ATTENTION = 1 << 9, WNCK_WINDOW_STATE_URGENT = 1 << 10, - WNCK_WINDOW_STATE_ABOVE = 1 << 11 + WNCK_WINDOW_STATE_ABOVE = 1 << 11, + WNCK_WINDOW_STATE_BELOW = 1 << 12 } WnckWindowState; /** @@ -310,6 +313,7 @@ gboolean wnck_window_is_maximized_vertically (WnckWindow *window); gboolean wnck_window_is_maximized (WnckWindow *window); gboolean wnck_window_is_shaded (WnckWindow *window); gboolean wnck_window_is_above (WnckWindow *window); +gboolean wnck_window_is_below (WnckWindow *window); gboolean wnck_window_is_skip_pager (WnckWindow *window); gboolean wnck_window_is_skip_tasklist (WnckWindow *window); gboolean wnck_window_is_fullscreen (WnckWindow *window); @@ -339,6 +343,8 @@ void wnck_window_shade (WnckWindow *window); void wnck_window_unshade (WnckWindow *window); void wnck_window_make_above (WnckWindow *window); void wnck_window_unmake_above (WnckWindow *window); +void wnck_window_make_below (WnckWindow *window); +void wnck_window_unmake_below (WnckWindow *window); void wnck_window_stick (WnckWindow *window); void wnck_window_unstick (WnckWindow *window); void wnck_window_keyboard_move (WnckWindow *window); diff --git a/libwnck/wnckprop.c b/libwnck/wnckprop.c index 9a66c84..3c222d4 100644 --- a/libwnck/wnckprop.c +++ b/libwnck/wnckprop.c @@ -108,6 +108,8 @@ gboolean set_fullscreen = FALSE; gboolean set_unfullscreen = FALSE; gboolean set_make_above = FALSE; gboolean set_unmake_above = FALSE; +gboolean set_make_below = FALSE; +gboolean set_unmake_below = FALSE; gboolean set_shade = FALSE; gboolean set_unshade = FALSE; gboolean set_stick = FALSE; @@ -209,6 +211,10 @@ static GOptionEntry window_entries[] = { N_("Make the window always on top"), NULL }, { "unmake-above", 0, 0, G_OPTION_ARG_NONE, &set_unmake_above, N_("Make the window not always on top"), NULL }, + { "make-below", 0, 0, G_OPTION_ARG_NONE, &set_make_below, + N_("Make the window below other windows"), NULL }, + { "unmake-below", 0, 0, G_OPTION_ARG_NONE, &set_unmake_below, + N_("Make the window not below other windows"), NULL }, { "shade", 0, 0, G_OPTION_ARG_NONE, &set_shade, N_("Shade the window"), NULL }, { "unshade", 0, 0, G_OPTION_ARG_NONE, &set_unshade, @@ -732,6 +738,7 @@ validate_options (void) CHECK_DUAL_OPTIONS (fullscreen, WINDOW_WRITE_MODE) CHECK_DUAL_OPTIONS (make_above, WINDOW_WRITE_MODE) + CHECK_DUAL_OPTIONS (make_below, WINDOW_WRITE_MODE) CHECK_DUAL_OPTIONS (shade, WINDOW_WRITE_MODE) CHECK_DUAL_OPTIONS (stick, WINDOW_WRITE_MODE) CHECK_DUAL_OPTIONS (skip_pager, WINDOW_WRITE_MODE) @@ -959,6 +966,8 @@ update_window (WnckWindow *window) WNCK_WINDOW_ACTION_FULLSCREEN) SET_PROPERTY_DUAL (make_above, WNCK_WINDOW_ACTION_ABOVE, WNCK_WINDOW_ACTION_ABOVE) + SET_PROPERTY_DUAL (make_below, + WNCK_WINDOW_ACTION_BELOW, WNCK_WINDOW_ACTION_BELOW) SET_PROPERTY_DUAL (shade, WNCK_WINDOW_ACTION_SHADE, WNCK_WINDOW_ACTION_UNSHADE) SET_PROPERTY_DUAL (stick, @@ -1441,10 +1450,12 @@ print_window (WnckWindow *window) if (wnck_window_get_group_leader (window) != wnck_window_get_xid (window)) g_print (_("Group Leader: %lu\n"), wnck_window_get_group_leader (window)); + //FIXME: else print something? if (wnck_window_get_transient (window)) g_print (_("Transient for: %lu\n"), wnck_window_get_xid (wnck_window_get_transient (window))); + //FIXME: else print something? #define PRINT_LIST_ITEM(func, string) \ if (func (window)) \ @@ -1476,6 +1487,7 @@ print_window (WnckWindow *window) PRINT_LIST_ITEM (wnck_window_is_pinned, _("pinned")); PRINT_LIST_ITEM (wnck_window_is_sticky, _("sticky")); PRINT_LIST_ITEM (wnck_window_is_above, _("above")); + PRINT_LIST_ITEM (wnck_window_is_below, _("below")); PRINT_LIST_ITEM (wnck_window_is_fullscreen, _("fullscreen")); PRINT_LIST_ITEM (wnck_window_needs_attention, _("needs attention")); PRINT_LIST_ITEM (wnck_window_is_skip_pager, _("skip pager")); |