]> Dogcows Code - chaz/openbox/blobdiff - openbox/screen.c
popups fixes. if the text for the popup is empty now, there wont be extra padding...
[chaz/openbox] / openbox / screen.c
index db7c8ace460222ff7abafa4c2d8abc4472ef6a43..1faf521eced56e9edebc131a2f02be0b74babf72 100644 (file)
@@ -28,6 +28,7 @@
 #include "config.h"
 #include "screen.h"
 #include "client.h"
+#include "session.h"
 #include "frame.h"
 #include "event.h"
 #include "focus.h"
@@ -146,17 +147,18 @@ static gboolean replace_wm()
 
     /* Send client message indicating that we are now the WM */
     prop_message(RootWindow(ob_display, ob_screen), prop_atoms.manager,
-                 timestamp, wm_sn_atom, 0, 0, SubstructureNotifyMask);
-
+                 timestamp, wm_sn_atom, screen_support_win, 0,
+                 SubstructureNotifyMask);
 
     return TRUE;
 }
 
-gboolean screen_annex()
+gboolean screen_annex(const gchar *program_name)
 {
     XSetWindowAttributes attrib;
     pid_t pid;
     gint i, num_support;
+    Atom *prop_atoms_start, *wm_supported_pos;
     gulong *supported;
 
     /* create the netwm support window */
@@ -168,6 +170,7 @@ gboolean screen_annex()
                                        CopyFromParent,
                                        CWOverrideRedirect, &attrib);
     XMapWindow(ob_display, screen_support_win);
+    XLowerWindow(ob_display, screen_support_win);
 
     if (!replace_wm()) {
         XDestroyWindow(ob_display, screen_support_win);
@@ -200,17 +203,20 @@ gboolean screen_annex()
                net_supporting_wm_check, window, screen_support_win);
 
     /* set properties on the supporting window */
-    PROP_SETS(screen_support_win, net_wm_name, "Openbox");
+    PROP_SETS(screen_support_win, net_wm_name, program_name);
     PROP_SET32(screen_support_win, net_supporting_wm_check,
                window, screen_support_win);
 
     /* set the _NET_SUPPORTED_ATOMS hint */
-    num_support = 55;
-#ifdef SYNC
-    num_support += 2;
-#endif
+
+    /* this is all the atoms after net_supported in the prop_atoms struct */
+    prop_atoms_start = (Atom*)&prop_atoms;
+    wm_supported_pos = (Atom*)&(prop_atoms.net_supported);
+    num_support = sizeof(prop_atoms) / sizeof(Atom) -
+        (wm_supported_pos - prop_atoms_start) - 1;
     i = 0;
     supported = g_new(gulong, num_support);
+    supported[i++] = prop_atoms.net_supporting_wm_check;
     supported[i++] = prop_atoms.net_wm_full_placement;
     supported[i++] = prop_atoms.net_current_desktop;
     supported[i++] = prop_atoms.net_number_of_desktops;
@@ -230,6 +236,9 @@ gboolean screen_annex()
     supported[i++] = prop_atoms.net_wm_visible_icon_name;
     supported[i++] = prop_atoms.net_wm_desktop;
     supported[i++] = prop_atoms.net_wm_strut;
+    supported[i++] = prop_atoms.net_wm_strut_partial;
+    supported[i++] = prop_atoms.net_wm_icon;
+    supported[i++] = prop_atoms.net_wm_icon_geometry;
     supported[i++] = prop_atoms.net_wm_window_type;
     supported[i++] = prop_atoms.net_wm_window_type_desktop;
     supported[i++] = prop_atoms.net_wm_window_type_dock;
@@ -265,11 +274,20 @@ gboolean screen_annex()
     supported[i++] = prop_atoms.net_wm_moveresize;
     supported[i++] = prop_atoms.net_wm_user_time;
     supported[i++] = prop_atoms.net_frame_extents;
+    supported[i++] = prop_atoms.net_startup_id;
 #ifdef SYNC
     supported[i++] = prop_atoms.net_wm_sync_request;
     supported[i++] = prop_atoms.net_wm_sync_request_counter;
 #endif
