[maemo-commits] [maemo-commits] r17254 - in projects/haf/trunk/libmatchbox2: . matchbox/client-types matchbox/core tests

From: subversion at stage.maemo.org subversion at stage.maemo.org
Date: Thu Jan 22 11:08:31 EET 2009
Author: kihamala
Date: 2009-01-22 11:08:30 +0200 (Thu, 22 Jan 2009)
New Revision: 17254

Added:
   projects/haf/trunk/libmatchbox2/tests/test-hildon-stacking.c
Modified:
   projects/haf/trunk/libmatchbox2/ChangeLog
   projects/haf/trunk/libmatchbox2/matchbox/client-types/mb-wm-client-app.c
   projects/haf/trunk/libmatchbox2/matchbox/client-types/mb-wm-client-dialog.c
   projects/haf/trunk/libmatchbox2/matchbox/client-types/mb-wm-client-menu.c
   projects/haf/trunk/libmatchbox2/matchbox/client-types/mb-wm-client-override.c
   projects/haf/trunk/libmatchbox2/matchbox/core/mb-window-manager.c
   projects/haf/trunk/libmatchbox2/matchbox/core/mb-wm-atoms.c
   projects/haf/trunk/libmatchbox2/matchbox/core/mb-wm-client-window.c
   projects/haf/trunk/libmatchbox2/matchbox/core/mb-wm-client-window.h
   projects/haf/trunk/libmatchbox2/matchbox/core/mb-wm-client.c
   projects/haf/trunk/libmatchbox2/matchbox/core/mb-wm-client.h
   projects/haf/trunk/libmatchbox2/matchbox/core/mb-wm-types.h
Log:
hildon stacking layers


Modified: projects/haf/trunk/libmatchbox2/ChangeLog
===================================================================
--- projects/haf/trunk/libmatchbox2/ChangeLog	2009-01-22 07:15:44 UTC (rev 17253)
+++ projects/haf/trunk/libmatchbox2/ChangeLog	2009-01-22 09:08:30 UTC (rev 17254)
@@ -1,3 +1,14 @@
+2009-01-22  Kimmo Hämäläinen  <kimmo.hamalainen at nokia.com>
+
+	* matchbox/client-types/mb-wm-client-app.c,
+	matchbox/client-types/mb-wm-client-dialog.c,
+	matchbox/client-types/mb-wm-client-menu.c,
+	matchbox/client-types/mb-wm-client-override.c,
+	matchbox/core/mb-window-manager.c,
+	matchbox/core/mb-wm-atoms.c,
+	matchbox/core/mb-wm-client-window.c:
+	Implement Hildon stacking layers.
+
 2009-01-21  Kimmo Hämäläinen  <kimmo.hamalainen at nokia.com>
 
 	* matchbox/comp-mgr/mb-wm-comp-mgr-clutter.c

Modified: projects/haf/trunk/libmatchbox2/matchbox/client-types/mb-wm-client-app.c
===================================================================
--- projects/haf/trunk/libmatchbox2/matchbox/client-types/mb-wm-client-app.c	2009-01-22 07:15:44 UTC (rev 17253)
+++ projects/haf/trunk/libmatchbox2/matchbox/client-types/mb-wm-client-app.c	2009-01-22 09:08:30 UTC (rev 17254)
@@ -85,7 +85,11 @@
 		     sizeof (actions)/sizeof (actions[0]));
   }
 
-  client->stacking_layer = MBWMStackLayerMid;
+  if (client->window->hildon_stacking_layer == 0)
+    client->stacking_layer = MBWMStackLayerMid;
+  else
+    client->stacking_layer = client->window->hildon_stacking_layer
+	                     + MBWMStackLayerHildon1 - 1;
 
   mb_wm_client_set_layout_hints (client,
 				 LayoutPrefGrowToFreeSpace|LayoutPrefVisible);

Modified: projects/haf/trunk/libmatchbox2/matchbox/client-types/mb-wm-client-dialog.c
===================================================================
--- projects/haf/trunk/libmatchbox2/matchbox/client-types/mb-wm-client-dialog.c	2009-01-22 07:15:44 UTC (rev 17253)
+++ projects/haf/trunk/libmatchbox2/matchbox/client-types/mb-wm-client-dialog.c	2009-01-22 09:08:30 UTC (rev 17254)
@@ -130,9 +130,13 @@
     }
   else
     {
-      MBWM_DBG ("Dialog is transient to root");
-      /* Stack with 'always on top' */
-      client->stacking_layer = MBWMStackLayerTopMid;
+      g_debug ("%s: Dialog is transient to root", __FUNCTION__);
+      if (win->hildon_stacking_layer == 0)
+        /* Stack with 'always on top' */
+        client->stacking_layer = MBWMStackLayerTopMid;
+      else
+        client->stacking_layer = client->window->hildon_stacking_layer
+                                 + MBWMStackLayerHildon1 - 1;
     }
 
   /* center if window sets 0,0

Modified: projects/haf/trunk/libmatchbox2/matchbox/client-types/mb-wm-client-menu.c
===================================================================
--- projects/haf/trunk/libmatchbox2/matchbox/client-types/mb-wm-client-menu.c	2009-01-22 07:15:44 UTC (rev 17253)
+++ projects/haf/trunk/libmatchbox2/matchbox/client-types/mb-wm-client-menu.c	2009-01-22 09:08:30 UTC (rev 17254)
@@ -95,7 +95,11 @@
       client->stacking_layer = MBWMStackLayerTopMid;
     }
 #else
-  client->stacking_layer = MBWMStackLayerTop;
+  if (win->hildon_stacking_layer == 0)
+    client->stacking_layer = MBWMStackLayerTop;
+  else
+    client->stacking_layer = win->hildon_stacking_layer
+                             + MBWMStackLayerHildon1 - 1;
 #endif
 
   geom = client->window->geometry;

Modified: projects/haf/trunk/libmatchbox2/matchbox/client-types/mb-wm-client-override.c
===================================================================
--- projects/haf/trunk/libmatchbox2/matchbox/client-types/mb-wm-client-override.c	2009-01-22 07:15:44 UTC (rev 17253)
+++ projects/haf/trunk/libmatchbox2/matchbox/client-types/mb-wm-client-override.c	2009-01-22 09:08:30 UTC (rev 17254)
@@ -22,6 +22,7 @@
 
 #include "mb-wm-theme.h"
 
+#if 0  /* we have to respect stacking layers */
 static void
 mb_wm_client_override_stack (MBWindowManagerClient *client,
 			     int                    flags)
@@ -35,6 +36,7 @@
 
   mb_wm_util_list_free (t);
 }
+#endif
 
 static void
 mb_wm_client_override_class_init (MBWMObjectClass *klass)
@@ -46,7 +48,9 @@
   client = (MBWindowManagerClientClass *)klass;
 
   client->client_type  = MBWMClientTypeOverride;
+/*
   client->stack        = mb_wm_client_override_stack;
+  */
 
 #if MBWM_WANT_DEBUG
   klass->klass_name = "MBWMClientOverride";
@@ -80,8 +84,12 @@
   else
     {
       MBWM_DBG ("Override is transient to root or intransient");
-      /* Stack with 'always on top' */
-      client->stacking_layer = MBWMStackLayerTop;
+      if (win->hildon_stacking_layer == 0)
+        /* Stack with 'always on top' */
+        client->stacking_layer = MBWMStackLayerTop;
+      else
+        client->stacking_layer = win->hildon_stacking_layer
+                                 + MBWMStackLayerHildon1 - 1;
     }
 
   return 1;

Modified: projects/haf/trunk/libmatchbox2/matchbox/core/mb-window-manager.c
===================================================================
--- projects/haf/trunk/libmatchbox2/matchbox/core/mb-window-manager.c	2009-01-22 07:15:44 UTC (rev 17253)
+++ projects/haf/trunk/libmatchbox2/matchbox/core/mb-window-manager.c	2009-01-22 09:08:30 UTC (rev 17254)
@@ -581,6 +581,8 @@
     flag = MBWM_WINDOW_PROP_CLIENT_MACHINE;
   else if (xev->atom == wm->atoms[MBWM_ATOM_NET_WM_PID])
     flag = MBWM_WINDOW_PROP_NET_PID;
+  else if (xev->atom == wm->atoms[MBWM_ATOM_HILDON_STACKING_LAYER])
+    flag = MBWM_WINDOW_PROP_HILDON_STACKING;
 
   if (flag)
     mb_wm_client_window_sync_properties (client->window, flag);

Modified: projects/haf/trunk/libmatchbox2/matchbox/core/mb-wm-atoms.c
===================================================================
--- projects/haf/trunk/libmatchbox2/matchbox/core/mb-wm-atoms.c	2009-01-22 07:15:44 UTC (rev 17253)
+++ projects/haf/trunk/libmatchbox2/matchbox/core/mb-wm-atoms.c	2009-01-22 09:08:30 UTC (rev 17254)
@@ -102,6 +102,7 @@
     "_MB_GRAB_TRANSFER",
     "_MB_CURRENT_APP_WINDOW",
     "_MB_SECONDARY",
