]> Dogcows Code - chaz/openbox/blobdiff - openbox/screen.c
restore the desktop names and number from the session. don't clobber them if they...
[chaz/openbox] / openbox / screen.c
index 1cbb2a5ec2ecceb765442b593dab7ad14d24b428..61e46b71ee0fc93d3be031a8ed644de14c655ba7 100644 (file)
@@ -56,7 +56,7 @@ guint    screen_desktop;
 guint    screen_last_desktop;
 Size     screen_physical_size;
 gboolean screen_showing_desktop;
-DesktopLayout screen_desktop_layout;
+ObDesktopLayout screen_desktop_layout;
 gchar  **screen_desktop_names;
 Window   screen_support_win;
 Time     screen_desktop_user_time = CurrentTime;
@@ -153,7 +153,7 @@ static gboolean replace_wm()
     return TRUE;
 }
 
-gboolean screen_annex(const gchar *program_name)
+gboolean screen_annex()
 {
     XSetWindowAttributes attrib;
     pid_t pid;
@@ -190,7 +190,6 @@ gboolean screen_annex(const gchar *program_name)
         return FALSE;
     }
 
-
     screen_set_root_cursor();
 
     /* set the OPENBOX_PID hint */
@@ -203,7 +202,7 @@ gboolean screen_annex(const gchar *program_name)
                net_supporting_wm_check, window, screen_support_win);
 
     /* set properties on the supporting window */
-    PROP_SETS(screen_support_win, net_wm_name, program_name);
+    PROP_SETS(screen_support_win, net_wm_name, "Openbox");
     PROP_SET32(screen_support_win, net_supporting_wm_check,
                window, screen_support_win);
 
@@ -289,10 +288,11 @@ gboolean screen_annex(const gchar *program_name)
     supported[i++] = prop_atoms.kde_net_wm_frame_strut;
     supported[i++] = prop_atoms.kde_net_wm_window_type_override;
 
-    supported[i++] = prop_atoms.openbox_wm_state_undecorated;
+    supported[i++] = prop_atoms.ob_wm_action_undecorate;
+    supported[i++] = prop_atoms.ob_wm_state_undecorated;
     supported[i++] = prop_atoms.openbox_pid;
