]> Dogcows Code - chaz/openbox/blobdiff - openbox/screen.c
when un-showing the desktop if a window is getting shown, iconify the others so just...
[chaz/openbox] / openbox / screen.c
index 1faf521eced56e9edebc131a2f02be0b74babf72..3819a3b1415cf70ff8becbaabe2ed45bb4eef9d2 100644 (file)
@@ -273,7 +273,10 @@ gboolean screen_annex(const gchar *program_name)
     supported[i++] = prop_atoms.net_moveresize_window;
     supported[i++] = prop_atoms.net_wm_moveresize;
     supported[i++] = prop_atoms.net_wm_user_time;
+    supported[i++] = prop_atoms.net_wm_user_time_window;
     supported[i++] = prop_atoms.net_frame_extents;
+    supported[i++] = prop_atoms.net_request_frame_extents;
+    supported[i++] = prop_atoms.net_restack_window;
     supported[i++] = prop_atoms.net_startup_id;
 #ifdef SYNC
     supported[i++] = prop_atoms.net_wm_sync_request;
@@ -299,55 +302,55 @@ gboolean screen_annex(const gchar *program_name)
 
 void screen_startup(gboolean reconfig)
 {
-    if (!reconfig) {
-        guint i, numnames;
-        gchar **names;
-        GSList *it;
+    guint i, numnames;
+    gchar **names;
+    GSList *it;
+    guint32 d;
 
-        /* get the initial size */
-        screen_resize();
+    desktop_cycle_popup = pager_popup_new(FALSE);
+    pager_popup_height(desktop_cycle_popup, POPUP_HEIGHT);
 
-        /* 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);
+    if (reconfig)
+        return;
 
-        /* set the root window property */
-        PROP_SETSS(RootWindow(ob_display, ob_screen), net_desktop_names,names);
+    /* get the initial size */
+    screen_resize();
 
-        g_strfreev(names);
-    }
+    /* 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);
 
-    desktop_cycle_popup = pager_popup_new(FALSE);
-    pager_popup_height(desktop_cycle_popup, POPUP_HEIGHT);
+    /* set the root window property */
+    PROP_SETSS(RootWindow(ob_display, ob_screen), net_desktop_names,names);
 
-    if (!reconfig)
-        screen_num_desktops = 0;
+    g_strfreev(names);
+
+    /* set the number of desktops */
+    screen_num_desktops = 0;
     screen_set_num_desktops(config_desktops_num);
-    if (!reconfig) {
-        guint32 d;
-        /* start on the current desktop when a wm was already running */
-        if (PROP_GET32(RootWindow(ob_display, ob_screen),
-                       net_current_desktop, cardinal, &d) &&
-            d < screen_num_desktops)
-        {
-            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, FALSE);
 
-        /* don't start in showing-desktop mode */
-        screen_showing_desktop = FALSE;
-        PROP_SET32(RootWindow(ob_display, ob_screen),
-                   net_showing_desktop, cardinal, screen_showing_desktop);
+    /* start on the current desktop when a wm was already running */
+    if (PROP_GET32(RootWindow(ob_display, ob_screen),
+                   net_current_desktop, cardinal, &d) &&
+        d < screen_num_desktops)
+    {
+        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, FALSE);
 
-        screen_update_layout();
-    }
+    /* don't start in showing-desktop mode */
+    screen_showing_desktop = FALSE;
+    PROP_SET32(RootWindow(ob_display, ob_screen),
+               net_showing_desktop, cardinal, screen_showing_desktop);
+
+    screen_update_layout();
 }
 
 void screen_shutdown(gboolean reconfig)
@@ -356,22 +359,24 @@ void screen_shutdown(gboolean reconfig)
 
     pager_popup_free(desktop_cycle_popup);
 
-    if (!reconfig) {
-        XSelectInput(ob_display, RootWindow(ob_display, ob_screen),
-                     NoEventMask);
+    if (reconfig)
+        return;
 
-        /* we're not running here no more! */
-        PROP_ERASE(RootWindow(ob_display, ob_screen), openbox_pid);
-        /* not without us */
-        PROP_ERASE(RootWindow(ob_display, ob_screen), net_supported);
-        /* don't keep this mode */
-        PROP_ERASE(RootWindow(ob_display, ob_screen), net_showing_desktop);
+    XSelectInput(ob_display, RootWindow(ob_display, ob_screen),
+                 NoEventMask);
 
-        XDestroyWindow(ob_display, screen_support_win);
-    }
+    /* we're not running here no more! */
+    PROP_ERASE(RootWindow(ob_display, ob_screen), openbox_pid);
+    /* not without us */
+    PROP_ERASE(RootWindow(ob_display, ob_screen), net_supported);
+    /* don't keep this mode */
+    PROP_ERASE(RootWindow(ob_display, ob_screen), net_showing_desktop);
+
+    XDestroyWindow(ob_display, screen_support_win);
 
     g_strfreev(screen_desktop_names);
     screen_desktop_names = NULL;
+
     for (r = area; *r; ++r)
         g_free(*r);
     g_free(area);
@@ -483,6 +488,27 @@ void screen_set_desktop(guint num, gboolean dofocus)
         }
     }
 