+    "_HILDON_STACKING_LAYER",
   };
 
   /* FIXME: Error Traps */

Modified: projects/haf/trunk/libmatchbox2/matchbox/core/mb-wm-client-window.c
===================================================================
--- projects/haf/trunk/libmatchbox2/matchbox/core/mb-wm-client-window.c	2009-01-22 07:15:44 UTC (rev 17253)
+++ projects/haf/trunk/libmatchbox2/matchbox/core/mb-wm-client-window.c	2009-01-22 09:08:30 UTC (rev 17254)
@@ -41,6 +41,7 @@
   COOKIE_WIN_CM_TRANSLUCENCY,
   COOKIE_WIN_NET_STATE,
   COOKIE_WIN_MWM_HINTS,
+  COOKIE_WIN_HILDON_STACKING,
 
   N_COOKIES
 };
@@ -337,6 +338,13 @@
 				       wm->atoms[MBWM_ATOM_CM_TRANSLUCENCY]);
     }
 
+  if (props_req & MBWM_WINDOW_PROP_HILDON_STACKING)
+    {
+      cookies[COOKIE_WIN_HILDON_STACKING]
+	= mb_wm_property_cardinal_req (wm, xwin,
+	  	wm->atoms[MBWM_ATOM_HILDON_STACKING_LAYER]);
+    }
+
   /* bundle all pending requests to server and wait for replys */
   XSync(wm->xdpy, False);
 
@@ -934,7 +942,11 @@
 	{
 	  MBWM_DBG("### Warning _NET_WM_USER_TIME failed ###");
           if (x_error_code == BadWindow)
-            goto badwindow_error;
+	    {
+              if (user_time)
+	        XFree(user_time);
+              goto badwindow_error;
+	    }
 	}
       else
 	{
@@ -946,7 +958,47 @@
 	XFree(user_time);
     }
 
+  if (props_req & MBWM_WINDOW_PROP_HILDON_STACKING)
+    {
+      unsigned long *value = NULL;
 
+      mb_wm_property_reply (wm,
+			    cookies[COOKIE_WIN_HILDON_STACKING],
+			    &actual_type_return,
+			    &actual_format_return,
+			    &nitems_return,
+			    &bytes_after_return,
+			    (unsigned char **)&value,
+			    &x_error_code);
+
+      if (x_error_code
+	  || actual_type_return != XA_CARDINAL
+	  || actual_format_return != 32
+	  || value == NULL
+	  )
+	{
+	  g_debug ("%s: _HILDON_STACKING_LAYER failed", __FUNCTION__);
+	  win->hildon_stacking_layer = 0;
+          if (x_error_code == BadWindow)
+	    {
+              if (value)
+	        XFree(value);
+              goto badwindow_error;
+	    }
+	}
+      else
+	{
+	  win->hildon_stacking_layer = (unsigned int)*value;
+	  g_debug ("%s: _HILDON_STACKING_LAYER is %u", __FUNCTION__,
+		   win->hildon_stacking_layer);
+	}
+
+      if (value)
+	XFree(value);
+
+      changes |= MBWM_WINDOW_PROP_HILDON_STACKING;
+    }
+
   if (changes)
     mb_wm_object_signal_emit (MB_WM_OBJECT (win), changes);
 

Modified: projects/haf/trunk/libmatchbox2/matchbox/core/mb-wm-client-window.h
===================================================================
--- projects/haf/trunk/libmatchbox2/matchbox/core/mb-wm-client-window.h	2009-01-22 07:15:44 UTC (rev 17253)
+++ projects/haf/trunk/libmatchbox2/matchbox/core/mb-wm-client-window.h	2009-01-22 09:08:30 UTC (rev 17254)
@@ -46,6 +46,7 @@
 #define MBWM_WINDOW_PROP_NET_USER_TIME   (1<<15)
 #define MBWM_WINDOW_PROP_CM_TRANSLUCENCY (1<<17)
 #define MBWM_WINDOW_PROP_MWM_HINTS       (1<<18)
+#define MBWM_WINDOW_PROP_HILDON_STACKING (1<<19)
 
 #define MBWM_WINDOW_PROP_ALL        (0xffffffff)
 
@@ -154,11 +155,11 @@
   int                            window_class;
   Bool                           override_redirect;
   Bool                           undecorated;
+
+  /* value of the atom _HILDON_STACKING_LAYER (1-10) */
+  unsigned int                   hildon_stacking_layer;
 };
 
