Re-implement XClientMessage handling so that we can feed screen_find and
client_find valid resources as needed, relieving the need for screen_find to ungracefully handle invalid root windows. Removes a long standing XXX. Should theoretically allow XClientMessage handling on more than one X screen. Alter callers of screen_find to handle failures.
This commit is contained in:
parent
4ff2b5f4e4
commit
eb3dae29d1
@ -15,7 +15,7 @@
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*
|
||||
* $OpenBSD: client.c,v 1.196 2015/06/28 19:54:37 okan Exp $
|
||||
* $OpenBSD: client.c,v 1.197 2015/06/30 14:01:43 okan Exp $
|
||||
*/
|
||||
|
||||
#include <sys/types.h>
|
||||
@ -55,7 +55,8 @@ client_init(Window win, struct screen_ctx *sc)
|
||||
return(NULL);
|
||||
|
||||
if (sc == NULL) {
|
||||
sc = screen_find(wattr.root);
|
||||
if ((sc = screen_find(wattr.root)) == NULL)
|
||||
return(NULL);
|
||||
mapped = 1;
|
||||
} else {
|
||||
if (wattr.override_redirect || wattr.map_state != IsViewable)
|
||||
|
@ -15,7 +15,7 @@
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*
|
||||
* $OpenBSD: screen.c,v 1.75 2015/06/26 18:54:25 okan Exp $
|
||||
* $OpenBSD: screen.c,v 1.76 2015/06/30 14:01:43 okan Exp $
|
||||
*/
|
||||
|
||||
#include <sys/types.h>
|
||||
@ -100,8 +100,8 @@ screen_find(Window win)
|
||||
if (sc->rootwin == win)
|
||||
return(sc);
|
||||
}
|
||||
/* XXX FAIL HERE */
|
||||
return(TAILQ_FIRST(&Screenq));
|
||||
warnx("screen_find failure win 0x%lu\n", win);
|
||||
return(NULL);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -15,7 +15,7 @@
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*
|
||||
* $OpenBSD: xevents.c,v 1.116 2015/01/19 14:54:16 okan Exp $
|
||||
* $OpenBSD: xevents.c,v 1.117 2015/06/30 14:01:43 okan Exp $
|
||||
*/
|
||||
|
||||
/*
|
||||
@ -240,7 +240,8 @@ xev_handle_buttonpress(XEvent *ee)
|
||||
if (e->window != e->root)
|
||||
return;
|
||||
cc = &fakecc;
|
||||
cc->sc = screen_find(e->window);
|
||||
if ((cc->sc = screen_find(e->window)) == NULL)
|
||||
return;
|
||||
}
|
||||
|
||||
(*mb->callback)(cc, &mb->argument);
|
||||
@ -290,7 +291,8 @@ xev_handle_keypress(XEvent *ee)
|
||||
return;
|
||||
} else {
|
||||
cc = &fakecc;
|
||||
cc->sc = screen_find(e->window);
|
||||
if ((cc->sc = screen_find(e->window)) == NULL)
|
||||
return;
|
||||
}
|
||||
|
||||
(*kb->callback)(cc, &kb->argument);
|
||||
@ -307,7 +309,8 @@ xev_handle_keyrelease(XEvent *ee)
|
||||
KeySym keysym;
|
||||
unsigned int i;
|
||||
|
||||
sc = screen_find(e->root);
|
||||
if ((sc = screen_find(e->root)) == NULL)
|
||||
return;
|
||||
|
||||
keysym = XkbKeycodeToKeysym(X_Dpy, e->keycode, 0, 0);
|
||||
for (i = 0; i < nitems(modkeys); i++) {
|
||||
@ -325,42 +328,43 @@ xev_handle_clientmessage(XEvent *ee)
|
||||
struct client_ctx *cc, *old_cc;
|
||||
struct screen_ctx *sc;
|
||||
|
||||
sc = screen_find(e->window);
|
||||
|
||||
if ((cc = client_find(e->window)) == NULL && e->window != sc->rootwin)
|
||||
return;
|
||||
|
||||
if (e->message_type == cwmh[WM_CHANGE_STATE] && e->format == 32 &&
|
||||
e->data.l[0] == IconicState)
|
||||
client_hide(cc);
|
||||
|
||||
if (e->message_type == ewmh[_NET_CLOSE_WINDOW])
|
||||
client_send_delete(cc);
|
||||
|
||||
if (e->message_type == ewmh[_NET_ACTIVE_WINDOW] && e->format == 32) {
|
||||
if ((old_cc = client_current()))
|
||||
client_ptrsave(old_cc);
|
||||
client_ptrwarp(cc);
|
||||
if (e->message_type == cwmh[WM_CHANGE_STATE]) {
|
||||
if ((cc = client_find(e->window)) != NULL) {
|
||||
if (e->data.l[0] == IconicState)
|
||||
client_hide(cc);
|
||||
}
|
||||
} else if (e->message_type == ewmh[_NET_CLOSE_WINDOW]) {
|
||||
if ((cc = client_find(e->window)) != NULL) {
|
||||
client_send_delete(cc);
|
||||
}
|
||||
} else if (e->message_type == ewmh[_NET_ACTIVE_WINDOW]) {
|
||||
if ((cc = client_find(e->window)) != NULL) {
|
||||
if ((old_cc = client_current()))
|
||||
client_ptrsave(old_cc);
|
||||
client_ptrwarp(cc);
|
||||
}
|
||||
} else if (e->message_type == ewmh[_NET_WM_DESKTOP]) {
|
||||
if ((cc = client_find(e->window)) != NULL) {
|
||||
/*
|
||||
* The EWMH spec states that if the cardinal returned
|
||||
* is 0xFFFFFFFF (-1) then the window should appear
|
||||
* on all desktops, in our case, group 0.
|
||||
*/
|
||||
if (e->data.l[0] == (unsigned long)-1)
|
||||
group_movetogroup(cc, 0);
|
||||
else
|
||||
group_movetogroup(cc, e->data.l[0]);
|
||||
}
|
||||
} else if (e->message_type == ewmh[_NET_WM_STATE]) {
|
||||
if ((cc = client_find(e->window)) != NULL) {
|
||||
xu_ewmh_handle_net_wm_state_msg(cc,
|
||||
e->data.l[0], e->data.l[1], e->data.l[2]);
|
||||
}
|
||||
} else if (e->message_type == ewmh[_NET_CURRENT_DESKTOP]) {
|
||||
if ((sc = screen_find(e->window)) != NULL) {
|
||||
group_only(sc, e->data.l[0]);
|
||||
}
|
||||
}
|
||||
|
||||
if (e->message_type == ewmh[_NET_WM_DESKTOP] && e->format == 32) {
|
||||
/*
|
||||
* The EWMH spec states that if the cardinal returned is
|
||||
* 0xFFFFFFFF (-1) then the window should appear on all
|
||||
* desktops, which in our case is assigned to group 0.
|
||||
*/
|
||||
if (e->data.l[0] == (unsigned long)-1)
|
||||
group_movetogroup(cc, 0);
|
||||
else
|
||||
group_movetogroup(cc, e->data.l[0]);
|
||||
}
|
||||
|
||||
if (e->message_type == ewmh[_NET_WM_STATE] && e->format == 32)
|
||||
xu_ewmh_handle_net_wm_state_msg(cc,
|
||||
e->data.l[0], e->data.l[1], e->data.l[2]);
|
||||
|
||||
if (e->message_type == ewmh[_NET_CURRENT_DESKTOP] && e->format == 32)
|
||||
group_only(sc, e->data.l[0]);
|
||||
}
|
||||
|
||||
static void
|
||||
|
Loading…
Reference in New Issue
Block a user