[hackers] [st] tweak focus to support XEMBED client message and remove focus on EnterNotify. (thx Adrian) || Aurélien Aptel

From: <hg_AT_suckless.org>
Date: Fri, 16 Sep 2011 18:24:19 +0200 (CEST)

changeset: 210:5079a55df883
user: Aurélien Aptel <aurelien.aptel_AT_gmail.com>
date: Fri Sep 16 18:03:44 2011 +0200
files: st.c
description:
tweak focus to support XEMBED client message and remove focus on EnterNotify. (thx Adrian)

diff -r 437d613b56eb -r 5079a55df883 st.c
--- a/st.c Fri Sep 16 17:57:56 2011 +0200
+++ b/st.c Fri Sep 16 18:03:44 2011 +0200
@@ -37,6 +37,10 @@
         "st-" VERSION ", (c) 2010-2011 st engineers\n" \
         "usage: st [-t title] [-c class] [-w windowid] [-v] [-e command...]\n"
 
+/* XEMBED messages */
+#define XEMBED_FOCUS_IN 4
+#define XEMBED_FOCUS_OUT 5
+
 /* Arbitrary sizes */
 #define ESC_TITLE_SIZ 256
 #define ESC_BUF_SIZ 256
@@ -217,6 +221,7 @@
 static void unmap(XEvent *);
 static char* kmap(KeySym, unsigned int state);
 static void kpress(XEvent *);
+static void cmessage(XEvent *);
 static void resize(XEvent *);
 static void focus(XEvent *);
 static void brelease(XEvent *);
@@ -237,12 +242,11 @@
 
 static void (*handler[LASTEvent])(XEvent *) = {
         [KeyPress] = kpress,
+ [ClientMessage] = cmessage,
         [ConfigureNotify] = resize,
         [VisibilityNotify] = visibility,
         [UnmapNotify] = unmap,
         [Expose] = expose,
- [EnterNotify] = focus,
- [LeaveNotify] = focus,
         [FocusIn] = focus,
         [FocusOut] = focus,
         [MotionNotify] = bmotion,
@@ -264,6 +268,7 @@
 static char *opt_title = NULL;
 static char *opt_embed = NULL;
 static char *opt_class = NULL;
+static Atom xembedatom;
 
 int
 utf8decode(char *s, long *u) {
@@ -1666,6 +1671,8 @@
                 &(XColor){.red = 0xffff, .green = 0xffff, .blue = 0xffff},
                 &(XColor){.red = 0x0000, .green = 0x0000, .blue = 0x0000});
 
+ xembedatom = XInternAtom(xw.dpy, "_XEMBED", False);
+
         XStoreName(xw.dpy, xw.win, opt_title ? opt_title : "st");
         XMapWindow(xw.dpy, xw.win);
         xhints();
@@ -1822,7 +1829,7 @@
 
 void
 focus(XEvent *ev) {
- if(ev->type == FocusIn || ev->type == EnterNotify) {
+ if(ev->type == FocusIn) {
                 xw.state |= WIN_FOCUSED;
                 xseturgency(0);
         } else
@@ -1890,6 +1897,19 @@
 }
 
 void
+cmessage(XEvent *e) {
+ if (e->xclient.message_type == xembedatom && e->xclient.format == 32) {
+ if (e->xclient.data.l[1] == XEMBED_FOCUS_IN) {
+ xw.state |= WIN_FOCUSED;
+ xseturgency(0);
+ } else if (e->xclient.data.l[1] == XEMBED_FOCUS_OUT) {
+ xw.state &= ~WIN_FOCUSED;
+ }
+ draw();
+ }
+}
+
+void
 resize(XEvent *e) {
         int col, row;
         
Received on Fri Sep 16 2011 - 18:24:19 CEST

This archive was generated by hypermail 2.2.0 : Fri Sep 16 2011 - 18:36:05 CEST