-/**
- * Class of MBWMClientWindow.
- */
 struct MBWMClientWindowClass
 {
   MBWMObjectClass parent;

Modified: projects/haf/trunk/libmatchbox2/matchbox/core/mb-wm-client.c
===================================================================
--- projects/haf/trunk/libmatchbox2/matchbox/core/mb-wm-client.c	2009-01-22 07:15:44 UTC (rev 17253)
+++ projects/haf/trunk/libmatchbox2/matchbox/core/mb-wm-client.c	2009-01-22 09:08:30 UTC (rev 17254)
@@ -318,6 +318,14 @@
   if (property & MBWM_WINDOW_PROP_GEOMETRY)
     mb_wm_client_geometry_mark_dirty (client);
 
+  if ((property & MBWM_WINDOW_PROP_HILDON_STACKING) && client->window)
+    {
+      if (client->window->hildon_stacking_layer > 0)
+        client->stacking_layer = client->window->hildon_stacking_layer
+		                 + MBWMStackLayerHildon1 - 1;
+      mb_wm_client_stacking_mark_dirty (client);
+    }
+
 #if ENABLE_COMPOSITE
   if ((property & MBWM_WINDOW_PROP_CM_TRANSLUCENCY) &&
       client->cm_client && mb_wm_comp_mgr_enabled (client->wmref->comp_mgr))

Modified: projects/haf/trunk/libmatchbox2/matchbox/core/mb-wm-client.h
===================================================================
--- projects/haf/trunk/libmatchbox2/matchbox/core/mb-wm-client.h	2009-01-22 07:15:44 UTC (rev 17253)
+++ projects/haf/trunk/libmatchbox2/matchbox/core/mb-wm-client.h	2009-01-22 09:08:30 UTC (rev 17254)
@@ -44,12 +44,23 @@
   MBWMStackLayerMid          ,	 /* Apps */
   MBWMStackLayerTopMid       ,	 /* Trans for root dialogs */
   MBWMStackLayerTop          ,	 /* Something else ? */
+
+  /* layers used for device-specific windows (e.g. touchscreen lock) */
+  MBWMStackLayerHildon1      ,
+  MBWMStackLayerHildon2      ,
+  MBWMStackLayerHildon3      ,
+  MBWMStackLayerHildon4      ,
+  MBWMStackLayerHildon5      ,
+  MBWMStackLayerHildon6      ,
+  MBWMStackLayerHildon7      ,
+  MBWMStackLayerHildon8      ,
+  MBWMStackLayerHildon9      ,
+  MBWMStackLayerHildon10     ,
   N_MBWMStackLayerTypes
 }
 MBWMStackLayerType;
 
-/**
- * Clients can also hint to as how they would like to be managed by the
+/* Clients can also hint to as how they would like to be managed by the
  * layout manager.
  */
 typedef enum MBWMClientLayoutHints

Modified: projects/haf/trunk/libmatchbox2/matchbox/core/mb-wm-types.h
===================================================================
--- projects/haf/trunk/libmatchbox2/matchbox/core/mb-wm-types.h	2009-01-22 07:15:44 UTC (rev 17253)
+++ projects/haf/trunk/libmatchbox2/matchbox/core/mb-wm-types.h	2009-01-22 09:08:30 UTC (rev 17254)
@@ -294,6 +294,9 @@
    *
   */
 
+  /* special layers above others for mobile use (e.g. touchscreen lock) */
+  MBWM_ATOM_HILDON_STACKING_LAYER,
+
   MBWM_ATOM_COUNT
 
 } MBWMAtom;

