]> Dogcows Code - chaz/openbox/blob - openbox/actions/activate.c
6692362219491c1a996bef0d6d97d6d13ba2d437
[chaz/openbox] / openbox / actions / activate.c
1 #include "openbox/actions.h"
2 #include "openbox/event.h"
3 #include "openbox/client.h"
4 #include "openbox/focus.h"
5
6 typedef struct {
7 gboolean here;
8 gboolean raise;
9 gboolean unshade;
10 } Options;
11
12 static gpointer setup_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node);
13 static void free_func(gpointer options);
14 static gboolean run_func(ObActionsData *data, gpointer options);
15
16 void action_activate_startup()
17 {
18 actions_register("Activate",
19 setup_func,
20 free_func,
21 run_func,
22 NULL, NULL);
23 }
24
25 static gpointer setup_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node)
26 {
27 xmlNodePtr n;
28 Options *o;
29
30 o = g_new0(Options, 1);
31 o->raise = TRUE;
32 o->unshade = TRUE;
33
34 if ((n = parse_find_node("here", node)))
35 o->here = parse_bool(doc, n);
36 if ((n = parse_find_node("raise", node)))
37 o->raise = parse_bool(doc, n);
38 if ((n = parse_find_node("unshade", node)))
39 o->unshade = parse_bool(doc, n);
40 return o;
41 }
42
43 static void free_func(gpointer options)
44 {
45 Options *o = options;
46
47 g_free(o);
48 }
49
50 /* Always return FALSE because its not interactive */
51 static gboolean run_func(ObActionsData *data, gpointer options)
52 {
53 Options *o = options;
54
55 if (data->client) {
56 gboolean mouse = (data->uact == OB_USER_ACTION_MOUSE_PRESS ||
57 data->uact == OB_USER_ACTION_MOUSE_RELEASE ||
58 data->uact == OB_USER_ACTION_MOUSE_CLICK ||
59 data->uact == OB_USER_ACTION_MOUSE_DOUBLE_CLICK ||
60 data->uact == OB_USER_ACTION_MOUSE_MOTION);
61 if (!mouse || client_mouse_focusable(data->client) ||
62 data->context != OB_FRAME_CONTEXT_CLIENT ||
63 data->context != OB_FRAME_CONTEXT_FRAME)
64 {
65 /* if using focus_delay, stop the timer now so that focus doesn't
66 go moving on us */
67 event_halt_focus_delay();
68
69 client_activate(data->client, o->here, o->raise, o->unshade, TRUE);
70 }
71 } else {
72 /* focus action on something other than a client, make keybindings
73 work for this openbox instance, but don't focus any specific client
74 */
75 focus_nothing();
76 }
77
78 return FALSE;
79 }
This page took 0.035274 seconds and 3 git commands to generate.