1
0
mirror of https://github.com/gryf/wmaker.git synced 2025-12-19 20:38:08 +01:00

Focus fullscreen windows.

Windows which enter fullscreen mode were not automatically given focus.
Usually that didn't matter because they already had focus when they
switched modes.  An example of unexpected behaviour is opening a media
file in an already-running vlc from the commandline or via a file manager.
vlc would fullscreen mode but the launching application would retain focus.

Note that if vlc were not already running and it was launched as
described above, it would receive focus when it was opened and thus
retain focus going into fullscreen.

We now track which window had focus before a window enters fullscreen
mode and focus the original window afterwards.  In the (usual) case
where the window going fullscreen already had focus, nothing changes.
In the rarer case where the window going fullscreen didn't
have focus, it will gain focus temporarily then yield to the originally
focussed window when it leaves fullscreen mode.

To reproduce:

  * Launch vlc and configure it to switch to fullscreen when playing a
movie and to disallow multiple instances.

  * Switch to a terminal and type 'vlc /media/funny_cats.mp4' or use a
file manager to open funny_cats.mp4 with vlc.

  * Press space to pause the movie.  Nothing happens because the
terminal/file manager still has focus.
This commit is contained in:
Iain Patterson
2013-10-17 11:08:19 +01:00
committed by Carlos R. Mafra
parent 86fbf8baaa
commit df7fb014e5
3 changed files with 16 additions and 0 deletions

View File

@@ -712,6 +712,9 @@ void wFullscreenWindow(WWindow *wwin)
rect = wGetRectForHead(wwin->screen_ptr, head); rect = wGetRectForHead(wwin->screen_ptr, head);
wWindowConfigure(wwin, rect.pos.x, rect.pos.y, rect.size.width, rect.size.height); wWindowConfigure(wwin, rect.pos.x, rect.pos.y, rect.size.width, rect.size.height);
wwin->screen_ptr->bfs_focused_window = wwin->screen_ptr->focused_window;
wSetFocusTo(wwin->screen_ptr, wwin);
WMPostNotificationName(WMNChangedState, wwin, "fullscreen"); WMPostNotificationName(WMNChangedState, wwin, "fullscreen");
} }
@@ -742,6 +745,11 @@ void wUnfullscreenWindow(WWindow *wwin)
*/ */
WMPostNotificationName(WMNChangedState, wwin, "fullscreen"); WMPostNotificationName(WMNChangedState, wwin, "fullscreen");
if (wwin->screen_ptr->bfs_focused_window) {
wSetFocusTo(wwin->screen_ptr, wwin->screen_ptr->bfs_focused_window);
wwin->screen_ptr->bfs_focused_window = NULL;
}
} }
#ifdef ANIMATIONS #ifdef ANIMATIONS

View File

@@ -97,6 +97,9 @@ typedef struct _WScreen {
* Use this list if you want to * Use this list if you want to
* traverse the entire window list * traverse the entire window list
*/ */
struct WWindow *bfs_focused_window; /* window that had focus before
* another window entered fullscreen
*/
WMArray *selected_windows; WMArray *selected_windows;

View File

@@ -1455,6 +1455,11 @@ void wUnmanageWindow(WWindow *wwin, Bool restore, Bool destroyed)
if (wwin->flags.menu_open_for_me) if (wwin->flags.menu_open_for_me)
CloseWindowMenu(scr); CloseWindowMenu(scr);
/* Don't restore focus to this window after a window exits
* fullscreen mode */
if (scr->bfs_focused_window == wwin)
scr->bfs_focused_window = NULL;
if (!destroyed) { if (!destroyed) {
if (!wwin->flags.internal_window) if (!wwin->flags.internal_window)
XRemoveFromSaveSet(dpy, wwin->client_win); XRemoveFromSaveSet(dpy, wwin->client_win);