X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fscreen.c;h=544bcdbd9ea2bbf064a9ef383ca0d3b8fcb280be;hb=420e6f87a6503b713e4d9047f809538ec0c60d41;hp=7f0c70c96ddc2e915f75dd932c46bca814a45f13;hpb=07c3a31cf5794447d3a5a52086cdeb808d817f3a;p=chaz%2Fopenbox diff --git a/openbox/screen.c b/openbox/screen.c index 7f0c70c9..544bcdbd 100644 --- a/openbox/screen.c +++ b/openbox/screen.c @@ -74,6 +74,8 @@ static gboolean replace_wm() g_free(wm_sn); current_wm_sn_owner = XGetSelectionOwner(ob_display, wm_sn_atom); + if (current_wm_sn_owner == screen_support_win) + current_wm_sn_owner = None; if (current_wm_sn_owner) { if (!ob_replace_wm) { g_warning("A window manager is already running on screen %d", @@ -438,16 +440,16 @@ void screen_set_desktop(guint num) /* show windows before hiding the rest to lessen the enter/leave events */ /* show windows from top to bottom */ - for (it = stacking_list; it != NULL; it = it->next) { + for (it = stacking_list; it; it = g_list_next(it)) { if (WINDOW_IS_CLIENT(it->data)) { ObClient *c = it->data; - if (!c->frame->visible && client_should_show(c)) + if (client_should_show(c)) frame_show(c->frame); } } /* hide windows from bottom to top */ - for (it = g_list_last(stacking_list); it != NULL; it = it->prev) { + for (it = g_list_last(stacking_list); it; it = g_list_previous(it)) { if (WINDOW_IS_CLIENT(it->data)) { ObClient *c = it->data; if (c->frame->visible && !client_should_show(c)) @@ -457,7 +459,18 @@ void screen_set_desktop(guint num) event_ignore_queued_enters(); - focus_fallback(OB_FOCUS_FALLBACK_NOFOCUS); + focus_hilite = focus_fallback_target(OB_FOCUS_FALLBACK_NOFOCUS); + if (focus_hilite) { + frame_adjust_focus(focus_hilite->frame, TRUE); + + /*! + When this focus_client check is not used, you can end up with races, + as demonstrated with gnome-panel, sometmies the window you click on + another desktop ends up losing focus cuz of the focus change here. + */ + /*if (!focus_client)*/ + client_focus(focus_hilite); + } } static void get_row_col(guint d, guint *r, guint *c) @@ -633,49 +646,81 @@ guint screen_cycle_desktop(ObDirection dir, gboolean wrap, gboolean linear, case OB_DIRECTION_EAST: ++c; if (c >= screen_desktop_layout.columns) { - if (!wrap) return d = screen_desktop; - c = 0; + if (wrap) { + c = 0; + } else { + d = screen_desktop; + goto show_cycle_dialog; + } } d = translate_row_col(r, c); if (d >= screen_num_desktops) { - if (!wrap) return d = screen_desktop; - ++c; + if (wrap) { + ++c; + } else { + d = screen_desktop; + goto show_cycle_dialog; + } } break; case OB_DIRECTION_WEST: --c; if (c >= screen_desktop_layout.columns) { - if (!wrap) return d = screen_desktop; - c = screen_desktop_layout.columns - 1; + if (wrap) { + c = screen_desktop_layout.columns - 1; + } else { + d = screen_desktop; + goto show_cycle_dialog; + } } d = translate_row_col(r, c); if (d >= screen_num_desktops) { - if (!wrap) return d = screen_desktop; - --c; + if (wrap) { + --c; + } else { + d = screen_desktop; + goto show_cycle_dialog; + } } break; case OB_DIRECTION_SOUTH: ++r; if (r >= screen_desktop_layout.rows) { - if (!wrap) return d = screen_desktop; - r = 0; + if (wrap) { + r = 0; + } else { + d = screen_desktop; + goto show_cycle_dialog; + } } d = translate_row_col(r, c); if (d >= screen_num_desktops) { - if (!wrap) return d = screen_desktop; - ++r; + if (wrap) { + ++r; + } else { + d = screen_desktop; + goto show_cycle_dialog; + } } break; case OB_DIRECTION_NORTH: --r; if (r >= screen_desktop_layout.rows) { - if (!wrap) return d = screen_desktop; - r = screen_desktop_layout.rows - 1; + if (wrap) { + r = screen_desktop_layout.rows - 1; + } else { + d = screen_desktop; + goto show_cycle_dialog; + } } d = translate_row_col(r, c); if (d >= screen_num_desktops) { - if (!wrap) return d = screen_desktop; - --r; + if (wrap) { + --r; + } else { + d = screen_desktop; + goto show_cycle_dialog; + } } break; default: @@ -686,6 +731,7 @@ guint screen_cycle_desktop(ObDirection dir, gboolean wrap, gboolean linear, d = translate_row_col(r, c); } +show_cycle_dialog: if (dialog) { screen_desktop_popup(d, TRUE); return d; @@ -860,10 +906,10 @@ void screen_install_colormap(ObClient *client, gboolean install) XWindowAttributes wa; if (client == NULL) { - if (install) - XInstallColormap(RrDisplay(ob_rr_inst), RrColormap(ob_rr_inst)); - else - XUninstallColormap(RrDisplay(ob_rr_inst), RrColormap(ob_rr_inst)); + if (install) + XInstallColormap(RrDisplay(ob_rr_inst), RrColormap(ob_rr_inst)); + else + XUninstallColormap(RrDisplay(ob_rr_inst), RrColormap(ob_rr_inst)); } else { if (XGetWindowAttributes(ob_display, client->window, &wa) && wa.colormap != None) {