summaryrefslogtreecommitdiff
path: root/openbox/focus.c
diff options
context:
space:
mode:
authorDana Jansens <danakj@orodu.net>2003-03-19 07:08:15 +0000
committerDana Jansens <danakj@orodu.net>2003-03-19 07:08:15 +0000
commit648c55b829e09c66222a9bbf08d10434622feae2 (patch)
tree7e6c2eb58a71e4691c9c5d85325b9d9000019138 /openbox/focus.c
parent597fad9d8d5b7be27cabeeec750ed15f86377a07 (diff)
move the focus_order lists into the kernel
Diffstat (limited to 'openbox/focus.c')
-rw-r--r--openbox/focus.c29
1 files changed, 29 insertions, 0 deletions
diff --git a/openbox/focus.c b/openbox/focus.c
index cfc3485e..d09494bf 100644
--- a/openbox/focus.c
+++ b/openbox/focus.c
@@ -5,8 +5,10 @@
#include "dispatch.h"
#include <X11/Xlib.h>
+#include <glib.h>
Client *focus_client = NULL;
+GList **focus_order = NULL;
Window focus_backup = None;
@@ -14,6 +16,8 @@ void focus_set_client(Client *client);
void focus_startup()
{
+ guint i;
+
/* create the window which gets focus when no clients get it. Have to
make it override-redirect so we don't try manage it, since it is
mapped. */
@@ -25,14 +29,31 @@ void focus_startup()
CopyFromParent, CWOverrideRedirect, &attrib);
XMapRaised(ob_display, focus_backup);
+ focus_order = g_new(GList*, screen_num_desktops);
+ for (i = 0; i < screen_num_desktops; ++i)
+ focus_order[i] = NULL;
+
/* start with nothing focused */
focus_set_client(NULL);
}
+void focus_shutdown()
+{
+ guint i;
+
+ for (i = 0; i < screen_num_desktops; ++i)
+ g_list_free(focus_order[i]);
+ g_free(focus_order);
+
+ /* reset focus to root */
+ XSetInputFocus(ob_display, PointerRoot, RevertToNone, CurrentTime);
+}
+
void focus_set_client(Client *client)
{
Window active;
Client *old;
+ guint desktop;
/* uninstall the old colormap, and install the new one */
screen_install_colormap(focus_client, FALSE);
@@ -47,6 +68,14 @@ void focus_set_client(Client *client)
old = focus_client;
focus_client = client;
+ /* move to the top of the list */
+ if (client != NULL) {
+ desktop = client->desktop;
+ if (desktop == DESKTOP_ALL) desktop = screen_desktop;
+ focus_order[desktop] = g_list_remove(focus_order[desktop], client);
+ focus_order[desktop] = g_list_prepend(focus_order[desktop], client);
+ }
+
/* set the NET_ACTIVE_WINDOW hint */
active = client ? client->window : None;
PROP_SET32(ob_root, net_active_window, window, active);