X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fscreen.c;h=1cbb2a5ec2ecceb765442b593dab7ad14d24b428;hb=7a39cb3e8db767effc47508168b4b1dffb321224;hp=190468aa93dda8478313b52fc0e48bf7e3a9170b;hpb=7f262bc2a0733a77ae5a30752aecdcf4ba35f223;p=chaz%2Fopenbox diff --git a/openbox/screen.c b/openbox/screen.c index 190468aa..1cbb2a5e 100644 --- a/openbox/screen.c +++ b/openbox/screen.c @@ -258,6 +258,8 @@ gboolean screen_annex(const gchar *program_name) supported[i++] = prop_atoms.net_wm_action_fullscreen; supported[i++] = prop_atoms.net_wm_action_change_desktop; supported[i++] = prop_atoms.net_wm_action_close; + supported[i++] = prop_atoms.net_wm_action_above; + supported[i++] = prop_atoms.net_wm_action_below; supported[i++] = prop_atoms.net_wm_state; supported[i++] = prop_atoms.net_wm_state_modal; supported[i++] = prop_atoms.net_wm_state_maximized_vert; @@ -276,6 +278,7 @@ gboolean screen_annex(const gchar *program_name) 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; @@ -309,8 +312,13 @@ void screen_startup(gboolean reconfig) desktop_cycle_popup = pager_popup_new(FALSE); pager_popup_height(desktop_cycle_popup, POPUP_HEIGHT); - if (reconfig) + if (reconfig) { + /* update the pager popup's width */ + pager_popup_text_width_to_strings(desktop_cycle_popup, + screen_desktop_names, + screen_num_desktops); return; + } /* get the initial size */ screen_resize(); @@ -493,7 +501,7 @@ void screen_set_desktop(guint num, gboolean dofocus) 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))) { + if (dofocus && (c = focus_fallback(TRUE))) { /* 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.. */ @@ -505,7 +513,6 @@ void screen_set_desktop(guint num, gboolean dofocus) server FocusIn event */ frame_adjust_focus(c->frame, TRUE); } - client_focus(c); } /* hide windows from bottom to top */ @@ -640,6 +647,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); @@ -649,9 +661,12 @@ void screen_desktop_popup(guint d, gboolean show) guint screen_cycle_desktop(ObDirection dir, gboolean wrap, gboolean linear, gboolean dialog, gboolean done, gboolean cancel) { - guint d, r, c; + guint r, c; + static guint d = (guint)-1; + guint ret; - d = screen_desktop; + if (d == (guint)-1) + d = screen_desktop; if ((cancel || done) && dialog) goto show_cycle_dialog; @@ -771,7 +786,12 @@ show_cycle_dialog: screen_desktop_popup(d, TRUE); } else screen_desktop_popup(0, FALSE); - return d; + ret = d; + + if (!dialog || cancel || done) + d = (guint)-1; + + return ret; } void screen_update_layout() @@ -892,7 +912,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; @@ -901,25 +921,31 @@ 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); + } } } } if (show) { - /* focus desktop */ + /* focus the desktop */ for (it = focus_order; it; it = g_list_next(it)) { ObClient *c = it->data; if (c->type == OB_CLIENT_TYPE_DESKTOP && @@ -927,13 +953,20 @@ 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 - and we don't want to fallback to the desktop by default */ - if ((c = focus_fallback_target(TRUE, NULL))) - client_focus(c); + if ((c = focus_fallback(TRUE))) { + /* 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) { + /* reduce flicker by hiliting now rather than waiting for the + server FocusIn event */ + frame_adjust_focus(c->frame, TRUE); + } + } } show = !!show; /* make it boolean */