all events are dispatched
This commit is contained in:
parent
033bd73e7e
commit
75b07a2bb3
7 changed files with 80 additions and 81 deletions
|
@ -7,6 +7,7 @@
|
||||||
#include "event.h"
|
#include "event.h"
|
||||||
#include "focus.h"
|
#include "focus.h"
|
||||||
#include "stacking.h"
|
#include "stacking.h"
|
||||||
|
#include "dispatch.h"
|
||||||
|
|
||||||
#include <glib.h>
|
#include <glib.h>
|
||||||
#include <X11/Xutil.h>
|
#include <X11/Xutil.h>
|
||||||
|
@ -194,10 +195,12 @@ void client_manage(Window window)
|
||||||
|
|
||||||
screen_update_struts();
|
screen_update_struts();
|
||||||
|
|
||||||
/*HOOKFIRECLIENT(managed, client);XXX*/
|
dispatch_client(Event_Client_New, client);
|
||||||
|
|
||||||
client_showhide(client);
|
client_showhide(client);
|
||||||
|
|
||||||
|
dispatch_client(Event_Client_Mapped, client);
|
||||||
|
|
||||||
/* grab all mouse bindings */
|
/* grab all mouse bindings */
|
||||||
/*pointer_grab_all(client, TRUE);XXX*/
|
/*pointer_grab_all(client, TRUE);XXX*/
|
||||||
|
|
||||||
|
@ -220,7 +223,7 @@ void client_unmanage(Client *client)
|
||||||
|
|
||||||
g_message("Unmanaging window: %lx", client->window);
|
g_message("Unmanaging window: %lx", client->window);
|
||||||
|
|
||||||
/*HOOKFIRECLIENT(closed, client);XXX*/
|
dispatch_client(Event_Client_Destroy, client);
|
||||||
|
|
||||||
/* remove the window from our save set */
|
/* remove the window from our save set */
|
||||||
XChangeSaveSet(ob_display, client->window, SetModeDelete);
|
XChangeSaveSet(ob_display, client->window, SetModeDelete);
|
||||||
|
@ -923,7 +926,7 @@ void client_update_wmhints(Client *self)
|
||||||
/* fire the urgent callback if we're mapped, otherwise, wait until
|
/* fire the urgent callback if we're mapped, otherwise, wait until
|
||||||
after we're mapped */
|
after we're mapped */
|
||||||
if (self->frame)
|
if (self->frame)
|
||||||
/*HOOKFIRECLIENT(urgent, self)XXX*/;
|
dispatch_client(Event_Client_Urgent, self);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1218,7 +1221,7 @@ static void client_showhide(Client *self)
|
||||||
else
|
else
|
||||||
engine_frame_hide(self->frame);
|
engine_frame_hide(self->frame);
|
||||||
|
|
||||||
/*HOOKFIRECLIENT(visible, self);XXX*/
|
dispatch_client(Event_Client_Visible, self);
|
||||||
}
|
}
|
||||||
|
|
||||||
gboolean client_normal(Client *self) {
|
gboolean client_normal(Client *self) {
|
||||||
|
@ -1243,7 +1246,7 @@ static void client_apply_startup_state(Client *self)
|
||||||
client_shade(self, TRUE);
|
client_shade(self, TRUE);
|
||||||
}
|
}
|
||||||
if (self->urgent)
|
if (self->urgent)
|
||||||
/*HOOKFIRECLIENT(urgent, self)XXX*/;
|
dispatch_client(Event_Client_Urgent, self);
|
||||||
|
|
||||||
if (self->max_vert && self->max_horz) {
|
if (self->max_vert && self->max_horz) {
|
||||||
self->max_vert = self->max_horz = FALSE;
|
self->max_vert = self->max_horz = FALSE;
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
#include "dispatch.h"
|
#include "dispatch.h"
|
||||||
|
#include "extensions.h"
|
||||||
|
|
||||||
#include <glib.h>
|
#include <glib.h>
|
||||||
|
|
||||||
|
@ -26,8 +27,10 @@ void dispatch_shutdown()
|
||||||
guint i;
|
guint i;
|
||||||
EventType j;
|
EventType j;
|
||||||
|
|
||||||
for (i = 0, j = 1; j < EVENT_RANGE; ++i, j <<= 1)
|
for (i = 0, j = 1; j < EVENT_RANGE; ++i, j <<= 1) {
|
||||||
g_slist_free(funcs[i]);
|
g_slist_free(funcs[i]);
|
||||||
|
funcs[i] = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
g_free(funcs);
|
g_free(funcs);
|
||||||
}
|
}
|
||||||
|
@ -47,7 +50,7 @@ void dispatch_register(EventHandler h, EventMask mask)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void dispatch_x(XEvent *xe)
|
void dispatch_x(XEvent *xe, Client *c)
|
||||||
{
|
{
|
||||||
EventType e;
|
EventType e;
|
||||||
guint i;
|
guint i;
|
||||||
|
@ -77,11 +80,20 @@ void dispatch_x(XEvent *xe)
|
||||||
e = Event_X_MotionNotify;
|
e = Event_X_MotionNotify;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
/* XKB events */
|
||||||
|
if (xe->type == extensions_xkb_event_basep) {
|
||||||
|
switch (((XkbAnyEvent*)&e)->xkb_type) {
|
||||||
|
case XkbBellNotify:
|
||||||
|
e = Event_X_Bell;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
obe.type = e;
|
obe.type = e;
|
||||||
obe.data.x = xe;
|
obe.data.x.e = xe;
|
||||||
|
obe.data.x.client = c;
|
||||||
|
|
||||||
i = 0;
|
i = 0;
|
||||||
while (e > 1) {
|
while (e > 1) {
|
||||||
|
|
|
@ -15,26 +15,35 @@ typedef enum {
|
||||||
Event_X_ButtonPress = 1 << 4,
|
Event_X_ButtonPress = 1 << 4,
|
||||||
Event_X_ButtonRelease = 1 << 5,
|
Event_X_ButtonRelease = 1 << 5,
|
||||||
Event_X_MotionNotify = 1 << 6,
|
Event_X_MotionNotify = 1 << 6,
|
||||||
|
Event_X_Bell = 1 << 7,
|
||||||
|
|
||||||
Event_Client_New = 1 << 7, /* new window, before mapping */
|
Event_Client_New = 1 << 8, /* new window, before mapping */
|
||||||
Event_Client_Mapped = 1 << 8, /* new window, after mapping */
|
Event_Client_Mapped = 1 << 9, /* new window, after mapping */
|
||||||
Event_Client_Destroy = 1 << 9, /* unmanaged */
|
Event_Client_Destroy = 1 << 10, /* unmanaged */
|
||||||
Event_Client_Focus = 1 << 10,
|
Event_Client_Focus = 1 << 11, /* focused */
|
||||||
Event_Client_Unfocus = 1 << 11,
|
Event_Client_Unfocus = 1 << 12, /* unfocused */
|
||||||
|
Event_Client_Urgent = 1 << 13, /* entered/left urgent state */
|
||||||
|
Event_Client_Visible = 1 << 14, /* shown/hidden (not on a workspace or
|
||||||
|
show-the-desktop change though) */
|
||||||
|
|
||||||
Event_Ob_Desktop = 1 << 12, /* changed desktops */
|
Event_Ob_Desktop = 1 << 15, /* changed desktops */
|
||||||
Event_Ob_NumDesktops = 1 << 13, /* changed the number of desktops */
|
Event_Ob_NumDesktops = 1 << 16, /* changed the number of desktops */
|
||||||
Event_Ob_ShowDesktop = 1 << 14, /* entered/left show-the-desktop mode */
|
Event_Ob_ShowDesktop = 1 << 17, /* entered/left show-the-desktop mode */
|
||||||
Event_Ob_Startup = 1 << 15, /* startup complete */
|
Event_Ob_Startup = 1 << 18, /* startup complete */
|
||||||
Event_Ob_Shutdown = 1 << 16, /* shutdown about to start */
|
Event_Ob_Shutdown = 1 << 19, /* shutdown about to start */
|
||||||
|
|
||||||
Event_Signal = 1 << 17,
|
Event_Signal = 1 << 20,
|
||||||
|
|
||||||
EVENT_RANGE = 1 << 18
|
EVENT_RANGE = 1 << 21
|
||||||
} EventType;
|
} EventType;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
XEvent *e;
|
||||||
|
Client *client;
|
||||||
|
} EventData_X;
|
||||||
|
|
||||||
typedef union {
|
typedef union {
|
||||||
XEvent *x; /* for Event_X_* event types */
|
EventData_X x; /* for Event_X_* event types */
|
||||||
Client *client; /* for Event_Client_* event types */
|
Client *client; /* for Event_Client_* event types */
|
||||||
int signal;
|
int signal;
|
||||||
} EventData;
|
} EventData;
|
||||||
|
@ -50,7 +59,7 @@ typedef unsigned int EventMask;
|
||||||
|
|
||||||
void dispatch_register(EventHandler h, EventMask mask);
|
void dispatch_register(EventHandler h, EventMask mask);
|
||||||
|
|
||||||
void dispatch_x(XEvent *e);
|
void dispatch_x(XEvent *e, Client *c);
|
||||||
void dispatch_client(EventType e, Client *c);
|
void dispatch_client(EventType e, Client *c);
|
||||||
void dispatch_ob(EventType e);
|
void dispatch_ob(EventType e);
|
||||||
void dispatch_signal(int signal);
|
void dispatch_signal(int signal);
|
||||||
|
|
|
@ -10,6 +10,7 @@
|
||||||
#include "extensions.h"
|
#include "extensions.h"
|
||||||
#include "timer.h"
|
#include "timer.h"
|
||||||
#include "engine.h"
|
#include "engine.h"
|
||||||
|
#include "dispatch.h"
|
||||||
|
|
||||||
#include <X11/Xlib.h>
|
#include <X11/Xlib.h>
|
||||||
#include <X11/keysym.h>
|
#include <X11/keysym.h>
|
||||||
|
@ -252,6 +253,7 @@ void event_process(XEvent *e)
|
||||||
|
|
||||||
client = g_hash_table_lookup(client_map, (gpointer)window);
|
client = g_hash_table_lookup(client_map, (gpointer)window);
|
||||||
|
|
||||||
|
/* deal with it in the kernel */
|
||||||
if (client) {
|
if (client) {
|
||||||
event_handle_client(client, e);
|
event_handle_client(client, e);
|
||||||
} else if (window == ob_root)
|
} else if (window == ob_root)
|
||||||
|
@ -279,45 +281,8 @@ void event_process(XEvent *e)
|
||||||
xerror_set_ignore(FALSE);
|
xerror_set_ignore(FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* dispatch Crossing, Pointer and Key events to the hooks */
|
/* dispatch the event to registered handlers */
|
||||||
switch(e->type) {
|
dispatch_x(e, client);
|
||||||
case EnterNotify:
|
|
||||||
if (client != NULL) engine_mouse_enter(client->frame, window);
|
|
||||||
/*HOOKFIRECLIENT(pointerenter, client);XXX*/
|
|
||||||
break;
|
|
||||||
case LeaveNotify:
|
|
||||||
if (client != NULL) engine_mouse_leave(client->frame, window);
|
|
||||||
/*HOOKFIRECLIENT(pointerleave, client);XXX*/
|
|
||||||
break;
|
|
||||||
case ButtonPress:
|
|
||||||
if (client != NULL)
|
|
||||||
engine_mouse_press(client->frame, window,
|
|
||||||
e->xbutton.x, e->xbutton.y);
|
|
||||||
/*pointer_event(e, client);XXX*/
|
|
||||||
break;
|
|
||||||
case ButtonRelease:
|
|
||||||
if (client != NULL)
|
|
||||||
engine_mouse_release(client->frame, window,
|
|
||||||
e->xbutton.x, e->xbutton.y);
|
|
||||||
/*pointer_event(e, client);XXX*/
|
|
||||||
break;
|
|
||||||
case MotionNotify:
|
|
||||||
/*pointer_event(e, client);XXX*/
|
|
||||||
break;
|
|
||||||
case KeyPress:
|
|
||||||
case KeyRelease:
|
|
||||||
/*keyboard_event(&e->xkey);XXX*/
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
/* XKB events */
|
|
||||||
if (e->type == extensions_xkb_event_basep) {
|
|
||||||
switch (((XkbAnyEvent*)&e)->xkb_type) {
|
|
||||||
case XkbBellNotify:
|
|
||||||
/*HOOKFIRECLIENT(bell, client);XXX*/
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void event_handle_root(XEvent *e)
|
static void event_handle_root(XEvent *e)
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
#include "client.h"
|
#include "client.h"
|
||||||
#include "screen.h"
|
#include "screen.h"
|
||||||
#include "prop.h"
|
#include "prop.h"
|
||||||
|
#include "dispatch.h"
|
||||||
|
|
||||||
#include <X11/Xlib.h>
|
#include <X11/Xlib.h>
|
||||||
|
|
||||||
|
@ -46,11 +47,15 @@ void focus_set_client(Client *client)
|
||||||
XSetInputFocus(ob_display, focus_backup, RevertToNone, CurrentTime);
|
XSetInputFocus(ob_display, focus_backup, RevertToNone, CurrentTime);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (focus_client != NULL)
|
||||||
|
dispatch_client(Event_Client_Unfocus, focus_client);
|
||||||
|
|
||||||
focus_client = client;
|
focus_client = client;
|
||||||
|
|
||||||
/* set the NET_ACTIVE_WINDOW hint */
|
/* set the NET_ACTIVE_WINDOW hint */
|
||||||
active = client ? client->window : None;
|
active = client ? client->window : None;
|
||||||
PROP_SET32(ob_root, net_active_window, window, active);
|
PROP_SET32(ob_root, net_active_window, window, active);
|
||||||
|
|
||||||
/*HOOKFIRECLIENT(focused, client);XXX*/
|
if (focus_client != NULL)
|
||||||
|
dispatch_client(Event_Client_Focus, focus_client);
|
||||||
}
|
}
|
||||||
|
|
|
@ -47,7 +47,7 @@ gboolean ob_remote = FALSE;
|
||||||
gboolean ob_sync = TRUE;
|
gboolean ob_sync = TRUE;
|
||||||
Cursors ob_cursors;
|
Cursors ob_cursors;
|
||||||
|
|
||||||
void signal_handler(int signal);
|
void signal_handler(const ObEvent *e);
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
|
@ -63,9 +63,13 @@ int main(int argc, char **argv)
|
||||||
bind_textdomain_codeset(PACKAGE, "UTF-8");
|
bind_textdomain_codeset(PACKAGE, "UTF-8");
|
||||||
textdomain(PACKAGE);
|
textdomain(PACKAGE);
|
||||||
|
|
||||||
|
/* start our event dispatcher and register for signals */
|
||||||
|
dispatch_startup();
|
||||||
|
dispatch_register(signal_handler, Event_Signal);
|
||||||
|
|
||||||
/* set up signal handler */
|
/* set up signal handler */
|
||||||
sigemptyset(&sigset);
|
sigemptyset(&sigset);
|
||||||
action.sa_handler = signal_handler;
|
action.sa_handler = dispatch_signal;
|
||||||
action.sa_mask = sigset;
|
action.sa_mask = sigset;
|
||||||
action.sa_flags = SA_NOCLDSTOP | SA_NODEFER;
|
action.sa_flags = SA_NOCLDSTOP | SA_NODEFER;
|
||||||
sigaction(SIGUSR1, &action, (struct sigaction *) NULL);
|
sigaction(SIGUSR1, &action, (struct sigaction *) NULL);
|
||||||
|
@ -124,7 +128,6 @@ int main(int argc, char **argv)
|
||||||
|
|
||||||
if (screen_annex()) { /* it will be ours! */
|
if (screen_annex()) { /* it will be ours! */
|
||||||
timer_startup();
|
timer_startup();
|
||||||
dispatch_startup();
|
|
||||||
render_startup();
|
render_startup();
|
||||||
font_startup();
|
font_startup();
|
||||||
themerc_startup();
|
themerc_startup();
|
||||||
|
@ -134,7 +137,7 @@ int main(int argc, char **argv)
|
||||||
focus_startup();
|
focus_startup();
|
||||||
client_startup();
|
client_startup();
|
||||||
|
|
||||||
/*HOOKFIRE(startup, "()");XXX*/
|
dispatch_ob(Event_Ob_Startup);
|
||||||
|
|
||||||
/* get all the existing windows */
|
/* get all the existing windows */
|
||||||
client_manage_all();
|
client_manage_all();
|
||||||
|
@ -147,7 +150,7 @@ int main(int argc, char **argv)
|
||||||
|
|
||||||
client_unmanage_all();
|
client_unmanage_all();
|
||||||
|
|
||||||
/*HOOKFIRE(shutdown, "()");XXX*/
|
dispatch_ob(Event_Ob_Shutdown);
|
||||||
|
|
||||||
client_shutdown();
|
client_shutdown();
|
||||||
screen_shutdown();
|
screen_shutdown();
|
||||||
|
@ -155,20 +158,21 @@ int main(int argc, char **argv)
|
||||||
engine_shutdown();
|
engine_shutdown();
|
||||||
themerc_shutdown();
|
themerc_shutdown();
|
||||||
render_shutdown();
|
render_shutdown();
|
||||||
dispatch_shutdown();
|
|
||||||
timer_shutdown();
|
timer_shutdown();
|
||||||
}
|
}
|
||||||
|
|
||||||
XCloseDisplay(ob_display);
|
XCloseDisplay(ob_display);
|
||||||
|
|
||||||
|
dispatch_shutdown();
|
||||||
|
|
||||||
/* XXX if (ob_restart) */
|
/* XXX if (ob_restart) */
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void signal_handler(int signal)
|
void signal_handler(const ObEvent *e)
|
||||||
{
|
{
|
||||||
switch (signal) {
|
switch (e->data.signal) {
|
||||||
case SIGUSR1:
|
case SIGUSR1:
|
||||||
g_message("Caught SIGUSR1 signal. Restarting.");
|
g_message("Caught SIGUSR1 signal. Restarting.");
|
||||||
ob_shutdown = ob_restart = TRUE;
|
ob_shutdown = ob_restart = TRUE;
|
||||||
|
@ -182,12 +186,12 @@ void signal_handler(int signal)
|
||||||
case SIGINT:
|
case SIGINT:
|
||||||
case SIGTERM:
|
case SIGTERM:
|
||||||
case SIGPIPE:
|
case SIGPIPE:
|
||||||
g_message("Caught signal %d. Exiting.", signal);
|
g_message("Caught signal %d. Exiting.", e->data.signal);
|
||||||
ob_shutdown = TRUE;
|
ob_shutdown = TRUE;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SIGFPE:
|
case SIGFPE:
|
||||||
case SIGSEGV:
|
case SIGSEGV:
|
||||||
g_error("Caught signal %d. Aborting and dumping core.", signal);
|
g_error("Caught signal %d. Aborting and dumping core.",e->data.signal);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,6 +5,8 @@
|
||||||
#include "frame.h"
|
#include "frame.h"
|
||||||
#include "engine.h"
|
#include "engine.h"
|
||||||
#include "focus.h"
|
#include "focus.h"
|
||||||
|
#include "dispatch.h"
|
||||||
|
#include "../render/render.h"
|
||||||
|
|
||||||
#include <X11/Xlib.h>
|
#include <X11/Xlib.h>
|
||||||
#ifdef HAVE_UNISTD_H
|
#ifdef HAVE_UNISTD_H
|
||||||
|
@ -233,6 +235,8 @@ void screen_set_num_desktops(guint num)
|
||||||
/* may be some unnamed desktops that we need to fill in with names */
|
/* may be some unnamed desktops that we need to fill in with names */
|
||||||
screen_update_desktop_names();
|
screen_update_desktop_names();
|
||||||
|
|
||||||
|
dispatch_ob(Event_Ob_NumDesktops);
|
||||||
|
|
||||||
/* change our desktop if we're on one that no longer exists! */
|
/* change our desktop if we're on one that no longer exists! */
|
||||||
if (screen_desktop >= screen_num_desktops)
|
if (screen_desktop >= screen_num_desktops)
|
||||||
screen_set_desktop(num - 1);
|
screen_set_desktop(num - 1);
|
||||||
|
@ -267,9 +271,7 @@ void screen_set_desktop(guint num)
|
||||||
engine_frame_show(c->frame);
|
engine_frame_show(c->frame);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* force the callbacks to fire */
|
dispatch_ob(Event_Ob_Desktop);
|
||||||
if (focus_client == NULL)
|
|
||||||
focus_set_client(NULL);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void screen_update_layout()
|
void screen_update_layout()
|
||||||
|
@ -392,18 +394,17 @@ void screen_show_desktop(gboolean show)
|
||||||
|
|
||||||
show = show ? 1 : 0; /* make it boolean */
|
show = show ? 1 : 0; /* make it boolean */
|
||||||
PROP_SET32(ob_root, net_showing_desktop, cardinal, show);
|
PROP_SET32(ob_root, net_showing_desktop, cardinal, show);
|
||||||
|
|
||||||
|
dispatch_ob(Event_Ob_ShowDesktop);
|
||||||
}
|
}
|
||||||
|
|
||||||
void screen_install_colormap(Client *client, gboolean install)
|
void screen_install_colormap(Client *client, gboolean install)
|
||||||
{
|
{
|
||||||
if (client == NULL) {
|
if (client == NULL) {
|
||||||
/* XXX DONT USE THE DEFAULT SHIT HERE */
|
|
||||||
if (install)
|
if (install)
|
||||||
XInstallColormap(ob_display,
|
XInstallColormap(ob_display, render_colormap);
|
||||||
DefaultColormap(ob_display, ob_screen));
|
|
||||||
else
|
else
|
||||||
XUninstallColormap(ob_display,
|
XUninstallColormap(ob_display, render_colormap);
|
||||||
DefaultColormap(ob_display, ob_screen));
|
|
||||||
} else {
|
} else {
|
||||||
XWindowAttributes wa;
|
XWindowAttributes wa;
|
||||||
if (XGetWindowAttributes(ob_display, client->window, &wa)) {
|
if (XGetWindowAttributes(ob_display, client->window, &wa)) {
|
||||||
|
|
Loading…
Reference in a new issue