[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.orgDate: Thu Jan 22 11:08:31 EET 2009
- Previous message: [maemo-commits] r17253 - projects/haf/tags/desktop-file-utils/0.12-2osso1/debian
- Next message: [maemo-commits] r17255 - projects/haf/trunk/libmatchbox2/debian
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
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; +}
- Previous message: [maemo-commits] r17253 - projects/haf/tags/desktop-file-utils/0.12-2osso1/debian
- Next message: [maemo-commits] r17255 - projects/haf/trunk/libmatchbox2/debian
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]