merge r6104-6108 from trunk
authorDana Jansens <danakj@orodu.net>
Sun, 6 May 2007 06:44:09 +0000 (06:44 +0000)
committerDana Jansens <danakj@orodu.net>
Sun, 6 May 2007 06:44:09 +0000 (06:44 +0000)
data/rc.xml.in
openbox/action.c
openbox/action.h
openbox/client.c
openbox/event.c
openbox/focus.c
openbox/focus.h
openbox/popup.c
openbox/popup.h
openbox/screen.c
openbox/screen.h

index bfffdd78e8896536bdb7bf4bc8fd6bf70997d746..28ec2ff18ad0c0e0c93f76ac8487b27f78b66b08 100644 (file)
   <number>4</number>
   <firstdesk>1</firstdesk>
   <names>
-    <name>one</name>
-    <name>two</name>
-    <name>three</name>
-    <name>four</name>
+    <name>desktop one</name>
+    <name>desktop two</name>
+    <name>desktop three</name>
+    <name>desktop four</name>
   </names>
 </desktops>
 
index 797552f69abd2c649704f496fcf29c5798ef2795..e056487f681294dfc055a7e99a9ff7ef9b534765 100644 (file)
@@ -293,6 +293,7 @@ void setup_action_cycle_windows_next(ObAction **a, ObUserAction uact)
     (*a)->data.cycle.forward = TRUE;
     (*a)->data.cycle.dialog = TRUE;
     (*a)->data.cycle.dock_windows = FALSE;
+    (*a)->data.cycle.all_desktops = FALSE;
 }
 
 void setup_action_cycle_windows_previous(ObAction **a, ObUserAction uact)
@@ -302,6 +303,7 @@ void setup_action_cycle_windows_previous(ObAction **a, ObUserAction uact)
     (*a)->data.cycle.forward = FALSE;
     (*a)->data.cycle.dialog = TRUE;
     (*a)->data.cycle.dock_windows = FALSE;
+    (*a)->data.cycle.all_desktops = FALSE;
 }
 
 void setup_action_movefromedge_north(ObAction **a, ObUserAction uact)
@@ -1009,6 +1011,9 @@ ObAction *action_parse(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node,
                     act->data.cycle.dialog = parse_bool(doc, n);
                 if ((n = parse_find_node("panels", node->xmlChildrenNode)))
                     act->data.cycle.dock_windows = parse_bool(doc, n);
+                if ((n = parse_find_node("allDesktops",
+                                         node->xmlChildrenNode)))
+                    act->data.cycle.all_desktops = parse_bool(doc, n);
             } else if (act->func == action_directional_focus) {
                 if ((n = parse_find_node("dialog", node->xmlChildrenNode)))
                     act->data.interdiraction.dialog = parse_bool(doc, n);
@@ -1512,7 +1517,7 @@ void action_send_to_desktop(union ActionData *data)
         data->sendto.desk == DESKTOP_ALL) {
         client_set_desktop(c, data->sendto.desk, data->sendto.follow);
         if (data->sendto.follow)
-            screen_set_desktop(data->sendto.desk);
+            screen_set_desktop(data->sendto.desk, TRUE);
     }
 }
 
@@ -1529,12 +1534,12 @@ void action_desktop(union ActionData *data)
         if (data->desktop.desk < screen_num_desktops ||
             data->desktop.desk == DESKTOP_ALL)
         {
-            screen_set_desktop(data->desktop.desk);
+            screen_set_desktop(data->desktop.desk, TRUE);
             if (data->inter.any.interactive)
                 screen_desktop_popup(data->desktop.desk, TRUE);
         }
     } else if (data->inter.cancel) {
-        screen_set_desktop(first);
+        screen_set_desktop(first, TRUE);
     }
 
     if (!data->inter.any.interactive || data->inter.final) {
@@ -1557,7 +1562,7 @@ void action_desktop_dir(union ActionData *data)
         !data->sendtodir.inter.final ||
         data->sendtodir.inter.cancel)
     {
-        screen_set_desktop(d);
+        screen_set_desktop(d, TRUE);
     }
 }
 