-    supported[i++] = prop_atoms.ob_wm_state_undecorated;
+
+    supported[i++] = prop_atoms.kde_wm_change_state;
+    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.openbox_pid;
+    supported[i++] = prop_atoms.openbox_config;
+    supported[i++] = prop_atoms.openbox_control;
     g_assert(i == num_support);
 
     PROP_SETA32(RootWindow(ob_display, ob_screen),
@@ -281,25 +299,29 @@ gboolean screen_annex()
 
 void screen_startup(gboolean reconfig)
 {
-    GSList *it;
-    guint i;
-
-    desktop_cycle_popup = pager_popup_new(FALSE);
+    if (!reconfig) {
+        guint i, numnames;
+        gchar **names;
+        GSList *it;
 
-    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;
-    PROP_SETSS(RootWindow(ob_display, ob_screen),
-               net_desktop_names, screen_desktop_names);
-    g_free(screen_desktop_names); /* dont free the individual strings */
-    screen_desktop_names = NULL;
+        /* 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);
+
+        /* set the root window property */
+        PROP_SETSS(RootWindow(ob_display, ob_screen), net_desktop_names,names);
+
+        g_strfreev(names);
+    }
+
+    desktop_cycle_popup = pager_popup_new(FALSE);
+    pager_popup_height(desktop_cycle_popup, POPUP_HEIGHT);
 
     if (!reconfig)
         screen_num_desktops = 0;
@@ -311,10 +333,13 @@ void screen_startup(gboolean reconfig)
                        net_current_desktop, cardinal, &d) &&
             d < screen_num_desktops)
         {
-            screen_set_desktop(d);
-        } else
+            screen_set_desktop(d, FALSE);
+        } else if (session_desktop >= 0)
+            screen_set_desktop(MIN((guint)session_desktop,
+                                   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;
@@ -407,9 +432,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;
@@ -420,12 +442,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;
@@ -449,7 +475,7 @@ void screen_set_desktop(guint num)
 
     /* show windows before hiding the rest to lessen the enter/leave events */
 
-    /* show/hide windows from top to bottom */
+    /* show windows from top to bottom */
     for (it = stacking_list; it; it = g_list_next(it)) {
         if (WINDOW_IS_CLIENT(it->data)) {
             ObClient *c = it->data;
@@ -467,7 +493,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);
@@ -598,12 +624,8 @@ 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);
-        /* XXX the size and the font extents need to be related on some level
-         */
-        pager_popup_size(desktop_cycle_popup, POPUP_WIDTH, POPUP_HEIGHT);
-
-        pager_popup_set_text_align(desktop_cycle_popup, RR_JUSTIFY_CENTER);
-
+        pager_popup_max_width(desktop_cycle_popup,
+                              MAX(a->width/3, POPUP_WIDTH));
         pager_popup_show(desktop_cycle_popup, screen_desktop_names[d], d);
     }
 }
@@ -851,19 +873,24 @@ void screen_update_desktop_names()
 
     if (PROP_GETSS(RootWindow(ob_display, ob_screen),
                    net_desktop_names, utf8, &screen_desktop_names))
-        for (i = 0; screen_desktop_names[i] && i <= screen_num_desktops; ++i);
+        for (i = 0; screen_desktop_names[i] && i < screen_num_desktops; ++i);
     else
         i = 0;
-    if (i <= screen_num_desktops) {
+    if (i < screen_num_desktops) {
         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);
+            screen_desktop_names[i] = g_strdup_printf("desktop %i", i + 1);
     }
+
+    /* resize the pager for these names */
+    pager_popup_text_width_to_strings(desktop_cycle_popup,
+                                      screen_desktop_names,
+                                      screen_num_desktops);
 }
 
-void screen_show_desktop(gboolean show)
+void screen_show_desktop(gboolean show, gboolean restore_focus)
 {
     GList *it;
      
@@ -898,7 +925,7 @@ void screen_show_desktop(gboolean show)
                 client_focus(it->data))
                 break;
         }
-    } else {
+    } else if (restore_focus) {
         ObClient *c;
 
         /* use NULL for the "old" argument because the desktop was focused
This page took 0.02829 seconds and 4 git commands to generate.