-    supported[i++] = prop_atoms.openbox_config;
-    supported[i++] = prop_atoms.openbox_control;
+    supported[i++] = prop_atoms.ob_config;
+    supported[i++] = prop_atoms.ob_control;
     g_assert(i == num_support);
 
     PROP_SETA32(RootWindow(ob_display, ob_screen),
@@ -304,10 +304,9 @@ gboolean screen_annex(const gchar *program_name)
 
 void screen_startup(gboolean reconfig)
 {
-    guint i, numnames;
-    gchar **names;
-    GSList *it;
+    gchar **names = NULL;
     guint32 d;
+    gboolean namesexist = FALSE;
 
     desktop_cycle_popup = pager_popup_new(FALSE);
     pager_popup_height(desktop_cycle_popup, POPUP_HEIGHT);
@@ -323,21 +322,48 @@ void screen_startup(gboolean reconfig)
     /* get the initial size */
     screen_resize();
 
-    /* get the desktop names */
-    numnames = g_slist_length(config_desktops_names);
-    names = g_new(gchar*, numnames + 1);
-    names[numnames] = NULL;
-    for (i = 0, it = config_desktops_names; it; ++i, it = g_slist_next(it))
-        names[i] = g_strdup(it->data);
+    /* have names already been set for the desktops? */
+    if (PROP_GETSS(RootWindow(ob_display, ob_screen),
+                   net_desktop_names, utf8, &names))
+    {
+        g_strfreev(names);
+        namesexist = TRUE;
+    }
+
+    /* if names don't exist and we have session names, set those.
+       do this stuff BEFORE setting the number of desktops, because that
+       will create default names for them
+    */
+    if (!namesexist && session_desktop_names != NULL) {
+        guint i, numnames;
+        GSList *it;
 
-    /* set the root window property */
-    PROP_SETSS(RootWindow(ob_display, ob_screen), net_desktop_names,names);
+        /* get the desktop names */
+        numnames = g_slist_length(session_desktop_names);
+        names = g_new(gchar*, numnames + 1);
+        names[numnames] = NULL;
+        for (i = 0, it = session_desktop_names; it; ++i, it = g_slist_next(it))
+            names[i] = g_strdup(it->data);
 
-    g_strfreev(names);
+        /* set the root window property */
+        PROP_SETSS(RootWindow(ob_display, ob_screen), net_desktop_names,names);
 
-    /* set the number of desktops */
+        g_strfreev(names);
+    }
+
+    /* set the number of desktops, if it's not already set.
+
+       this will also set the default names from the config file up for
+       desktops that don't have names yet */
     screen_num_desktops = 0;
-    screen_set_num_desktops(config_desktops_num);
+    if (PROP_GET32(RootWindow(ob_display, ob_screen),
+                   net_number_of_desktops, cardinal, &d))
+        screen_set_num_desktops(d);
+    /* restore from session if possible */
+    else if (session_num_desktops)
+        screen_set_num_desktops(session_num_desktops);
+    else
+        screen_set_num_desktops(config_desktops_num);
 
     /* start on the current desktop when a wm was already running */
     if (PROP_GET32(RootWindow(ob_display, ob_screen),
@@ -357,7 +383,10 @@ void screen_startup(gboolean reconfig)
     PROP_SET32(RootWindow(ob_display, ob_screen),
                net_showing_desktop, cardinal, screen_showing_desktop);
 
-    screen_update_layout();
+    if (session_desktop_layout_present)
+        screen_desktop_layout = session_desktop_layout;
+    else
+        screen_update_layout();
 }
 
 void screen_shutdown(gboolean reconfig)
@@ -506,12 +535,12 @@ void screen_set_desktop(guint num, gboolean dofocus)
            to call xsetinputfocus on the window ourselves. otherwise there is
            no guarantee the window will actually take focus.. */
         if (c->can_focus) {
-            /* do this here so that if you switch desktops to a window with
-               helper windows then the helper windows won't flash */
-            client_bring_helper_windows(c);
             /* reduce flicker by hiliting now rather than waiting for the
                server FocusIn event */
             frame_adjust_focus(c->frame, TRUE);
+            /* do this here so that if you switch desktops to a window with
+               helper windows then the helper windows won't flash */
+            client_bring_helper_windows(c);
         }
     }
 
@@ -523,7 +552,7 @@ void screen_set_desktop(guint num, gboolean dofocus)
         }
     }
 
-    event_ignore_queued_enters();
+    event_ignore_all_queued_enters();
 
     if (event_curtime != CurrentTime)
         screen_desktop_user_time = event_curtime;
