fallback focus when removing a desktop without doing a fake desktop switch
This commit is contained in:
parent
9c9095ffac
commit
c7e0368a4b
1 changed files with 56 additions and 39 deletions
|
@ -54,6 +54,7 @@
|
||||||
static gboolean screen_validate_layout(ObDesktopLayout *l);
|
static gboolean screen_validate_layout(ObDesktopLayout *l);
|
||||||
static gboolean replace_wm();
|
static gboolean replace_wm();
|
||||||
static void screen_tell_ksplash();
|
static void screen_tell_ksplash();
|
||||||
|
static void screen_fallback_focus();
|
||||||
|
|
||||||
guint screen_num_desktops;
|
guint screen_num_desktops;
|
||||||
guint screen_num_monitors;
|
guint screen_num_monitors;
|
||||||
|
@ -535,13 +536,50 @@ void screen_set_num_desktops(guint num)
|
||||||
screen_set_desktop(num - 1, TRUE);
|
screen_set_desktop(num - 1, TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
void screen_set_desktop(guint num, gboolean dofocus)
|
static void screen_fallback_focus()
|
||||||
{
|
{
|
||||||
ObClient *c;
|
ObClient *c;
|
||||||
|
gboolean allow_omni;
|
||||||
|
|
||||||
|
/* only allow omnipresent windows to get focus on desktop change if
|
||||||
|
an omnipresent window is already focused (it'll keep focus probably, but
|
||||||
|
maybe not depending on mouse-focus options) */
|
||||||
|
allow_omni = focus_client && (client_normal(focus_client) &&
|
||||||
|
focus_client->desktop == DESKTOP_ALL);
|
||||||
|
|
||||||
|
/* the client moved there already so don't move focus. prevent flicker
|
||||||
|
on sendtodesktop + follow */
|
||||||
|
if (focus_client && focus_client->desktop == screen_desktop)
|
||||||
|
return;
|
||||||
|
|
||||||
|
/* have to try focus here because when you leave an empty desktop
|
||||||
|
there is no focus out to watch for. also, we have different rules
|
||||||
|
here. we always allow it to look under the mouse pointer if
|
||||||
|
config_focus_last is FALSE
|
||||||
|
|
||||||
|
do this before hiding the windows so if helper windows are coming
|
||||||
|
with us, they don't get hidden
|
||||||
|
*/
|
||||||
|
if ((c = focus_fallback(TRUE, !config_focus_last, allow_omni))) {
|
||||||
|
/* 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);
|
||||||
|
/* do this here so that if you switch desktops to a window with
|
||||||
|
helper windows then the helper windows won't flash */
|
||||||
|
client_bring_helper_windows(c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void screen_set_desktop(guint num, gboolean dofocus)
|
||||||
|
{
|
||||||
GList *it;
|
GList *it;
|
||||||
guint old;
|
guint old;
|
||||||
gulong ignore_start;
|
gulong ignore_start;
|
||||||
gboolean allow_omni;
|
|
||||||
|
|
||||||
g_assert(num < screen_num_desktops);
|
g_assert(num < screen_num_desktops);
|
||||||
|
|
||||||
|
@ -573,39 +611,7 @@ void screen_set_desktop(guint num, gboolean dofocus)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* only allow omnipresent windows to get focus on desktop change if
|
if (dofocus) screen_fallback_focus();
|
||||||
an omnipresent window is already focused (it'll keep focus probably, but
|
|
||||||
maybe not depending on mouse-focus options) */
|
|
||||||
allow_omni = focus_client && (client_normal(focus_client) &&
|
|
||||||
focus_client->desktop == DESKTOP_ALL);
|
|
||||||
|
|
||||||
/* the client moved there already so don't move focus. prevent flicker
|
|
||||||
on sendtodesktop + follow */
|
|
||||||
if (focus_client && focus_client->desktop == screen_desktop)
|
|
||||||
dofocus = FALSE;
|
|
||||||
|
|
||||||
/* have to try focus here because when you leave an empty desktop
|
|
||||||
there is no focus out to watch for. also, we have different rules
|
|
||||||
here. we always allow it to look under the mouse pointer if
|
|
||||||
config_focus_last is FALSE
|
|
||||||
|
|
||||||
do this before hiding the windows so if helper windows are coming
|
|
||||||
with us, they don't get hidden
|
|
||||||
*/
|
|
||||||
if (dofocus && (c = focus_fallback(TRUE, !config_focus_last, allow_omni)))
|
|
||||||
{
|
|
||||||
/* 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);
|
|
||||||
/* do this here so that if you switch desktops to a window with
|
|
||||||
helper windows then the helper windows won't flash */
|
|
||||||
client_bring_helper_windows(c);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* hide windows from bottom to top */
|
/* hide windows from bottom to top */
|
||||||
for (it = g_list_last(stacking_list); it; it = g_list_previous(it)) {
|
for (it = g_list_last(stacking_list); it; it = g_list_previous(it)) {
|
||||||
|
@ -626,6 +632,11 @@ void screen_set_desktop(guint num, gboolean dofocus)
|
||||||
|
|
||||||
void screen_add_desktop(gboolean current)
|
void screen_add_desktop(gboolean current)
|
||||||
{
|
{
|
||||||
|
gulong ignore_start;
|
||||||
|
|
||||||
|
/* ignore enter events caused by this */
|
||||||
|
ignore_start = event_start_ignore_all_enters();
|
||||||
|
|
||||||
screen_set_num_desktops(screen_num_desktops+1);
|
screen_set_num_desktops(screen_num_desktops+1);
|
||||||
|
|
||||||
/* move all the clients over */
|
/* move all the clients over */
|
||||||
|
@ -644,15 +655,21 @@ void screen_add_desktop(gboolean current)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
event_end_ignore_all_enters(ignore_start);
|
||||||
}
|
}
|
||||||
|
|
||||||
void screen_remove_desktop(gboolean current)
|
void screen_remove_desktop(gboolean current)
|
||||||
{
|
{
|
||||||
guint rmdesktop, movedesktop;
|
guint rmdesktop, movedesktop;
|
||||||
GList *it, *stacking_copy;
|
GList *it, *stacking_copy;
|
||||||
|
gulong ignore_start;
|
||||||
|
|
||||||
if (screen_num_desktops <= 1) return;
|
if (screen_num_desktops <= 1) return;
|
||||||
|
|
||||||
|
/* ignore enter events caused by this */
|
||||||
|
ignore_start = event_start_ignore_all_enters();
|
||||||
|
|
||||||
/* what desktop are we removing and moving to? */
|
/* what desktop are we removing and moving to? */
|
||||||
if (current)
|
if (current)
|
||||||
rmdesktop = screen_desktop;
|
rmdesktop = screen_desktop;
|
||||||
|
@ -689,15 +706,15 @@ void screen_remove_desktop(gboolean current)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* act like we're changing desktops */
|
/* fallback focus like we're changing desktops */
|
||||||
if (screen_desktop < screen_num_desktops - 1) {
|
if (screen_desktop < screen_num_desktops - 1) {
|
||||||
gint d = screen_desktop;
|
screen_fallback_focus();
|
||||||
screen_desktop = screen_last_desktop;
|
|
||||||
screen_set_desktop(d, TRUE);
|
|
||||||
ob_debug("fake desktop change\n");
|
ob_debug("fake desktop change\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
screen_set_num_desktops(screen_num_desktops-1);
|
screen_set_num_desktops(screen_num_desktops-1);
|
||||||
|
|
||||||
|
event_end_ignore_all_enters(ignore_start);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void get_row_col(guint d, guint *r, guint *c)
|
static void get_row_col(guint d, guint *r, guint *c)
|
||||||
|
|
Loading…
Reference in a new issue