Added: projects/haf/trunk/libmatchbox2/tests/test-hildon-stacking.c
===================================================================
--- projects/haf/trunk/libmatchbox2/tests/test-hildon-stacking.c	2009-01-22 07:15:44 UTC (rev 17253)
+++ projects/haf/trunk/libmatchbox2/tests/test-hildon-stacking.c	2009-01-22 09:08:30 UTC (rev 17254)
@@ -0,0 +1,184 @@
+/*
+ * Copyright (C) 2009 Nokia Corporation, all rights reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA
+ *
+ */
+#define MAEMO_CHANGES 1
+
+#include <stdlib.h>
+#include <X11/Xlib.h>
+#include <X11/Xatom.h>
+#include <gtk/gtk.h>
+#include <gdk/gdkx.h>
+#include <gdk/gdkwindow.h>
+
+void set_stacking_layer (GtkWidget *win, int layer)
+{
+	Window xwindow;
+	Atom atom;
+	GdkWindow *gdk_window = GTK_WIDGET (win)->window;
+	GdkDisplay *gdk_display = gdk_display_get_default ();
+	Display *display = GDK_DISPLAY_XDISPLAY (gdk_display);
+
+        atom = gdk_x11_get_xatom_by_name_for_display (gdk_display,
+			"_HILDON_STACKING_LAYER");
+	xwindow = GDK_WINDOW_XID (gdk_window);
+
+        XChangeProperty (display,
+                       xwindow,
+                       atom,
+                       XA_CARDINAL, 32, PropModeReplace,
+                       (unsigned char *) &layer, 1);
+}
+
+void set_menu_type (GtkWidget *win)
+{
+	Window xwindow;
+	Atom atom, menu_atom;
+	GdkWindow *gdk_window = GTK_WIDGET (win)->window;
+	GdkDisplay *gdk_display = gdk_display_get_default ();
+	Display *display = GDK_DISPLAY_XDISPLAY (gdk_display);
+
+        atom = gdk_x11_get_xatom_by_name_for_display (gdk_display,
+			"_NET_WM_WINDOW_TYPE");
+        menu_atom = gdk_x11_get_xatom_by_name_for_display (gdk_display,
+			"_NET_WM_WINDOW_TYPE_MENU");
+	xwindow = GDK_WINDOW_XID (gdk_window);
+
+        XChangeProperty (display,
+                       xwindow,
+                       atom,
+                       XA_ATOM, 32, PropModeReplace,
+                       (unsigned char *) &menu_atom, 1);
+}
+
+int layer = 1;
+
+/*
+gboolean do_something (gpointer w)
+{
+	GtkWidget *window = GTK_WIDGET(w);
+
+	set_stacking_layer (window, layer);
+
+	return False;
+}
+*/
+
+void create_dialog (int layer)
+{
+	GtkWidget *dialog, *label;
+	char buf[100];
+
+	snprintf (buf, 100, "Hildon Layer %d", layer);
+	label = gtk_label_new (buf);
+
+	dialog = gtk_dialog_new ();
+	gtk_widget_realize (dialog);
+	set_stacking_layer (dialog, layer);
+	/*
+	gtk_window_set_title (GTK_WINDOW(dialog), buf);
+	gtk_window_set_decorated (GTK_WINDOW(dialog), FALSE);
+
+	*/
+	gtk_container_add (GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), label);
+
+	gtk_widget_show_all (dialog);
+}
+
+void create_menu (int layer)
+{
+	GtkWidget *menu, *label;
+	char buf[100];
+
+	snprintf (buf, 100, "Hildon Layer %d", layer);
+	label = gtk_label_new (buf);
+
+	menu = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+	gtk_widget_realize (menu);
+	set_stacking_layer (menu, layer);
+        set_menu_type (menu);
+	/*
+	gtk_window_fullscreen (GTK_WINDOW(menu));
+	*/
+
+	gtk_container_add (GTK_CONTAINER(menu), label);
+
+	gtk_widget_show_all (menu);
+}
+
+void create_normal_toplevel (int layer)
+{
+	GtkWidget *menu, *label;
+	char buf[100];
+
+	snprintf (buf, 100, "Hildon Layer %d", layer);
+	label = gtk_label_new (buf);
+
+	menu = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+	gtk_widget_realize (menu);
+	set_stacking_layer (menu, layer);
+
+	/*
+	gtk_window_fullscreen (GTK_WINDOW(menu));
+	*/
+
+	gtk_container_add (GTK_CONTAINER(menu), label);
+
+	gtk_widget_show_all (menu);
+}
+
+void create_override_window (int layer)
+{
+	GtkWidget *menu, *label;
+	char buf[100];
+
+	snprintf (buf, 100, "Hildon Layer %d", layer);
+	label = gtk_label_new (buf);
+
+	menu = gtk_window_new (GTK_WINDOW_POPUP);
+	gtk_widget_realize (menu);
+	set_stacking_layer (menu, layer);
+        gtk_window_set_position (GTK_WINDOW(menu), GTK_WIN_POS_CENTER);
+	gtk_window_set_default_size (GTK_WINDOW(menu), 200, 200);
+
+	/*
+	gtk_window_fullscreen (GTK_WINDOW(menu));
+	*/
+
+	gtk_container_add (GTK_CONTAINER(menu), label);
+
+	gtk_widget_show_all (menu);
+}
+
+int
+main (int argc, char **argv)
+{
+	gtk_init (&argc, &argv);
+
+	/*
+	create_dialog (3);
+	create_menu (1);
+	create_normal_toplevel (1);
+	*/
+	create_dialog (2);
+	create_override_window (1);
+
+	gtk_main ();
+
+	return 0;
+}


More information about the maemo-commits mailing list