@@ -1579,13 +1584,13 @@ void action_send_to_desktop_dir(union ActionData *data)
     {
         client_set_desktop(c, d, data->sendtodir.follow);
         if (data->sendtodir.follow)
-            screen_set_desktop(d);
+            screen_set_desktop(d, TRUE);
     }
 }
 
 void action_desktop_last(union ActionData *data)
 {
-    screen_set_desktop(screen_last_desktop);
+    screen_set_desktop(screen_last_desktop, TRUE);
 }
 
 void action_toggle_decorations(union ActionData *data)
@@ -1771,6 +1776,7 @@ void action_cycle_windows(union ActionData *data)
     event_halt_focus_delay();
 
     focus_cycle(data->cycle.forward,
+                data->cycle.all_desktops,
                 data->cycle.dock_windows,
                 data->cycle.linear, data->any.interactive,
                 data->cycle.dialog,
index c4c06fa886db8fcde92d45be0bf291346de69e2f..7e3a09c81f5156886ac836ed4038b1adf9b162ba 100644 (file)
@@ -143,6 +143,7 @@ struct CycleWindows {
     gboolean forward;
     gboolean dialog;
     gboolean dock_windows;
+    gboolean all_desktops;
 };
 
 struct Stacking {
index c18139fbde72bd8c918889e9beecbc90b326de73..0caaa4b54a2484a04f97c2836c476b3b0b7b4662 100644 (file)
@@ -3297,7 +3297,7 @@ static void client_present(ObClient *self, gboolean here, gboolean raise)
         if (here)
             client_set_desktop(self, screen_desktop, FALSE);
         else
-            screen_set_desktop(self->desktop);
+            screen_set_desktop(self->desktop, FALSE);
     } else if (!self->frame->visible)
         /* if its not visible for other reasons, then don't mess
            with it */
index 3666e9fdfd2ca983a74320cb04fa055b2516093c..2dcb6af2f220e1811294ae1533273ad0e3bc3935 100644 (file)
@@ -591,7 +591,7 @@ static void event_handle_root(XEvent *e)
                     ob_debug_type(OB_DEBUG_APP_BUGS,
                                   "_NET_CURRENT_DESKTOP message is missing "
                                   "a timestamp\n");
-                screen_set_desktop(d);
+                screen_set_desktop(d, TRUE);
             }
         } else if (msgtype == prop_atoms.net_number_of_desktops) {
             guint d = e->xclient.data.l[0];
index cf65ff25a9b16cbeb8c6a87a09a060b292dbd67f..fbac20ec35ff17c9562195e88428c5d49dc2468a 100644 (file)
@@ -61,7 +61,7 @@ static void focus_cycle_destructor(ObClient *client, gpointer data)
        be used
     */
     if (focus_cycle_target == client)
-        focus_cycle(TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE);
+        focus_cycle(TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE);
 }
 
 static Window createWindow(Window parent, gulong mask,
@@ -170,7 +170,7 @@ void focus_set_client(ObClient *client)
        be used.
     */
     if (focus_cycle_target)
-        focus_cycle(TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE);
+        focus_cycle(TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE);
 
     focus_client = client;
 
@@ -295,8 +295,10 @@ static void popup_cycle(ObClient *c, gboolean show)
         icon_popup_hide(focus_cycle_popup);
     } else {
         Rect *a;
-        ObClient *p = c;
+        ObClient *p;
+        gchar *text;
         gchar *title = NULL;
+        const gchar *desk = NULL;
 
         a = screen_physical_area_monitor(0);
         icon_popup_position(focus_cycle_popup, CenterGravity,
@@ -305,20 +307,27 @@ static void popup_cycle(ObClient *c, gboolean show)
         icon_popup_height(focus_cycle_popup, POPUP_HEIGHT);
 
         /* use the transient's parent's title/icon */
-        while (p->transient_for && p->transient_for != OB_TRAN_GROUP)
-            p = p->transient_for;
+        p = client_search_top_parent(c);
+
+        if (c->desktop != DESKTOP_ALL && c->desktop != screen_desktop)
+            desk = screen_desktop_names[c->desktop];
 
         if (p != c && !strcmp("", (c->iconic ? c->icon_title : c->title)))
             title = g_strdup(p->iconic ? p->icon_title : p->title);
-            /*title = g_strconcat((c->iconic ? c->icon_title : c->title),
+            /*ptitle = g_strconcat((c->iconic ? c->icon_title : c->title),
                                 " - ",
                                 (p->iconic ? p->icon_title : p->title),
                                 NULL);
             */
-        icon_popup_show(focus_cycle_popup,
-                        (title ? title :
-                         (c->iconic ? c->icon_title : c->title)),
-                        client_icon(p, 48, 48));
+        if (title == NULL)
+            title = g_strdup(c->iconic ? c->icon_title : c->title);
+        if (desk)
+            text = g_strdup_printf("%s [%s]", title, desk);
+        else
+            text = g_strdup(title);
+
+        icon_popup_show(focus_cycle_popup, text, client_icon(p, 48, 48));
+        g_free(text);
         g_free(title);
     }
 }