@@ -663,7 +692,7 @@ guint screen_cycle_desktop(ObDirection dir, gboolean wrap, gboolean linear,
 {
     guint r, c;
     static guint d = (guint)-1;
-    guint ret;
+    guint ret, oldd;
 
     if (d == (guint)-1)
         d = screen_desktop;
@@ -671,6 +700,7 @@ guint screen_cycle_desktop(ObDirection dir, gboolean wrap, gboolean linear,
     if ((cancel || done) && dialog)
         goto show_cycle_dialog;
 
+    oldd = d;
     get_row_col(d, &r, &c);
 
     if (linear) {
@@ -696,19 +726,17 @@ guint screen_cycle_desktop(ObDirection dir, gboolean wrap, gboolean linear,
         case OB_DIRECTION_EAST:
             ++c;
             if (c >= screen_desktop_layout.columns) {
-                if (wrap) {
+                if (wrap)
                     c = 0;
-                } else {
-                    d = screen_desktop;
+                else
                     goto show_cycle_dialog;
-                }
             }
             d = translate_row_col(r, c);
             if (d >= screen_num_desktops) {
                 if (wrap) {
                     ++c;
                 } else {
-                    d = screen_desktop;
+                    d = oldd;
                     goto show_cycle_dialog;
                 }
             }
@@ -716,19 +744,17 @@ guint screen_cycle_desktop(ObDirection dir, gboolean wrap, gboolean linear,
         case OB_DIRECTION_WEST:
             --c;
             if (c >= screen_desktop_layout.columns) {
-                if (wrap) {
+                if (wrap)
                     c = screen_desktop_layout.columns - 1;
-                } else {
-                    d = screen_desktop;
+                else
                     goto show_cycle_dialog;
-                }
             }
             d = translate_row_col(r, c);
             if (d >= screen_num_desktops) {
                 if (wrap) {
                     --c;
                 } else {
-                    d = screen_desktop;
+                    d = oldd;
                     goto show_cycle_dialog;
                 }
             }
@@ -736,19 +762,17 @@ guint screen_cycle_desktop(ObDirection dir, gboolean wrap, gboolean linear,
         case OB_DIRECTION_SOUTH:
             ++r;
             if (r >= screen_desktop_layout.rows) {
-                if (wrap) {
+                if (wrap)
                     r = 0;
-                } else {
-                    d = screen_desktop;
+                else
                     goto show_cycle_dialog;
-                }
             }
             d = translate_row_col(r, c);
             if (d >= screen_num_desktops) {
                 if (wrap) {
                     ++r;
                 } else {
-                    d = screen_desktop;
+                    d = oldd;
                     goto show_cycle_dialog;
                 }
             }
@@ -756,19 +780,17 @@ guint screen_cycle_desktop(ObDirection dir, gboolean wrap, gboolean linear,
         case OB_DIRECTION_NORTH:
             --r;
             if (r >= screen_desktop_layout.rows) {
-                if (wrap) {
+                if (wrap)
                     r = screen_desktop_layout.rows - 1;
-                } else {
-                    d = screen_desktop;
+                else
                     goto show_cycle_dialog;
-                }
             }
             d = translate_row_col(r, c);
             if (d >= screen_num_desktops) {
                 if (wrap) {
                     --r;
                 } else {
-                    d = screen_desktop;
+                    d = oldd;
                     goto show_cycle_dialog;
                 }
             }
@@ -899,11 +921,28 @@ void screen_update_desktop_names()
     else
         i = 0;
     if (i < screen_num_desktops) {
+        GSList *it;
+
         screen_desktop_names = g_renew(gchar*, screen_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);
+
+        it = g_slist_nth(config_desktops_names, i);
+
+        for (; i < screen_num_desktops; ++i) {
+            if (it)
+                /* use the names from the config file when possible */
+                screen_desktop_names[i] = g_strdup(it->data);
+            else
+                /* make up a nice name if it's not though */
+                screen_desktop_names[i] = g_strdup_printf("desktop %i", i + 1);
+            if (it) it = g_slist_next(it);
+        }
+
+        /* if we changed any names, then set the root property so we can
+           all agree on the names */
+        PROP_SETSS(RootWindow(ob_display, ob_screen), net_desktop_names,
+                   screen_desktop_names);
     }
 
     /* resize the pager for these names */
@@ -1277,7 +1316,7 @@ void screen_set_root_cursor()
 {
     if (sn_app_starting())
         XDefineCursor(ob_display, RootWindow(ob_display, ob_screen),
-                      ob_cursor(OB_CURSOR_BUSY));
+                      ob_cursor(OB_CURSOR_BUSYPOINTER));
     else
         XDefineCursor(ob_display, RootWindow(ob_display, ob_screen),
                       ob_cursor(OB_CURSOR_POINTER));
This page took 0.031615 seconds and 4 git commands to generate.