summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRichard Grenville <pyxlcy@gmail.com>2013-03-10 18:45:54 +0800
committerRichard Grenville <pyxlcy@gmail.com>2013-03-10 18:45:54 +0800
commit07ed9901e7a6ff65a6baa2dcf95e206dc6970ca5 (patch)
tree375316b107a99443a3f8c6588492bb4b907015e6
parentdc4da095bb876c4ba2b77050b35883e59af944a6 (diff)
downloadtdebase-07ed9901e7a6ff65a6baa2dcf95e206dc6970ca5.tar.gz
tdebase-07ed9901e7a6ff65a6baa2dcf95e206dc6970ca5.zip
Improvement: ARGB window matching & Enable track_focus with D-Bus
- Add predefined matching target "argb" to match ARGB windows. - Make it possible to enable focus tracking on-the-fly with D-Bus method.
-rw-r--r--c2.c1
-rw-r--r--c2.h2
-rw-r--r--common.h3
-rw-r--r--compton.c28
-rw-r--r--dbus.c12
5 files changed, 44 insertions, 2 deletions
diff --git a/c2.c b/c2.c
index 5bbb4e3a8..4e2b0dfb3 100644
--- a/c2.c
+++ b/c2.c
@@ -1042,6 +1042,7 @@ c2_match_once_leaf(session_t *ps, win *w, const c2_l_t *pleaf,
switch (pleaf->predef) {
case C2_L_PID: tgt = wid; break;
case C2_L_POVREDIR: tgt = w->a.override_redirect; break;
+ case C2_L_PARGB: tgt = (WMODE_ARGB == w->mode); break;
case C2_L_PFOCUSED: tgt = w->focused_real; break;
case C2_L_PWMWIN: tgt = w->wmwin; break;
case C2_L_PCLIENT: tgt = w->client_win; break;
diff --git a/c2.h b/c2.h
index 000c68448..c794da1c0 100644
--- a/c2.h
+++ b/c2.h
@@ -100,6 +100,7 @@ struct _c2_l {
C2_L_PUNDEFINED,
C2_L_PID,
C2_L_POVREDIR,
+ C2_L_PARGB,
C2_L_PFOCUSED,
C2_L_PWMWIN,
C2_L_PCLIENT,
@@ -175,6 +176,7 @@ typedef struct {
const static c2_predef_t C2_PREDEFS[] = {
[C2_L_PID ] = { "id" , C2_L_TCARDINAL , 0 },
[C2_L_POVREDIR ] = { "override_redirect" , C2_L_TCARDINAL , 0 },
+ [C2_L_PARGB ] = { "argb" , C2_L_TCARDINAL , 0 },
[C2_L_PFOCUSED ] = { "focused" , C2_L_TCARDINAL , 0 },
[C2_L_PWMWIN ] = { "wmwin" , C2_L_TCARDINAL , 0 },
[C2_L_PCLIENT ] = { "client" , C2_L_TWINDOW , 0 },
diff --git a/common.h b/common.h
index 0d4f5a541..96ca6021c 100644
--- a/common.h
+++ b/common.h
@@ -1491,6 +1491,9 @@ win_set_focused_force(session_t *ps, win *w, switch_t val);
void
win_set_invert_color_force(session_t *ps, win *w, switch_t val);
+
+void
+opts_init_track_focus(session_t *ps);
//!@}
#endif
diff --git a/compton.c b/compton.c
index ff1dd4975..8bd853384 100644
--- a/compton.c
+++ b/compton.c
@@ -1822,6 +1822,9 @@ map_win(session_t *ps, Window id) {
// Make sure the XSelectInput() requests are sent
XSync(ps->dpy, False);
+ // Update window mode here to do matching of ARGB
+ win_determine_mode(ps, w);
+
// Detect client window here instead of in add_win() as the client
// window should have been prepared at this point
if (!w->client_win) {
@@ -1982,8 +1985,6 @@ win_determine_mode(session_t *ps, win *w) {
winmode_t mode = WMODE_SOLID;
XRenderPictFormat *format;
- /* if trans prop == -1 fall back on previous tests */
-
if (w->a.class == InputOnly) {
format = 0;
} else {
@@ -3247,6 +3248,29 @@ win_set_invert_color_force(session_t *ps, win *w, switch_t val) {
win_determine_invert_color(ps, w);
}
}
+
+/**
+ * Enable focus tracking.
+ */
+void
+opts_init_track_focus(session_t *ps) {
+ // Already tracking focus
+ if (ps->o.track_focus)
+ return;
+
+ ps->o.track_focus = true;
+
+ if (!ps->o.use_ewmh_active_win) {
+ // Start listening to FocusChange events
+ for (win *w = ps->list; w; w = w->next)
+ if (IsViewable == w->a.map_state)
+ XSelectInput(ps->dpy, w->id,
+ determine_evmask(ps, w->id, WIN_EVMODE_FRAME));
+ }
+
+ // Recheck focus
+ recheck_focus(ps);
+}
//!@}
#endif
diff --git a/dbus.c b/dbus.c
index 39e4cf3ad..4dd6143f8 100644
--- a/dbus.c
+++ b/dbus.c
@@ -953,6 +953,18 @@ cdbus_process_opts_set(session_t *ps, DBusMessage *msg) {
goto cdbus_process_opts_set_success;
}
+ // track_focus
+ if (!strcmp("track_focus", target)) {
+ dbus_bool_t val = FALSE;
+ if (!cdbus_msg_get_arg(msg, 1, DBUS_TYPE_BOOLEAN, &val))
+ return false;
+ // You could enable this option, but never turn if off
+ if (val) {
+ opts_init_track_focus(ps);
+ }
+ goto cdbus_process_opts_set_success;
+ }
+
// vsync
if (!strcmp("vsync", target)) {
const char * val = NULL;