@@ -457,7 +466,9 @@ void focus_cycle_draw_indicator()
     }
 }
 
-static gboolean valid_focus_target(ObClient *ft, gboolean dock_windows)
+static gboolean valid_focus_target(ObClient *ft,
+                                   gboolean all_desktops,
+                                   gboolean dock_windows)
 {
     gboolean ok = FALSE;
     /* we don't use client_can_focus here, because that doesn't let you
@@ -483,7 +494,9 @@ static gboolean valid_focus_target(ObClient *ft, gboolean dock_windows)
           ft->type == OB_CLIENT_TYPE_MENU ||    /* being allowed to target */
           ft->type == OB_CLIENT_TYPE_UTILITY))  /* one of these, don't let */
         ok = ok && !ft->skip_taskbar;           /*  skip taskbar stop us */
-    ok = ok && (ft->desktop == screen_desktop || ft->desktop == DESKTOP_ALL);
+    if (!all_desktops)
+        ok = ok && (ft->desktop == screen_desktop ||
+                    ft->desktop == DESKTOP_ALL);
     ok = ok && ft == client_focus_target(ft);
     return ok;
 /*
@@ -501,7 +514,8 @@ static gboolean valid_focus_target(ObClient *ft, gboolean dock_windows)
 */
 }
 
-void focus_cycle(gboolean forward, gboolean dock_windows,
+void focus_cycle(gboolean forward, gboolean all_desktops,
+                 gboolean dock_windows,
                  gboolean linear, gboolean interactive,
                  gboolean dialog, gboolean done, gboolean cancel)
 {
@@ -546,7 +560,7 @@ void focus_cycle(gboolean forward, gboolean dock_windows,
             if (it == NULL) it = g_list_last(list);
         }
         ft = it->data;
-        if (valid_focus_target(ft, dock_windows)) {
+        if (valid_focus_target(ft, all_desktops, dock_windows)) {
             if (interactive) {
                 if (ft != focus_cycle_target) { /* prevents flicker */
                     focus_cycle_target = ft;
@@ -712,7 +726,7 @@ void focus_directional_cycle(ObDirection dir, gboolean dock_windows,
         GList *it;
 
         for (it = focus_order; it; it = g_list_next(it))
-            if (valid_focus_target(it->data, dock_windows))
+            if (valid_focus_target(it->data, FALSE, dock_windows))
                 ft = it->data;
     }
         
index b838ab559722881ca28d78eb53c84f31b45297a7..1c8cb1575efec7f64a46ba50a1318a91d9dd7404 100644 (file)
@@ -52,7 +52,8 @@ struct _ObClient* focus_fallback_target(gboolean allow_refocus,
 void focus_fallback(gboolean allow_refocus);
 
 /*! Cycle focus amongst windows. */
-void focus_cycle(gboolean forward, gboolean dock_windows,
+void focus_cycle(gboolean forward, gboolean all_desktops,
+                 gboolean dock_windows,
                  gboolean linear, gboolean interactive,
                  gboolean dialog, gboolean done, gboolean cancel);
 void focus_directional_cycle(ObDirection dir, gboolean dock_windows,
index a3c94653dd9ed0f98ff02484e67a628ed7a80415..82a78f1dea5e10e764b97bd01d8155f5a97d56c2 100644 (file)
@@ -91,6 +91,7 @@ void popup_position(ObPopup *self, gint gravity, gint x, gint y)
 void popup_width(ObPopup *self, gint w)
 {
     self->w = w;
+    self->maxw = w;
 }
 
 void popup_height(ObPopup *self, gint h)
@@ -104,19 +105,9 @@ void popup_height(ObPopup *self, gint h)
 
 void popup_width_to_string(ObPopup *self, gchar *text, gint max)
 {
-    gint textw, iconw;
-
     self->a_text->texture[0].data.text.string = text;
-    textw = RrMinWidth(self->a_text);
-    if (self->hasicon) {
-        gint texth = RrMinHeight(self->a_text) + ob_rr_theme->paddingy * 2;
-        iconw = texth;
-    } else
-        iconw = 0;
-    self->w = textw + iconw + ob_rr_theme->paddingx * (self->hasicon ? 3 : 2);
-    /* cap it at "max" */
-    if (max > 0)
-        self->w = MIN(self->w, max);
+    self->w = RrMinWidth(self->a_text);
+    self->maxw = max;
 }
 
 void popup_height_to_string(ObPopup *self, gchar *text)
@@ -124,12 +115,12 @@ void popup_height_to_string(ObPopup *self, gchar *text)
     self->h = RrMinHeight(self->a_text) + ob_rr_theme->paddingy * 2;
 }
 
-void popup_width_to_strings(ObPopup *self, gchar **strings, gint max)
+void popup_width_to_strings(ObPopup *self, gchar **strings, gint num, gint max)
 {
     gint i, maxw;
 
     maxw = 0;
-    for (i = 0; strings[i] != NULL; ++i) {
+    for (i = 0; i < num; ++i) {
         popup_width_to_string(self, strings[i], max);
         maxw = MAX(maxw, self->w);
     }
@@ -174,13 +165,13 @@ void popup_delay_show(ObPopup *self, gulong usec, gchar *text)
     } else
         h = t+b + texth + ob_rr_theme->paddingy * 2;
     iconw = (self->hasicon ? texth : 0);
-    if (self->w) {
-        w = self->w;
-        textw = w - (l+r + iconw + ob_rr_theme->paddingx *
-                     (self->hasicon ? 3 : 2));
-    } else
-        w = l+r + textw + iconw + ob_rr_theme->paddingx *
-            (self->hasicon ? 3 : 2);
+    if (self->w)
+        textw = self->w;
+    w = l+r + textw + iconw + ob_rr_theme->paddingx *
+        (self->hasicon ? 3 : 2);
+    /* cap it at "maxw" */
+    w = MIN(w, self->maxw);
+
     /* sanity checks to avoid crashes! */
     if (w < 1) w = 1;
     if (h < 1) h = 1;
@@ -452,6 +443,7 @@ ObPagerPopup *pager_popup_new()
     self->hilight = RrAppearanceCopy(ob_rr_theme->osd_hilite_fg);
     self->unhilight = RrAppearanceCopy(ob_rr_theme->osd_unhilite_fg);
 
+    self->popup->hasicon = TRUE;
     self->popup->draw_icon = pager_popup_draw_icon;
     self->popup->draw_icon_data = self;
 
index c16e4cab08633b247d753eb3ef3cacbe9d5a54e5..4b07bd9d7920066ee114eaa62eae1250c4ace679 100644 (file)
@@ -47,6 +47,7 @@ struct _ObPopup
     gint y;
     gint w;
     gint h;
+    gint maxw;
     gboolean mapped;
     gboolean delay_mapped;
  
@@ -88,7 +89,7 @@ void popup_width(ObPopup *self, gint w);
 void popup_height(ObPopup *self, gint w);
 void popup_width_to_string(ObPopup *self, gchar *text, gint max);
 void popup_height_to_string(ObPopup *self, gchar *text);
-void popup_width_to_strings(ObPopup *self, gchar **strings, gint max);
+void popup_width_to_strings(ObPopup *self, gchar **strings, gint num,gint max);
 
 void popup_set_text_align(ObPopup *self, RrJustify align);
 
@@ -109,10 +110,10 @@ void icon_popup_delay_show(ObIconPopup *self, gulong usec,
 #define icon_popup_position(p, g, x, y) popup_position((p)->popup,(g),(x),(y))
 #define icon_popup_width(p, w) popup_width((p)->popup,(w))
 #define icon_popup_height(p, h) popup_height((p)->popup,(h))
-#define icon_popup_width_to_string(p, s, m) \
-    popup_width_to_string((p)->popup,(s),(m))
-#define icon_popup_width_to_strings(p, s, m) \
-    popup_width_to_strings((p)->popup,(s),(m))
+#define icon_popup_width_to_string(p, s, n, m) \
+    popup_width_to_string((p)->popup,(s),(n),(m))
+#define icon_popup_width_to_strings(p, s, n, m) \
+    popup_width_to_strings((p)->popup,(s),(n),(m))
 #define icon_popup_set_text_align(p, j) popup_set_text_align((p)->popup,(j))
 
 ObPagerPopup *pager_popup_new();
@@ -125,10 +126,10 @@ void pager_popup_delay_show(ObPagerPopup *self, gulong usec,
 #define pager_popup_position(p, g, x, y) popup_position((p)->popup,(g),(x),(y))
 #define pager_popup_width(p, w) popup_width((p)->popup,(w))
 #define pager_popup_height(p, h) popup_height((p)->popup,(h))
-#define pager_popup_width_to_string(p, s, m) \
-    popup_width_to_string((p)->popup,(s),(m))
-#define pager_popup_width_to_strings(p, s, m) \
-    popup_width_to_strings((p)->popup,(s),(m))
+#define pager_popup_width_to_string(p, s, n, m) \
+    popup_width_to_string((p)->popup,(s),(n),(m))
+#define pager_popup_width_to_strings(p, s, n, m) \
+    popup_width_to_strings((p)->popup,(s),(n),(m))
 #define pager_popup_set_text_align(p, j) popup_set_text_align((p)->popup,(j))
 
 #endif
index a32f649f0a5348a64c33d00f31dce70ac9fa1157..148aaf5ae04519069a1535982adc33aa7fbbe9af 100644 (file)
@@ -302,20 +302,29 @@ void screen_startup(gboolean reconfig)
     guint i;
 
     desktop_cycle_popup = pager_popup_new(FALSE);
+    pager_popup_height(desktop_cycle_popup, POPUP_HEIGHT);
 
     if (!reconfig)
         /* get the initial size */
         screen_resize();
 
-    /* set the names */
-    screen_desktop_names = g_new(gchar*,
-                                 g_slist_length(config_desktops_names) + 1);
-    for (i = 0, it = config_desktops_names; it; ++i, it = g_slist_next(it))
-        screen_desktop_names[i] = it->data; /* dont strdup */
-    screen_desktop_names[i] = NULL;
+    /* get the names */
+    if (PROP_GETSS(RootWindow(ob_display, ob_screen),
+                   net_desktop_names, utf8, &screen_desktop_names))
+        for (i = 0; screen_desktop_names[i]; ++i);
+    else
+        i = 0;
+    for (it = g_slist_nth(config_desktops_names, i); it;
+         it = g_slist_next(it), ++i)
+    {
+        screen_desktop_names = g_renew(gchar*, screen_desktop_names, i + 2);
+        screen_desktop_names[i+1] = NULL;
+        screen_desktop_names[i] = g_strdup(it->data);
+    }
+    /* then set the names */
     PROP_SETSS(RootWindow(ob_display, ob_screen),
                net_desktop_names, screen_desktop_names);
-    g_free(screen_desktop_names); /* dont free the individual strings */
+    g_strfreev(screen_desktop_names);
     screen_desktop_names = NULL;
 
     if (!reconfig)
@@ -328,13 +337,13 @@ void screen_startup(gboolean reconfig)
                        net_current_desktop, cardinal, &d) &&
             d < screen_num_desktops)
         {
-            screen_set_desktop(d);
+            screen_set_desktop(d, FALSE);
         } else if (session_desktop >= 0)
             screen_set_desktop(MIN((guint)session_desktop,
-                                   screen_num_desktops));
+                                   screen_num_desktops), FALSE);
         else
             screen_set_desktop(MIN(config_screen_firstdesk,
-                                   screen_num_desktops) - 1);
+                                   screen_num_desktops) - 1, FALSE);
 
         /* don't start in showing-desktop mode */
         screen_showing_desktop = FALSE;
@@ -427,9 +436,6 @@ void screen_set_num_desktops(guint num)
     /* the number of rows/columns will differ */
     screen_update_layout();
 
-    /* may be some unnamed desktops that we need to fill in with names */
-    screen_update_desktop_names();
-
     /* move windows on desktops that will no longer exist! */
     for (it = client_list; it; it = g_list_next(it)) {
         ObClient *c = it->data;
@@ -440,12 +446,16 @@ void screen_set_num_desktops(guint num)
     /* change our struts/area to match (after moving windows) */
     screen_update_areas();
 
+    /* may be some unnamed desktops that we need to fill in with names
+     (after updating the areas so the popup can resize) */
+    screen_update_desktop_names();
+
     /* change our desktop if we're on one that no longer exists! */
     if (screen_desktop >= screen_num_desktops)
-        screen_set_desktop(num - 1);
+        screen_set_desktop(num - 1, TRUE);
 }
 
-void screen_set_desktop(guint num)
+void screen_set_desktop(guint num, gboolean dofocus)
 {
     ObClient *c;
     GList *it;
@@ -487,7 +497,7 @@ void screen_set_desktop(guint num)
 
     /* have to try focus here because when you leave an empty desktop
        there is no focus out to watch for */
-    if ((c = focus_fallback_target(TRUE, focus_client))) {
+    if (dofocus && (c = focus_fallback_target(TRUE, focus_client))) {
         /* reduce flicker by hiliting now rather than waiting for the server
            FocusIn event */
         frame_adjust_focus(c->frame, TRUE);
@@ -618,9 +628,6 @@ void screen_desktop_popup(guint d, gboolean show)
         a = screen_physical_area_monitor(0);
         pager_popup_position(desktop_cycle_popup, CenterGravity,
                              a->x + a->width / 2, a->y + a->height / 2);
-        pager_popup_width(desktop_cycle_popup, MAX(a->width/3, POPUP_WIDTH));
-        pager_popup_height(desktop_cycle_popup, POPUP_HEIGHT);
-
         pager_popup_show(desktop_cycle_popup, screen_desktop_names[d], d);
     }
 }
@@ -876,8 +883,15 @@ void screen_update_desktop_names()
                                        screen_num_desktops + 1);
         screen_desktop_names[screen_num_desktops] = NULL;
         for (; i < screen_num_desktops; ++i)
-            screen_desktop_names[i] = g_strdup_printf("Desktop %i", i + 1);
+            screen_desktop_names[i] = g_strdup_printf("desktop %i", i + 1);
     }
+
+    /* resize the pager for these names */
+    pager_popup_width_to_strings(desktop_cycle_popup,
+                                 screen_desktop_names,
+                                 screen_num_desktops,
+                                 MAX(screen_physical_area_monitor(0)->width/3,
+                                     POPUP_WIDTH));
 }
 
 void screen_show_desktop(gboolean show, gboolean restore_focus)
index 558081b5a308c06018ba6976904a5accf51e3d1e..b4c510a71456cfac05e9e143803b6fbca714b82f 100644 (file)
@@ -66,7 +66,7 @@ void screen_resize();
 /*! Change the number of available desktops */
 void screen_set_num_desktops(guint num);
 /*! Change the current desktop */
-void screen_set_desktop(guint num);
+void screen_set_desktop(guint num, gboolean dofocus);
 /*! Interactively change desktops */
 guint screen_cycle_desktop(ObDirection dir, gboolean wrap, gboolean linear,
                            gboolean dialog, gboolean done, gboolean cancel);