Commit ab9bdf22 authored by Thomas Thurman's avatar Thomas Thurman Committed by Thomas James Alexander Thurman
Browse files

Support _NET_WM_STATE_STICKY (i.e. allow third-party apps to decide

2008-10-23  Thomas Thurman  <tthurman@gnome.org>

        Support _NET_WM_STATE_STICKY (i.e. allow third-party apps to decide
        whether a window is on all workspaces).  Bug found by Ka-Hing
        Cheung.  Closes #557536.

        * src/core/window.c (set_net_wm_state): report it
        * src/core/window.c (meta_window_client_message): set sticky
          if we receive it
        * src/core/window-props.c: set sticky if we find it
        * src/core/atomnames.h: add _NET_WM_STATE_STICKY


svn path=/trunk/; revision=3991
parent c91475f2
2008-10-23 Thomas Thurman <tthurman@gnome.org>
Support _NET_WM_STATE_STICKY (i.e. allow third-party apps to decide
whether a window is on all workspaces). Bug found by Ka-Hing
Cheung. Closes #557536.
* src/core/window.c (set_net_wm_state): report it
* src/core/window.c (meta_window_client_message): set sticky
if we receive it
* src/core/window-props.c: set sticky if we find it
* src/core/atomnames.h: add _NET_WM_STATE_STICKY
2008-10-22 Thomas Thurman <tthurman@gnome.org> 2008-10-22 Thomas Thurman <tthurman@gnome.org>
* src/core/schema-bindings.c: support builds outside tree properly. * src/core/schema-bindings.c: support builds outside tree properly.
......
...@@ -33,7 +33,7 @@ ...@@ -33,7 +33,7 @@
* again. * again.
* *
* If you also define EWMH_ATOMS_ONLY then you will only get _NET_WM_* * If you also define EWMH_ATOMS_ONLY then you will only get _NET_WM_*
* hints rather than all of them. * atoms rather than all of them.
*/ */
#ifndef item #ifndef item
...@@ -154,6 +154,7 @@ item(_NET_DESKTOP_VIEWPORT) ...@@ -154,6 +154,7 @@ item(_NET_DESKTOP_VIEWPORT)
item(_NET_WM_USER_TIME_WINDOW) item(_NET_WM_USER_TIME_WINDOW)
item(_NET_WM_ACTION_ABOVE) item(_NET_WM_ACTION_ABOVE)
item(_NET_WM_ACTION_BELOW) item(_NET_WM_ACTION_BELOW)
item(_NET_WM_STATE_STICKY)
#if 0 #if 0
/* We apparently never use: */ /* We apparently never use: */
......
...@@ -580,6 +580,8 @@ reload_net_wm_state (MetaWindow *window, ...@@ -580,6 +580,8 @@ reload_net_wm_state (MetaWindow *window,
window->wm_state_below = TRUE; window->wm_state_below = TRUE;
else if (value->v.atom_list.atoms[i] == window->display->atom__NET_WM_STATE_DEMANDS_ATTENTION) else if (value->v.atom_list.atoms[i] == window->display->atom__NET_WM_STATE_DEMANDS_ATTENTION)
window->wm_state_demands_attention = TRUE; window->wm_state_demands_attention = TRUE;
else if (value->v.atom_list.atoms[i] == window->display->atom__NET_WM_STATE_STICKY)
window->on_all_workspaces = TRUE;
++i; ++i;
} }
......
...@@ -1228,7 +1228,7 @@ static void ...@@ -1228,7 +1228,7 @@ static void
set_net_wm_state (MetaWindow *window) set_net_wm_state (MetaWindow *window)
{ {
int i; int i;
unsigned long data[11]; unsigned long data[12];
i = 0; i = 0;
if (window->shaded) if (window->shaded)
...@@ -1286,6 +1286,11 @@ set_net_wm_state (MetaWindow *window) ...@@ -1286,6 +1286,11 @@ set_net_wm_state (MetaWindow *window)
data[i] = window->display->atom__NET_WM_STATE_DEMANDS_ATTENTION; data[i] = window->display->atom__NET_WM_STATE_DEMANDS_ATTENTION;
++i; ++i;
} }
if (window->on_all_workspaces)
{
data[i] = window->display->atom__NET_WM_STATE_STICKY;
++i;
}
meta_verbose ("Setting _NET_WM_STATE with %d atoms\n", i); meta_verbose ("Setting _NET_WM_STATE with %d atoms\n", i);
...@@ -4928,9 +4933,19 @@ meta_window_client_message (MetaWindow *window, ...@@ -4928,9 +4933,19 @@ meta_window_client_message (MetaWindow *window,
{ {
if ((action == _NET_WM_STATE_ADD) || if ((action == _NET_WM_STATE_ADD) ||
(action == _NET_WM_STATE_TOGGLE && !window->wm_state_demands_attention)) (action == _NET_WM_STATE_TOGGLE && !window->wm_state_demands_attention))
meta_window_set_demands_attention(window); meta_window_set_demands_attention (window);
else else
meta_window_unset_demands_attention(window); meta_window_unset_demands_attention (window);
}
if (first == display->atom__NET_WM_STATE_STICKY ||
second == display->atom__NET_WM_STATE_STICKY)
{
if ((action == _NET_WM_STATE_ADD) ||
(action == _NET_WM_STATE_TOGGLE && !window->on_all_workspaces))
meta_window_stick (window);
else
meta_window_unstick (window);
} }
return TRUE; return TRUE;
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment