summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVincent Untz <vuntz@gnome.org>2007-07-07 09:22:25 +0000
committerVincent Untz <vuntz@src.gnome.org>2007-07-07 09:22:25 +0000
commitbedcb5785b7b0e6062307140208c582291141321 (patch)
tree901d3d2c77f3a0320d8288da13e15e99d900e15f
parente5abf682f930be6d1112c2ff415a216cc8ccf331 (diff)
downloadlibwnck-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.txt3
-rw-r--r--doc/tmpl/window.sgml26
-rw-r--r--libwnck/window.c74
-rw-r--r--libwnck/window.h8
-rw-r--r--libwnck/wnckprop.c12
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"));