diff --git a/ChangeLog b/ChangeLog index 0e61bc01a..9040fbbe1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,20 @@ +2004-12-19 Elijah Newren + + Focus the desktop when showing it. Fixes #159257. + + * src/display.c (event_callback): obtain a timestamp to pass to + meta_screen_show_desktop + + * src/keybindings.c (handle_toggle_desktop): obtain a timestamp to + pass to meta_screen_show_desktop + + * src/screen.c (meta_screen_show_desktop): add a timestamp + parameter, get the most recently used window of type DESKTOP (if + there is one) and focus it + + * src/screen.h (meta_screen_show_desktop): add a timestamp + parameter + 2004-12-19 Elijah Newren Thanks to ash@contact.bg for this fix. diff --git a/src/display.c b/src/display.c index 225d6c754..65692a4d5 100644 --- a/src/display.c +++ b/src/display.c @@ -2152,7 +2152,7 @@ event_callback (XEvent *event, meta_verbose ("Request to %s desktop\n", showing_desktop ? "show" : "hide"); if (showing_desktop) - meta_screen_show_desktop (screen); + meta_screen_show_desktop (screen, meta_display_get_current_time_roundtrip (display)); else { meta_screen_unshow_desktop (screen); diff --git a/src/keybindings.c b/src/keybindings.c index 3adb85f06..27e82ce09 100644 --- a/src/keybindings.c +++ b/src/keybindings.c @@ -2837,7 +2837,7 @@ handle_toggle_desktop (MetaDisplay *display, event->xkey.time); } else - meta_screen_show_desktop (screen); + meta_screen_show_desktop (screen, event->xkey.time); } static void diff --git a/src/screen.c b/src/screen.c index 9cb462d15..ab07dd80f 100644 --- a/src/screen.c +++ b/src/screen.c @@ -2229,14 +2229,36 @@ meta_screen_minimize_all_on_active_workspace_except (MetaScreen *screen, } void -meta_screen_show_desktop (MetaScreen *screen) +meta_screen_show_desktop (MetaScreen *screen, + Time timestamp) { + GList *windows; + if (screen->active_workspace->showing_desktop) return; screen->active_workspace->showing_desktop = TRUE; queue_windows_showing (screen); + + /* Focus the most recently used META_WINDOW_DESKTOP window, if there is one; + * see bug 159257. + */ + windows = screen->active_workspace->mru_list; + while (windows != NULL) + { + MetaWindow *w = windows->data; + + if (w->screen == screen && + w->type == META_WINDOW_DESKTOP) + { + meta_window_focus (w, timestamp); + break; + } + + windows = windows->next; + } + meta_screen_update_showing_desktop_hint (screen); } diff --git a/src/screen.h b/src/screen.h index 30b45d01b..46bf2208f 100644 --- a/src/screen.h +++ b/src/screen.h @@ -200,7 +200,8 @@ void meta_screen_minimize_all_on_active_workspace_except (MetaScreen *screen MetaWindow *keep); /* Show/hide the desktop (temporarily hide all windows) */ -void meta_screen_show_desktop (MetaScreen *screen); +void meta_screen_show_desktop (MetaScreen *screen, + Time timestamp); void meta_screen_unshow_desktop (MetaScreen *screen); /* Update whether the destkop is being shown for the current active_workspace */