From 92f80b2557b36875b8d173ba3d1c782772b601d7 Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Tue, 24 Jul 2007 16:40:31 -0400 Subject: use the moveresize client to find the active monitor too --- openbox/screen.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'openbox/screen.c') diff --git a/openbox/screen.c b/openbox/screen.c index 9bbd13d1..330cb0a2 100644 --- a/openbox/screen.c +++ b/openbox/screen.c @@ -1555,7 +1555,9 @@ Rect* screen_physical_area_active() Rect *a; gint x, y; - if (focus_client) + if (moveresize_client) + a = screen_physical_area_monitor(client_monitor(focus_client)); + else if (focus_client) a = screen_physical_area_monitor(client_monitor(focus_client)); else { Rect mon; -- cgit v1.2.3 From dacc9dac7a8232180fb824fe2eea7d026def99c9 Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Wed, 1 Aug 2007 23:35:31 -0400 Subject: remove focus-stealing-prevention stuff, don't use user_time crap at all. it is broken in every application that has ever used it. ever. ever. \^_^/;;; --- openbox/screen.c | 2 ++ 1 file changed, 2 insertions(+) (limited to 'openbox/screen.c') diff --git a/openbox/screen.c b/openbox/screen.c index 330cb0a2..8bab662f 100644 --- a/openbox/screen.c +++ b/openbox/screen.c @@ -282,8 +282,10 @@ gboolean screen_annex() supported[i++] = prop_atoms.net_wm_state_demands_attention; supported[i++] = prop_atoms.net_moveresize_window; supported[i++] = prop_atoms.net_wm_moveresize; +/* supported[i++] = prop_atoms.net_wm_user_time; supported[i++] = prop_atoms.net_wm_user_time_window; +*/ supported[i++] = prop_atoms.net_frame_extents; supported[i++] = prop_atoms.net_request_frame_extents; supported[i++] = prop_atoms.net_restack_window; -- cgit v1.2.3 From 6593261f30d611ff3b71abdb9fd043851fdd2ca9 Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Fri, 3 Aug 2007 18:06:10 -0400 Subject: new least-intrusive focus stealing prevention --- openbox/screen.c | 23 +++++------------------ 1 file changed, 5 insertions(+), 18 deletions(-) (limited to 'openbox/screen.c') diff --git a/openbox/screen.c b/openbox/screen.c index 8bab662f..79008e75 100644 --- a/openbox/screen.c +++ b/openbox/screen.c @@ -107,22 +107,7 @@ static gboolean replace_wm() current_wm_sn_owner = None; } - { - /* Generate a timestamp */ - XEvent event; - - XSelectInput(ob_display, screen_support_win, PropertyChangeMask); - - XChangeProperty(ob_display, screen_support_win, - prop_atoms.wm_class, prop_atoms.string, - 8, PropModeAppend, NULL, 0); - XWindowEvent(ob_display, screen_support_win, - PropertyChangeMask, &event); - - XSelectInput(ob_display, screen_support_win, NoEventMask); - - timestamp = event.xproperty.time; - } + timestamp = event_get_server_time(); XSetSelectionOwner(ob_display, wm_sn_atom, screen_support_win, timestamp); @@ -172,12 +157,14 @@ gboolean screen_annex() /* create the netwm support window */ attrib.override_redirect = TRUE; + attrib.event_mask = PropertyChangeMask; screen_support_win = XCreateWindow(ob_display, RootWindow(ob_display, ob_screen), -100, -100, 1, 1, 0, CopyFromParent, InputOutput, CopyFromParent, - CWOverrideRedirect, &attrib); + CWEventMask | CWOverrideRedirect, + &attrib); XMapWindow(ob_display, screen_support_win); XLowerWindow(ob_display, screen_support_win); @@ -282,8 +269,8 @@ gboolean screen_annex() supported[i++] = prop_atoms.net_wm_state_demands_attention; supported[i++] = prop_atoms.net_moveresize_window; supported[i++] = prop_atoms.net_wm_moveresize; -/* supported[i++] = prop_atoms.net_wm_user_time; +/* supported[i++] = prop_atoms.net_wm_user_time_window; */ supported[i++] = prop_atoms.net_frame_extents; -- cgit v1.2.3 From 3b4b52921adba74472904b37ec13d9c8d8686a10 Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Fri, 3 Aug 2007 20:40:13 -0400 Subject: show a popup notification when switching desktops (also make all the config options export time in milliseconds not half milli half micro) --- openbox/screen.c | 81 ++++++++++++++++++++++++-------------------------------- 1 file changed, 35 insertions(+), 46 deletions(-) (limited to 'openbox/screen.c') diff --git a/openbox/screen.c b/openbox/screen.c index 79008e75..7f608b3c 100644 --- a/openbox/screen.c +++ b/openbox/screen.c @@ -26,6 +26,7 @@ #include "startupnotify.h" #include "moveresize.h" #include "config.h" +#include "mainloop.h" #include "screen.h" #include "client.h" #include "session.h" @@ -73,7 +74,7 @@ static GSList *struts_left = NULL; static GSList *struts_right = NULL; static GSList *struts_bottom = NULL; -static ObPagerPopup *desktop_cycle_popup; +static ObPagerPopup *desktop_popup; static gboolean replace_wm() { @@ -342,12 +343,12 @@ void screen_startup(gboolean reconfig) guint32 d; gboolean namesexist = FALSE; - desktop_cycle_popup = pager_popup_new(FALSE); - pager_popup_height(desktop_cycle_popup, POPUP_HEIGHT); + desktop_popup = pager_popup_new(FALSE); + pager_popup_height(desktop_popup, POPUP_HEIGHT); if (reconfig) { /* update the pager popup's width */ - pager_popup_text_width_to_strings(desktop_cycle_popup, + pager_popup_text_width_to_strings(desktop_popup, screen_desktop_names, screen_num_desktops); return; @@ -430,7 +431,7 @@ void screen_startup(gboolean reconfig) void screen_shutdown(gboolean reconfig) { - pager_popup_free(desktop_cycle_popup); + pager_popup_free(desktop_popup); if (reconfig) return; @@ -618,6 +619,9 @@ void screen_set_desktop(guint num, gboolean dofocus) if (event_curtime != CurrentTime) screen_desktop_user_time = event_curtime; + + if (ob_state() == OB_STATE_RUNNING) + screen_show_desktop_popup(screen_desktop); } void screen_add_desktop(gboolean current) @@ -804,25 +808,34 @@ static guint translate_row_col(guint r, guint c) return 0; } -void screen_desktop_popup(guint d, gboolean show) +static gboolean hide_desktop_popup_func(gpointer data) +{ + pager_popup_hide(desktop_popup); + return FALSE; /* don't repeat */ +} + +void screen_show_desktop_popup(guint d) { Rect *a; - if (!show) { - pager_popup_hide(desktop_cycle_popup); - } else { - a = screen_physical_area_active(); - pager_popup_position(desktop_cycle_popup, CenterGravity, - a->x + a->width / 2, a->y + a->height / 2); - pager_popup_icon_size_multiplier(desktop_cycle_popup, - (screen_desktop_layout.columns / - screen_desktop_layout.rows) / 2, - (screen_desktop_layout.rows/ - screen_desktop_layout.columns) / 2); - pager_popup_max_width(desktop_cycle_popup, - MAX(a->width/3, POPUP_WIDTH)); - pager_popup_show(desktop_cycle_popup, screen_desktop_names[d], d); - } + /* 0 means don't show the popup */ + if (!config_desktop_popup_time) return; + + a = screen_physical_area_active(); + pager_popup_position(desktop_popup, CenterGravity, + a->x + a->width / 2, a->y + a->height / 2); + pager_popup_icon_size_multiplier(desktop_popup, + (screen_desktop_layout.columns / + screen_desktop_layout.rows) / 2, + (screen_desktop_layout.rows/ + screen_desktop_layout.columns) / 2); + pager_popup_max_width(desktop_popup, + MAX(a->width/3, POPUP_WIDTH)); + pager_popup_show(desktop_popup, screen_desktop_names[d], d); + + ob_main_loop_timeout_remove(ob_main_loop, hide_desktop_popup_func); + ob_main_loop_timeout_add(ob_main_loop, config_desktop_popup_time * 1000, + hide_desktop_popup_func, NULL, NULL, NULL); } guint screen_find_desktop(guint from, ObDirection dir, @@ -931,30 +944,6 @@ guint screen_find_desktop(guint from, ObDirection dir, return d; } -guint screen_cycle_desktop(ObDirection dir, gboolean wrap, gboolean linear, - gboolean dialog, gboolean done, gboolean cancel) -{ - static guint d = (guint)-1; - guint ret; - - if (d == (guint)-1) - d = screen_desktop; - - if ((!cancel && !done) || !dialog) - d = screen_find_desktop(d, dir, wrap, linear); - - if (dialog && !cancel && !done) - screen_desktop_popup(d, TRUE); - else - screen_desktop_popup(0, FALSE); - ret = d; - - if (!dialog || cancel || done) - d = (guint)-1; - - return ret; -} - static gboolean screen_validate_layout(ObDesktopLayout *l) { if (l->columns == 0 && l->rows == 0) /* both 0's is bad data.. */ @@ -1081,7 +1070,7 @@ void screen_update_desktop_names() } /* resize the pager for these names */ - pager_popup_text_width_to_strings(desktop_cycle_popup, + pager_popup_text_width_to_strings(desktop_popup, screen_desktop_names, screen_num_desktops); } -- cgit v1.2.3 From c7e0368a4b888cbfcec3f3889c3442c6b299a900 Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Fri, 3 Aug 2007 20:58:10 -0400 Subject: fallback focus when removing a desktop without doing a fake desktop switch --- openbox/screen.c | 95 +++++++++++++++++++++++++++++++++----------------------- 1 file changed, 56 insertions(+), 39 deletions(-) (limited to 'openbox/screen.c') diff --git a/openbox/screen.c b/openbox/screen.c index 7f608b3c..7e04d4dc 100644 --- a/openbox/screen.c +++ b/openbox/screen.c @@ -54,6 +54,7 @@ static gboolean screen_validate_layout(ObDesktopLayout *l); static gboolean replace_wm(); static void screen_tell_ksplash(); +static void screen_fallback_focus(); guint screen_num_desktops; guint screen_num_monitors; @@ -535,13 +536,50 @@ void screen_set_num_desktops(guint num) screen_set_desktop(num - 1, TRUE); } -void screen_set_desktop(guint num, gboolean dofocus) +static void screen_fallback_focus() { 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; guint old; gulong ignore_start; - gboolean allow_omni; 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 - 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); - } - } + if (dofocus) screen_fallback_focus(); /* hide windows from bottom to top */ 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) { + gulong ignore_start; + + /* ignore enter events caused by this */ + ignore_start = event_start_ignore_all_enters(); + screen_set_num_desktops(screen_num_desktops+1); /* 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) { guint rmdesktop, movedesktop; GList *it, *stacking_copy; + gulong ignore_start; 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? */ if (current) 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) { - gint d = screen_desktop; - screen_desktop = screen_last_desktop; - screen_set_desktop(d, TRUE); + screen_fallback_focus(); ob_debug("fake desktop change\n"); } 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) -- cgit v1.2.3 From 0cfd92ab9e56d8f790c92b83436e981fa46efe20 Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Sat, 4 Aug 2007 13:29:13 -0400 Subject: don't make omnipresent windows lose focus when changing desktops. this is done by allowing focus_fallback to specify if focus has been lost or not. usually if you're call it, focus is lost, but not always. --- openbox/screen.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'openbox/screen.c') diff --git a/openbox/screen.c b/openbox/screen.c index 7e04d4dc..93ec57f5 100644 --- a/openbox/screen.c +++ b/openbox/screen.c @@ -560,7 +560,9 @@ static void screen_fallback_focus() 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))) { + if ((c = focus_fallback(TRUE, !config_focus_last, allow_omni, + !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.. */ @@ -1137,7 +1139,7 @@ void screen_show_desktop(gboolean show, ObClient *show_only) else if (!show_only) { ObClient *c; - if ((c = focus_fallback(TRUE, FALSE, TRUE))) { + if ((c = focus_fallback(TRUE, FALSE, TRUE, FALSE))) { /* 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.. */ -- cgit v1.2.3