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:
committed by
Carlos R. Mafra
parent
86fbf8baaa
commit
df7fb014e5
@@ -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
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user