summaryrefslogtreecommitdiff
path: root/openbox/focus.c
diff options
context:
space:
mode:
authorDana Jansens <danakj@orodu.net>2007-04-22 19:13:38 +0000
committerDana Jansens <danakj@orodu.net>2007-04-22 19:13:38 +0000
commitbfb800c032e1dd50f5d1c37d1ce8ac9239947b01 (patch)
tree9729cf672c6490618f39926729fc5379cea41864 /openbox/focus.c
parent7d1226c57cbe2c83d87174b637bcf923897f8033 (diff)
a) remove focus_hilite, it is not needed and complicated things
b) set focus_client to null when nothing is actually focused, but still allow focus to go to black holes c) allow the focus action to be performed without a client, this will focus the openbox instance (i.e. the screen in multihead setups) big thanks to syscrash for the ideas on how to go about this
Diffstat (limited to 'openbox/focus.c')
-rw-r--r--openbox/focus.c45
1 files changed, 23 insertions, 22 deletions
diff --git a/openbox/focus.c b/openbox/focus.c
index ea3d4fab..7a686800 100644
--- a/openbox/focus.c
+++ b/openbox/focus.c
@@ -37,9 +37,9 @@
#include <glib.h>
#include <assert.h>
-ObClient *focus_client, *focus_hilite;
-GList *focus_order;
-ObClient *focus_cycle_target;
+ObClient *focus_client = NULL;
+GList *focus_order = NULL;
+ObClient *focus_cycle_target = NULL;
struct {
InternalWindow top;
@@ -81,7 +81,7 @@ void focus_startup(gboolean reconfig)
client_add_destructor(focus_cycle_destructor, NULL);
/* start with nothing focused */
- focus_set_client(NULL);
+ focus_nothing();
focus_indicator.top.obwin.type = Window_Internal;
focus_indicator.left.obwin.type = Window_Internal;
@@ -156,7 +156,6 @@ static void push_to_top(ObClient *client)
void focus_set_client(ObClient *client)
{
Window active;
- ObClient *old;
ob_debug_type(OB_DEBUG_FOCUS,
"focus_set_client 0x%lx\n", client ? client->window : 0);
@@ -165,37 +164,26 @@ void focus_set_client(ObClient *client)
screen_install_colormap(focus_client, FALSE);
screen_install_colormap(client, TRUE);
- if (client == NULL) {
- ob_debug_type(OB_DEBUG_FOCUS, "actively focusing NONWINDOW\n");
-
- /* when nothing will be focused, send focus to the backup target */
- XSetInputFocus(ob_display, screen_support_win, RevertToNone,
- event_curtime);
- XSync(ob_display, FALSE);
- }
-
/* in the middle of cycling..? kill it. CurrentTime is fine, time won't
be used.
*/
if (focus_cycle_target)
focus_cycle(TRUE, TRUE, TRUE, TRUE, TRUE, TRUE);
- old = focus_client;
focus_client = client;
- /* move to the top of the list */
- if (client != NULL)
+ if (client != NULL) {
+ /* move to the top of the list */
push_to_top(client);
+ /* remove hiliting from the window when it gets focused */
+ client_hilite(client, FALSE);
+ }
/* set the NET_ACTIVE_WINDOW hint, but preserve it on shutdown */
if (ob_state() != OB_STATE_EXITING) {
active = client ? client->window : None;
PROP_SET32(RootWindow(ob_display, ob_screen),
net_active_window, window, active);
-
- /* remove hiliting from the window when it gets focused */
- if (client != NULL)
- client_hilite(client, FALSE);
}
}
@@ -280,12 +268,25 @@ void focus_fallback(gboolean allow_refocus)
and such, and then when I try focus them, I won't get a FocusIn event
at all for them.
*/
- focus_set_client(NULL);
+ focus_nothing();
if ((new = focus_fallback_target(allow_refocus, old)))
client_focus(new);
}
+void focus_nothing()
+{
+ /* Install our own colormap */
+ if (focus_client != NULL) {
+ screen_install_colormap(focus_client, FALSE);
+ screen_install_colormap(NULL, TRUE);
+ }
+
+ /* when nothing will be focused, send focus to the backup target */
+ XSetInputFocus(ob_display, screen_support_win, RevertToPointerRoot,
+ event_curtime);
+}
+
static void popup_cycle(ObClient *c, gboolean show)
{
if (!show) {