+    /* have to try focus here because when you leave an empty desktop
+       there is no focus out to watch for
+
+       do this before hiding the windows so if helper windows are coming
+       with us, they don't get hidden
+    */
+    if (dofocus && (c = focus_fallback_target(TRUE, focus_client))) {
+        /* only do the flicker reducing stuff ahead of time if we are going
+           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);
+        }
+        client_focus(c);
+    }
+
     /* hide windows from bottom to top */
     for (it = g_list_last(stacking_list); it; it = g_list_previous(it)) {
         if (WINDOW_IS_CLIENT(it->data)) {
@@ -491,15 +517,6 @@ void screen_set_desktop(guint num, gboolean dofocus)
         }
     }
 
-    /* have to try focus here because when you leave an empty desktop
-       there is no focus out to watch for */
-    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);
-        client_focus(c);
-    }
-
     event_ignore_queued_enters();
 
     if (event_curtime != CurrentTime)
@@ -624,6 +641,11 @@ 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_icon_size_multiplier(desktop_cycle_popup,
+                                         (screen_desktop_layout.columns /
+                                          screen_desktop_layout.rows) / 2,
+                                         (screen_desktop_layout.rows/
+                                          screen_desktop_layout.columns) / 2);
         pager_popup_max_width(desktop_cycle_popup,
                               MAX(a->width/3, POPUP_WIDTH));
         pager_popup_show(desktop_cycle_popup, screen_desktop_names[d], d);
@@ -633,20 +655,15 @@ void screen_desktop_popup(guint d, gboolean show)
 guint screen_cycle_desktop(ObDirection dir, gboolean wrap, gboolean linear,
                            gboolean dialog, gboolean done, gboolean cancel)
 {
-    static gboolean first = TRUE;
-    static guint origd, d;
     guint r, c;
+    static guint d = (guint)-1;
+    guint ret;
 
-    if (cancel) {
-        d = origd;
-        goto done_cycle;
-    } else if (done && dialog) {
-        goto done_cycle;
-    }
-    if (first) {
-        first = FALSE;
-        d = origd = screen_desktop;
-    }
+    if (d == (guint)-1)
+        d = screen_desktop;
+
+    if ((cancel || done) && dialog)
+        goto show_cycle_dialog;
 
     get_row_col(d, &r, &c);
 
@@ -759,17 +776,16 @@ guint screen_cycle_desktop(ObDirection dir, gboolean wrap, gboolean linear,
     }
 
 show_cycle_dialog:
-    if (dialog) {
+    if (dialog && !cancel && !done) {
         screen_desktop_popup(d, TRUE);
-        return d;
-    }
+    } else
+        screen_desktop_popup(0, FALSE);
+    ret = d;
 
-done_cycle:
-    first = TRUE;
+    if (!dialog || cancel || done)
+        d = (guint)-1;
 
-    screen_desktop_popup(0, FALSE);
-
-    return d;
+    return ret;
 }
 
 void screen_update_layout()
@@ -890,7 +906,7 @@ void screen_update_desktop_names()
                                       screen_num_desktops);
 }
 
-void screen_show_desktop(gboolean show, gboolean restore_focus)
+void screen_show_desktop(gboolean show, ObClient *show_only)
 {
     GList *it;
      
@@ -899,19 +915,25 @@ void screen_show_desktop(gboolean show, gboolean restore_focus)
     screen_showing_desktop = show;
 
     if (show) {
-        /* bottom to top */
+        /* hide windows bottom to top */
         for (it = g_list_last(stacking_list); it; it = g_list_previous(it)) {
             if (WINDOW_IS_CLIENT(it->data)) {
                 ObClient *client = it->data;
                 client_showhide(client);
             }
         }
-    } else {
-        /* top to bottom */
+    }
+    else {
+        /* restore windows top to bottom */
         for (it = stacking_list; it; it = g_list_next(it)) {
             if (WINDOW_IS_CLIENT(it->data)) {
                 ObClient *client = it->data;
-                client_showhide(client);
+                if (client_should_show(client)) {
+                    if (!show_only || client == show_only)
+                        client_show(client);
+                    else
+                        client_iconify(client, TRUE, FALSE, TRUE);
+                }
             }
         }
     }
@@ -925,7 +947,8 @@ void screen_show_desktop(gboolean show, gboolean restore_focus)
                 client_focus(it->data))
                 break;
         }
-    } else if (restore_focus) {
+    }
+    else if (!show_only) {
         ObClient *c;
 
         /* use NULL for the "old" argument because the desktop was focused
@@ -1253,7 +1276,16 @@ gboolean screen_pointer_pos(gint *x, gint *y)
     Window w;
     gint i;
     guint u;
-
-    return !!XQueryPointer(ob_display, RootWindow(ob_display, ob_screen),
-                           &w, &w, x, y, &i, &i, &u);
+    gboolean ret;
+
+    ret = !!XQueryPointer(ob_display, RootWindow(ob_display, ob_screen),
+                          &w, &w, x, y, &i, &i, &u);
+    if (!ret) {
+        for (i = 0; i < ScreenCount(ob_display); ++i)
+            if (i != ob_screen)
+                if (XQueryPointer(ob_display, RootWindow(ob_display, i),
+                                  &w, &w, x, y, &i, &i, &u))
+                    break;
+    }
+    return ret;
 }
This page took 0.028211 seconds and 4 git commands to generate.