metacity r3991 - in trunk: . src/core



Author: tthurman
Date: Thu Oct 23 04:09:14 2008
New Revision: 3991
URL: http://svn.gnome.org/viewvc/metacity?rev=3991&view=rev

Log:
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



Modified:
   trunk/ChangeLog
   trunk/src/core/atomnames.h
   trunk/src/core/window-props.c
   trunk/src/core/window.c

Modified: trunk/src/core/atomnames.h
==============================================================================
--- trunk/src/core/atomnames.h	(original)
+++ trunk/src/core/atomnames.h	Thu Oct 23 04:09:14 2008
@@ -33,7 +33,7 @@
  * again.
  *
  * 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
@@ -154,6 +154,7 @@
 item(_NET_WM_USER_TIME_WINDOW)
 item(_NET_WM_ACTION_ABOVE)
 item(_NET_WM_ACTION_BELOW)
+item(_NET_WM_STATE_STICKY)
 
 #if 0
 /* We apparently never use: */

Modified: trunk/src/core/window-props.c
==============================================================================
--- trunk/src/core/window-props.c	(original)
+++ trunk/src/core/window-props.c	Thu Oct 23 04:09:14 2008
@@ -580,6 +580,8 @@
         window->wm_state_below = TRUE;
       else if (value->v.atom_list.atoms[i] == window->display->atom__NET_WM_STATE_DEMANDS_ATTENTION)
         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;
     }

Modified: trunk/src/core/window.c
==============================================================================
--- trunk/src/core/window.c	(original)
+++ trunk/src/core/window.c	Thu Oct 23 04:09:14 2008
@@ -1228,7 +1228,7 @@
 set_net_wm_state (MetaWindow *window)
 {
   int i;
-  unsigned long data[11];
+  unsigned long data[12];
   
   i = 0;
   if (window->shaded)
@@ -1286,6 +1286,11 @@
       data[i] = window->display->atom__NET_WM_STATE_DEMANDS_ATTENTION;
       ++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);
   
@@ -4928,9 +4933,19 @@
         {
           if ((action == _NET_WM_STATE_ADD) ||
               (action == _NET_WM_STATE_TOGGLE && !window->wm_state_demands_attention))
-            meta_window_set_demands_attention(window);
+            meta_window_set_demands_attention (window);
           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;



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]