not using quarks, using an array and a Context enum for contexts
This commit is contained in:
parent
47cc179781
commit
d58799bc25
1 changed files with 68 additions and 78 deletions
|
@ -1,15 +1,17 @@
|
||||||
#include "../../kernel/openbox.h"
|
#include "kernel/openbox.h"
|
||||||
#include "../../kernel/dispatch.h"
|
#include "kernel/dispatch.h"
|
||||||
#include "../../kernel/action.h"
|
#include "kernel/action.h"
|
||||||
#include "../../kernel/event.h"
|
#include "kernel/event.h"
|
||||||
#include "../../kernel/client.h"
|
#include "kernel/client.h"
|
||||||
#include "../../kernel/frame.h"
|
#include "kernel/frame.h"
|
||||||
#include "../../kernel/grab.h"
|
#include "kernel/grab.h"
|
||||||
#include "../../kernel/engine.h"
|
#include "kernel/engine.h"
|
||||||
#include "../../kernel/config.h"
|
#include "kernel/config.h"
|
||||||
|
#include "kernel/parse.h"
|
||||||
|
#include "kernel/frame.h"
|
||||||
#include "translate.h"
|
#include "translate.h"
|
||||||
#include "mouse.h"
|
#include "mouse.h"
|
||||||
#include "mouserc_parse.h"
|
#include "mouseparse.h"
|
||||||
#include <glib.h>
|
#include <glib.h>
|
||||||
|
|
||||||
void plugin_setup_config()
|
void plugin_setup_config()
|
||||||
|
@ -23,52 +25,43 @@ void plugin_setup_config()
|
||||||
"The amount of time (in milliseconds) in "
|
"The amount of time (in milliseconds) in "
|
||||||
"which two clicks must occur to cause a "
|
"which two clicks must occur to cause a "
|
||||||
"DoubleClick event."));
|
"DoubleClick event."));
|
||||||
|
|
||||||
|
parse_reg_section("mouse", mouseparse);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* GData of GSList*s of PointerBinding*s. */
|
/* Array of GSList*s of PointerBinding*s. */
|
||||||
static GData *bound_contexts;
|
static GSList *bound_contexts[NUM_CONTEXTS];
|
||||||
|
|
||||||
struct foreach_grab_temp {
|
|
||||||
Client *client;
|
|
||||||
gboolean grab;
|
|
||||||
};
|
|
||||||
|
|
||||||
static void foreach_grab(GQuark key, gpointer data, gpointer user_data)
|
|
||||||
{
|
|
||||||
struct foreach_grab_temp *d = user_data;
|
|
||||||
GSList *it;
|
|
||||||
for (it = data; it != NULL; it = it->next) {
|
|
||||||
/* grab/ungrab the button */
|
|
||||||
MouseBinding *b = it->data;
|
|
||||||
Window win;
|
|
||||||
int mode;
|
|
||||||
unsigned int mask;
|
|
||||||
|
|
||||||
if (key == g_quark_try_string("frame")) {
|
|
||||||
win = d->client->frame->window;
|
|
||||||
mode = GrabModeAsync;
|
|
||||||
mask = ButtonPressMask | ButtonMotionMask | ButtonReleaseMask;
|
|
||||||
} else if (key == g_quark_try_string("client")) {
|
|
||||||
win = d->client->frame->plate;
|
|
||||||
mode = GrabModeSync; /* this is handled in event */
|
|
||||||
mask = ButtonPressMask; /* can't catch more than this with Sync
|
|
||||||
mode the release event is manufactured
|
|
||||||
in event */
|
|
||||||
} else return;
|
|
||||||
|
|
||||||
if (d->grab)
|
|
||||||
grab_button(b->button, b->state, win, mask, mode);
|
|
||||||
else
|
|
||||||
ungrab_button(b->button, b->state, win);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void grab_for_client(Client *client, gboolean grab)
|
static void grab_for_client(Client *client, gboolean grab)
|
||||||
{
|
{
|
||||||
struct foreach_grab_temp bt;
|
int i;
|
||||||
bt.client = client;
|
GSList *it;
|
||||||
bt.grab = grab;
|
|
||||||
g_datalist_foreach(&bound_contexts, foreach_grab, &bt);
|
for (i = 0; i < NUM_CONTEXTS; ++i)
|
||||||
|
for (it = bound_contexts[i]; it != NULL; it = it->next) {
|
||||||
|
/* grab/ungrab the button */
|
||||||
|
MouseBinding *b = it->data;
|
||||||
|
Window win;
|
||||||
|
int mode;
|
||||||
|
unsigned int mask;
|
||||||
|
|
||||||
|
if (i == Context_Frame) {
|
||||||
|
win = client->frame->window;
|
||||||
|
mode = GrabModeAsync;
|
||||||
|
mask = ButtonPressMask | ButtonMotionMask | ButtonReleaseMask;
|
||||||
|
} else if (i == Context_Client) {
|
||||||
|
win = client->frame->plate;
|
||||||
|
mode = GrabModeSync; /* this is handled in event */
|
||||||
|
mask = ButtonPressMask; /* can't catch more than this with Sync
|
||||||
|
mode the release event is
|
||||||
|
manufactured in event() */
|
||||||
|
} else continue;
|
||||||
|
|
||||||
|
if (grab)
|
||||||
|
grab_button(b->button, b->state, win, mask, mode);
|
||||||
|
else
|
||||||
|
ungrab_button(b->button, b->state, win);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void grab_all_clients(gboolean grab)
|
static void grab_all_clients(gboolean grab)
|
||||||
|
@ -79,30 +72,32 @@ static void grab_all_clients(gboolean grab)
|
||||||
grab_for_client(it->data, grab);
|
grab_for_client(it->data, grab);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void foreach_clear(GQuark key, gpointer data, gpointer user_data)
|
static void clearall()
|
||||||
{
|
{
|
||||||
|
int i;
|
||||||
GSList *it;
|
GSList *it;
|
||||||
user_data = user_data;
|
|
||||||
for (it = data; it != NULL; it = it->next) {
|
for(i = 0; i < NUM_CONTEXTS; ++i) {
|
||||||
int i;
|
for (it = bound_contexts[i]; it != NULL; it = it->next) {
|
||||||
|
int j;
|
||||||
|
|
||||||
MouseBinding *b = it->data;
|
MouseBinding *b = it->data;
|
||||||
for (i = 0; i < NUM_MOUSEACTION; ++i)
|
for (j = 0; j < NUM_MOUSEACTION; ++j)
|
||||||
if (b->action[i] != NULL)
|
if (b->action[j] != NULL)
|
||||||
action_free(b->action[i]);
|
action_free(b->action[j]);
|
||||||
g_free(b);
|
g_free(b);
|
||||||
|
}
|
||||||
|
g_slist_free(bound_contexts[i]);
|
||||||
}
|
}
|
||||||
g_slist_free(data);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void fire_button(MouseAction a, GQuark context, Client *c, guint state,
|
static void fire_button(MouseAction a, Context context, Client *c, guint state,
|
||||||
guint button)
|
guint button)
|
||||||
{
|
{
|
||||||
GSList *it;
|
GSList *it;
|
||||||
MouseBinding *b;
|
MouseBinding *b;
|
||||||
|
|
||||||
for (it = g_datalist_id_get_data(&bound_contexts, context);
|
for (it = bound_contexts[context]; it != NULL; it = it->next) {
|
||||||
it != NULL; it = it->next) {
|
|
||||||
b = it->data;
|
b = it->data;
|
||||||
if (b->state == state && b->button == button)
|
if (b->state == state && b->button == button)
|
||||||
break;
|
break;
|
||||||
|
@ -124,7 +119,7 @@ static void fire_button(MouseAction a, GQuark context, Client *c, guint state,
|
||||||
clicked, Corner_TopLeft if a good default if there is no client
|
clicked, Corner_TopLeft if a good default if there is no client
|
||||||
Returns True or False for if a binding existed for the action or not.
|
Returns True or False for if a binding existed for the action or not.
|
||||||
*/
|
*/
|
||||||
static gboolean fire_motion(MouseAction a, GQuark context, Client *c,
|
static gboolean fire_motion(MouseAction a, Context context, Client *c,
|
||||||
guint state, guint button, int cx, int cy,
|
guint state, guint button, int cx, int cy,
|
||||||
int cw, int ch, int dx, int dy,
|
int cw, int ch, int dx, int dy,
|
||||||
gboolean final, Corner corner)
|
gboolean final, Corner corner)
|
||||||
|
@ -132,8 +127,7 @@ static gboolean fire_motion(MouseAction a, GQuark context, Client *c,
|
||||||
GSList *it;
|
GSList *it;
|
||||||
MouseBinding *b;
|
MouseBinding *b;
|
||||||
|
|
||||||
for (it = g_datalist_id_get_data(&bound_contexts, context);
|
for (it = bound_contexts[context]; it != NULL; it = it->next) {
|
||||||
it != NULL; it = it->next) {
|
|
||||||
b = it->data;
|
b = it->data;
|
||||||
if (b->state == state && b->button == button)
|
if (b->state == state && b->button == button)
|
||||||
break;
|
break;
|
||||||
|
@ -202,7 +196,7 @@ static void event(ObEvent *e, void *foo)
|
||||||
ConfigValue dragthreshold;
|
ConfigValue dragthreshold;
|
||||||
gboolean click = FALSE;
|
gboolean click = FALSE;
|
||||||
gboolean dclick = FALSE;
|
gboolean dclick = FALSE;
|
||||||
GQuark context;
|
Context context;
|
||||||
|
|
||||||
if (!config_get("mouse.dragThreshold", Config_Integer, &dragthreshold))
|
if (!config_get("mouse.dragThreshold", Config_Integer, &dragthreshold))
|
||||||
dragthreshold.integer = 3; /* default */
|
dragthreshold.integer = 3; /* default */
|
||||||
|
@ -245,7 +239,7 @@ static void event(ObEvent *e, void *foo)
|
||||||
e->data.x.client, e->data.x.e->xbutton.state,
|
e->data.x.client, e->data.x.e->xbutton.state,
|
||||||
e->data.x.e->xbutton.button);
|
e->data.x.e->xbutton.button);
|
||||||
|
|
||||||
if (context == g_quark_try_string("client")) {
|
if (context == Context_Client) {
|
||||||
/* Replay the event, so it goes to the client*/
|
/* Replay the event, so it goes to the client*/
|
||||||
XAllowEvents(ob_display, ReplayPointer, event_lasttime);
|
XAllowEvents(ob_display, ReplayPointer, event_lasttime);
|
||||||
/* Fall through to the release case! */
|
/* Fall through to the release case! */
|
||||||
|
@ -334,7 +328,7 @@ gboolean mbind(char *buttonstr, char *contextstr, MouseAction mact,
|
||||||
Action *action)
|
Action *action)
|
||||||
{
|
{
|
||||||
guint state, button;
|
guint state, button;
|
||||||
GQuark context;
|
Context context;
|
||||||
MouseBinding *b;
|
MouseBinding *b;
|
||||||
GSList *it;
|
GSList *it;
|
||||||
|
|
||||||
|
@ -344,7 +338,7 @@ gboolean mbind(char *buttonstr, char *contextstr, MouseAction mact,
|
||||||
}
|
}
|
||||||
|
|
||||||
contextstr = g_ascii_strdown(contextstr, -1);
|
contextstr = g_ascii_strdown(contextstr, -1);
|
||||||
context = g_quark_try_string(contextstr);
|
context = frame_context_from_string(contextstr);
|
||||||
if (!context) {
|
if (!context) {
|
||||||
g_warning("invalid context '%s'", contextstr);
|
g_warning("invalid context '%s'", contextstr);
|
||||||
g_free(contextstr);
|
g_free(contextstr);
|
||||||
|
@ -352,8 +346,7 @@ gboolean mbind(char *buttonstr, char *contextstr, MouseAction mact,
|
||||||
}
|
}
|
||||||
g_free(contextstr);
|
g_free(contextstr);
|
||||||
|
|
||||||
for (it = g_datalist_id_get_data(&bound_contexts, context);
|
for (it = bound_contexts[context]; it != NULL; it = it->next){
|
||||||
it != NULL; it = it->next){
|
|
||||||
b = it->data;
|
b = it->data;
|
||||||
if (b->state == state && b->button == button) {
|
if (b->state == state && b->button == button) {
|
||||||
/* already bound */
|
/* already bound */
|
||||||
|
@ -373,8 +366,7 @@ gboolean mbind(char *buttonstr, char *contextstr, MouseAction mact,
|
||||||
b->state = state;
|
b->state = state;
|
||||||
b->button = button;
|
b->button = button;
|
||||||
b->action[mact] = action;
|
b->action[mact] = action;
|
||||||
g_datalist_id_set_data(&bound_contexts, context,
|
bound_contexts[context] = g_slist_append(bound_contexts[context], b);
|
||||||
g_slist_append(g_datalist_id_get_data(&bound_contexts, context), b));
|
|
||||||
|
|
||||||
grab_all_clients(TRUE);
|
grab_all_clients(TRUE);
|
||||||
|
|
||||||
|
@ -386,8 +378,6 @@ void plugin_startup()
|
||||||
dispatch_register(Event_Client_Mapped | Event_Client_Destroy |
|
dispatch_register(Event_Client_Mapped | Event_Client_Destroy |
|
||||||
Event_X_ButtonPress | Event_X_ButtonRelease |
|
Event_X_ButtonPress | Event_X_ButtonRelease |
|
||||||
Event_X_MotionNotify, (EventHandler)event, NULL);
|
Event_X_MotionNotify, (EventHandler)event, NULL);
|
||||||
|
|
||||||
mouserc_parse();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void plugin_shutdown()
|
void plugin_shutdown()
|
||||||
|
@ -395,5 +385,5 @@ void plugin_shutdown()
|
||||||
dispatch_register(0, (EventHandler)event, NULL);
|
dispatch_register(0, (EventHandler)event, NULL);
|
||||||
|
|
||||||
grab_all_clients(FALSE);
|
grab_all_clients(FALSE);
|
||||||
g_datalist_foreach(&bound_contexts, foreach_clear, NULL);
|
clearall();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue