[maemo-commits] [maemo-commits] r17198 - in projects/haf/trunk/libmatchbox2: . matchbox/core tests
From: subversion at stage.maemo.org subversion at stage.maemo.orgDate: Fri Jan 16 06:57:07 EET 2009
- Previous message: [maemo-commits] r17197 - in projects/haf/trunk/clutter: clutter debian
- Next message: [maemo-commits] r17199 - in projects/haf/trunk/hildon-thumbnail: . daemon tests
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
Author: tthurman
Date: 2009-01-16 06:57:03 +0200 (Fri, 16 Jan 2009)
New Revision: 17198
Modified:
projects/haf/trunk/libmatchbox2/ChangeLog
projects/haf/trunk/libmatchbox2/matchbox/core/mb-window-manager.c
projects/haf/trunk/libmatchbox2/matchbox/core/mb-wm-client-base.c
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-stack.c
projects/haf/trunk/libmatchbox2/tests/test-transience.c
Log:
* matchbox/core/mb-wm-client-base.c: remove irrelevant stacking
according to stanza 4 of bug #96965.
* matchbox/core/mb-wm-client.[ch]: add
mb_wm_client_get_next_focused_client() and
mb_wm_client_get_last_focused_transient(); remove the corresponding
attributes of MBWindowManagerClient according to stanzas 1 and 2
of bug #96965.
* matchbox/core/mb-window-manager.c: rewrite anywhere which used the
removed attributes of MBWindowManager to use the new methods.
mb_wm_unfocus_client() does not show the desktop if a client cannot
be focussed, in case we have another client on top which can,
according to stanzas 1 and 2 of bug #96965.
* matchbox/core/mb-wm-stack.c: mb_wm_stack_dump() should always dump.
* tests/test-transience.c: regularise test to use Hildon window types
(but this could still be improved since it checks focus rather
than stacking as stuch; correctness of changes above was checked
using debug print statements).
Closes #96965.
Modified: projects/haf/trunk/libmatchbox2/ChangeLog
===================================================================
--- projects/haf/trunk/libmatchbox2/ChangeLog 2009-01-15 16:53:23 UTC (rev 17197)
+++ projects/haf/trunk/libmatchbox2/ChangeLog 2009-01-16 04:57:03 UTC (rev 17198)
@@ -1,3 +1,25 @@
+2009-01-15 Thomas Thurman <thomas.thurman at collabora.co.uk>
+
+ * matchbox/core/mb-wm-client-base.c: remove irrelevant stacking
+ according to stanza 4 of bug #96965.
+ * matchbox/core/mb-wm-client.[ch]: add
+ mb_wm_client_get_next_focused_client() and
+ mb_wm_client_get_last_focused_transient(); remove the corresponding
+ attributes of MBWindowManagerClient according to stanzas 1 and 2
+ of bug #96965.
+ * matchbox/core/mb-window-manager.c: rewrite anywhere which used the
+ removed attributes of MBWindowManager to use the new methods.
+ mb_wm_unfocus_client() does not show the desktop if a client cannot
+ be focussed, in case we have another client on top which can,
+ according to stanzas 1 and 2 of bug #96965.
+ * matchbox/core/mb-wm-stack.c: mb_wm_stack_dump() should always dump.
+ * tests/test-transience.c: regularise test to use Hildon window types
+ (but this could still be improved since it checks focus rather
+ than stacking as stuch; correctness of changes above was checked
+ using debug print statements).
+
+ Closes #96965.
+
2009-01-15 Kimmo Hämäläinen <kimmo.hamalainen at nokia.com>
Patch from Laszlo Pere:
Modified: projects/haf/trunk/libmatchbox2/matchbox/core/mb-window-manager.c
===================================================================
--- projects/haf/trunk/libmatchbox2/matchbox/core/mb-window-manager.c 2009-01-15 16:53:23 UTC (rev 17197)
+++ projects/haf/trunk/libmatchbox2/matchbox/core/mb-window-manager.c 2009-01-16 04:57:03 UTC (rev 17198)
@@ -1180,21 +1180,6 @@
*/
mb_wm_client_detransitise (client);
- next_focused = client->next_focused_client;
- mb_wm_stack_enumerate (wm, c)
- {
- /*
- * Must avoid circular dependcy here
- */
- if (c->next_focused_client == client)
- {
- if (c != next_focused)
- c->next_focused_client = next_focused;
- else
- c->next_focused_client = NULL;
- }
- }
-
#if ENABLE_COMPOSITE
if (mb_wm_comp_mgr_enabled (wm->comp_mgr))
{
@@ -1796,7 +1781,7 @@
Bool was_desktop;
Bool is_desktop;
MBWindowManagerClient * c_focus = c;
- MBWindowManagerClient * trans;
+ MBWindowManagerClient * trans, *last_focused_transient;
if (c == NULL)
return False;
@@ -1836,15 +1821,12 @@
mb_wm_client_show (c);
- /* If the next focused client after this one is transient for it,
- * activate it instead
- */
- if (c->last_focused_transient &&
- c->last_focused_transient->transient_for == c)
- {
- c_focus = c->last_focused_transient;
- }
+ last_focused_transient = mb_wm_client_get_last_focused_transient (c);
+ if (last_focused_transient) {
+ c_focus = last_focused_transient;
+ }
+
mb_wm_focus_client (wm, c_focus);
mb_wm_client_stack (c, 0);
@@ -1942,16 +1924,20 @@
static Bool
mb_wm_focus_client (MBWindowManager *wm, MBWindowManagerClient *c)
{
- MBWindowManagerClient * client = c;
+ MBWindowManagerClient *client = c,
+ *last_focused_transient;
+
+ last_focused_transient = mb_wm_client_get_last_focused_transient (c);
/*
- * The last focused transient for this client is modal, we try to focus
+ * If the last focused transient for this client is modal, we try to focus
* the transient rather than the client itself
*/
- if (c->last_focused_transient &&
- mb_wm_client_is_modal (c->last_focused_transient))
+
+ if (last_focused_transient &&
+ mb_wm_client_is_modal (last_focused_transient))
{
- client = c->last_focused_transient;
+ client = last_focused_transient;
}
/*
@@ -2009,20 +1995,6 @@
while (trans_new->transient_for)
trans_new = trans_new->transient_for;
-
- client->next_focused_client = NULL;
-
- /*
- * Are we both transient for the same thing ?
- */
- if (trans_new && trans_new == trans_old)
- client->next_focused_client = wm->focused_client;
-
- /* From regular dialog to transient for root dialogs */
- if (MB_WM_IS_CLIENT_DIALOG (client) &&
- !client->transient_for &&
- MB_WM_IS_CLIENT_DIALOG (wm->focused_client))
- client->next_focused_client = wm->focused_client;
}
wm->focused_client = client;
@@ -2040,10 +2012,7 @@
if (client != wm->focused_client)
return;
- /*
- * Remove this client from any other's next_focused_client
- */
- next = client->next_focused_client;
+ next = mb_wm_client_get_next_focused_client (client);
if (!next && wm->stack_top)
{
@@ -2060,10 +2029,6 @@
}
wm->focused_client = NULL;
-
- /* Show the desktop if we cannot focus @next. */
- if (next && !mb_wm_focus_client (wm, next))
- mb_wm_handle_show_desktop (wm, True);
}
void
Modified: projects/haf/trunk/libmatchbox2/matchbox/core/mb-wm-client-base.c
===================================================================
--- projects/haf/trunk/libmatchbox2/matchbox/core/mb-wm-client-base.c 2009-01-15 16:53:23 UTC (rev 17197)
+++ projects/haf/trunk/libmatchbox2/matchbox/core/mb-wm-client-base.c 2009-01-16 04:57:03 UTC (rev 17198)
@@ -288,12 +288,6 @@
mb_wm_util_list_foreach (t, (MBWMListForEachCB)mb_wm_client_stack,
(void*)flags);
- for (li = t; li; li = li->next)
- if (li->data == client->wmref->focused_client)
- {
- mb_wm_stack_move_top ((MBWindowManagerClient *)li->data);
- break;
- }
mb_wm_util_list_free (t);
}
Modified: projects/haf/trunk/libmatchbox2/matchbox/core/mb-wm-client.c
===================================================================
--- projects/haf/trunk/libmatchbox2/matchbox/core/mb-wm-client.c 2009-01-15 16:53:23 UTC (rev 17197)
+++ projects/haf/trunk/libmatchbox2/matchbox/core/mb-wm-client.c 2009-01-16 04:57:03 UTC (rev 17198)
@@ -447,18 +447,6 @@
if (klass->focus)
ret = klass->focus(client);
- if (ret)
- {
- /*
- * If this client is transient, store it with the parent; if it is not
- * transient, reset the last transient field
- */
- if (client->transient_for)
- client->transient_for->last_focused_transient = client;
- else
- client->last_focused_transient = NULL;
- }
-
return ret;
}
@@ -616,11 +604,50 @@
transient->transient_for = NULL;
client->transients = mb_wm_util_list_remove(client->transients, transient);
+}
- if (client->last_focused_transient == transient)
- client->last_focused_transient = transient->next_focused_client;
+/**
+ * Returns the client next above the given client in the
+ * stacking order. Returns NULL if the client does not
+ * exist or is the topmost client.
+ */
+MBWindowManagerClient*
+mb_wm_client_get_next_focused_client (MBWindowManagerClient *client)
+{
+ MBWindowManagerClient *c;
+ gboolean get_this_one = FALSE;
+
+ /* enumerate goes from bottom to top, as opposed to enumerate_reverse
+ * which goes from top to bottom.
+ */
+ mb_wm_stack_enumerate (client->wmref, c)
+ {
+ if (get_this_one)
+ return c;
+ else if (c == client)
+ get_this_one = TRUE;
+ }
+
+ return NULL; /* oops, fell off the end. */
}
+/**
+ * Returns the transient of client "client" which was most recently
+ * focused (i.e. which is closest to the top, in our model).
+ * Returns NULL if there are no transients for the given client.
+ */
+MBWindowManagerClient*
+mb_wm_client_get_last_focused_transient (MBWindowManagerClient *client)
+{
+ MBWindowManagerClient *result=NULL, *c;
+
+ mb_wm_stack_enumerate (client->wmref, c)
+ if (c->transient_for == client)
+ result = c;
+
+ return result;
+}
+
MBWMList*
mb_wm_client_get_transients (MBWindowManagerClient *client)
{
Modified: projects/haf/trunk/libmatchbox2/matchbox/core/mb-wm-client.h
===================================================================
--- projects/haf/trunk/libmatchbox2/matchbox/core/mb-wm-client.h 2009-01-15 16:53:23 UTC (rev 17197)
+++ projects/haf/trunk/libmatchbox2/matchbox/core/mb-wm-client.h 2009-01-16 04:57:03 UTC (rev 17198)
@@ -150,13 +150,11 @@
MBWMClientLayoutHints layout_hints;
MBWindowManagerClient *stacked_above, *stacked_below;
- MBWindowManagerClient *next_focused_client;
MBGeometry frame_geometry; /* FIXME: in ->priv ? */
MBWMList *decor;
MBWMList *transients;
MBWindowManagerClient *transient_for;
- MBWindowManagerClient *last_focused_transient;
int skip_unmaps;
@@ -294,6 +292,12 @@
mb_wm_client_remove_transient (MBWindowManagerClient *client,
MBWindowManagerClient *transient);
+MBWindowManagerClient*
+mb_wm_client_get_next_focused_client (MBWindowManagerClient *client);
+
+MBWindowManagerClient*
+mb_wm_client_get_last_focused_transient (MBWindowManagerClient *client);
+
MBWMList*
mb_wm_client_get_transients (MBWindowManagerClient *client);
Modified: projects/haf/trunk/libmatchbox2/matchbox/core/mb-wm-stack.c
===================================================================
--- projects/haf/trunk/libmatchbox2/matchbox/core/mb-wm-stack.c 2009-01-15 16:53:23 UTC (rev 17197)
+++ projects/haf/trunk/libmatchbox2/matchbox/core/mb-wm-stack.c 2009-01-16 04:57:03 UTC (rev 17198)
@@ -37,11 +37,12 @@
void
mb_wm_stack_dump (MBWindowManager *wm)
{
-#if (MBWM_WANT_DEBUG)
+//#if (MBWM_WANT_DEBUG)
+#if 1
MBWindowManagerClient *client;
MBWMStackLayerType stacking_layer;
- fprintf(stderr, "\n==== window stack =====\n");
+ g_warning ("\n==== window stack =====\n");
mb_wm_stack_enumerate_reverse (wm, client)
{
@@ -62,7 +63,7 @@
stacking_layer = mb_wm_client_get_stacking_layer (client);
- fprintf(stderr, "%s XID: %lx NAME: %s, type %d, layer %d\n",
+ g_warning ("%s XID: %lx NAME: %s, type %d, layer %d\n",
prefix,
MB_WM_CLIENT_XWIN(client),
client->window->name ? client->window->name : "unknown",
@@ -70,7 +71,7 @@
stacking_layer);
}
- fprintf(stderr, "======================\n\n");
+ g_warning ("======================\n\n");
#endif
}
Modified: projects/haf/trunk/libmatchbox2/tests/test-transience.c
===================================================================
--- projects/haf/trunk/libmatchbox2/tests/test-transience.c 2009-01-15 16:53:23 UTC (rev 17197)
+++ projects/haf/trunk/libmatchbox2/tests/test-transience.c 2009-01-16 04:57:03 UTC (rev 17198)
@@ -23,15 +23,18 @@
#include <gtk/gtk.h>
#include <gdk/gdkx.h>
-GtkWidget *a, *b, *c;
+#include "hildon.h"
+GtkWidget *a;
+HildonDialog *b, *c;
+
static char current_window (void)
{
- if (gtk_window_has_toplevel_focus (GTK_WINDOW (a)))
+ if (a && gtk_window_has_toplevel_focus (GTK_WINDOW (a)))
return 'a';
- else if (gtk_window_has_toplevel_focus (GTK_WINDOW (b)))
+ else if (b && gtk_window_has_toplevel_focus (GTK_WINDOW (b)))
return 'b';
- else if (gtk_window_has_toplevel_focus (GTK_WINDOW (c)))
+ else if (c && gtk_window_has_toplevel_focus (GTK_WINDOW (c)))
return 'c';
else
return '?';
@@ -45,37 +48,43 @@
switch (count++)
{
case 0:
- a = gtk_window_new (GTK_WINDOW_TOPLEVEL);
- gtk_widget_show_all (a);
- g_warning ("Opened one window a");
+ a = hildon_window_new ();
+ gtk_window_set_title ( GTK_WINDOW (a), "a (should have two transients)");
+ gtk_widget_show_all (GTK_WIDGET (a));
+ g_warning ("Opened a window 'a'");
expecting = 'a';
break;
-
+
case 2:
- b = gtk_window_new (GTK_WINDOW_TOPLEVEL);
- gtk_widget_show_all (b);
- gtk_window_set_transient_for (GTK_WINDOW (a), GTK_WINDOW (b));
- g_warning ("Opened another window b, and set 'a' transient to 'b'");
+ b = HILDON_DIALOG (hildon_dialog_new ());
+ gtk_window_set_transient_for (GTK_WINDOW (b), GTK_WINDOW (a));
+ gtk_window_set_title ( GTK_WINDOW (b), "b (should be transient to a)");
+ gtk_widget_show_all (GTK_WIDGET (b));
+ g_warning ("Opened another window 'b' and set it transient to 'a'");
expecting = 'b';
break;
+
case 4:
- c = gtk_window_new (GTK_WINDOW_TOPLEVEL);
- gtk_widget_show_all (c);
- gtk_window_set_transient_for (GTK_WINDOW (c), GTK_WINDOW (b));
- g_warning ("Opened a third window c, and set 'c' transient to 'b'");
+ c = HILDON_DIALOG (hildon_dialog_new ());
+ gtk_window_set_title (GTK_WINDOW (c), "c (should also be transient to a)");
+ gtk_window_set_transient_for (GTK_WINDOW (c), GTK_WINDOW (a));
+ gtk_widget_show_all (GTK_WIDGET (c));
+ g_warning ("Opened a third window 'c', and set 'c' transient to 'a'");
expecting = 'c';
break;
-
+
case 6:
- gtk_widget_hide_all (c);
+ gtk_object_destroy (GTK_OBJECT (c)); c = NULL;
- g_warning ("Hidden that third window 'c'; focus should now pass to the other transient, 'a'");
- expecting = 'a';
+ g_warning ("Destroyed that third window 'c'; focus should now pass to the other transient, 'b'");
+ expecting = 'b';
break;
case 8:
g_warning ("Pass.");
+ gtk_object_destroy (GTK_OBJECT (a)); a = NULL;
+ gtk_object_destroy (GTK_OBJECT (b)); b = NULL;
gtk_main_quit ();
break;
@@ -85,13 +94,13 @@
else
{
g_warning ("Fail: %c is focussed but we expected %c.", current_window (),
- expecting);
- gtk_main_quit ();
+ expecting);
+ // gtk_main_quit ();
}
}
}
-int
+ int
main (int argc, char **argv)
{
- Previous message: [maemo-commits] r17197 - in projects/haf/trunk/clutter: clutter debian
- Next message: [maemo-commits] r17199 - in projects/haf/trunk/hildon-thumbnail: . daemon tests
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
