X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Faction.c;h=c07fa1625826cbf47cc5a220a6bbde9f30e23ba8;hb=2e90dfbfecb558d0aaa13577e3147f3d66cb7691;hp=babb8f82adcc46a1f0f27f4b31078ca470400092;hpb=9bd60fd92b8ff09630b35973947493a23015c621;p=chaz%2Fopenbox diff --git a/openbox/action.c b/openbox/action.c index babb8f82..c07fa162 100644 --- a/openbox/action.c +++ b/openbox/action.c @@ -809,7 +809,7 @@ ObAction *action_from_string(const gchar *name, ObUserAction uact) { ObAction *a = NULL; gboolean exist = FALSE; - int i; + gint i; for (i = 0; actionstrings[i].name; i++) if (!g_ascii_strcasecmp(name, actionstrings[i].name)) { @@ -831,7 +831,7 @@ ObAction *action_from_string(const gchar *name, ObUserAction uact) ObAction *action_parse(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node, ObUserAction uact) { - char *actname; + gchar *actname; ObAction *act = NULL; xmlNodePtr n; @@ -891,8 +891,8 @@ ObAction *action_parse(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node, if ((n = parse_find_node("dialog", node->xmlChildrenNode))) act->data.cycle.dialog = parse_bool(doc, n); } + INTERACTIVE_LIMIT(act, uact); } - INTERACTIVE_LIMIT(act, uact); g_free(actname); } return act; @@ -946,14 +946,18 @@ void action_run_list(GSList *acts, ObClient *c, ObFrameContext context, a->data.inter.cancel = cancel; a->data.inter.final = done; if (!(cancel || done)) - keyboard_interactive_grab(state, a->data.any.c, a); + if (!keyboard_interactive_grab(state, a->data.any.c, a)) + continue; } - /* closing interactive actions are not queued */ - if (!done) - ob_main_loop_queue_action(ob_main_loop, a); - else + /* XXX UGLY HACK race with motion event starting a move and the + button release gettnig processed first. answer: don't queue + moveresize starts. UGLY HACK XXX */ + if (a->data.any.interactive || a->func == action_moveresize) { + /* interactive actions are not queued */ a->func(&a->data); + } else + ob_main_loop_queue_action(ob_main_loop, a); } } } @@ -974,7 +978,7 @@ void action_run_string(const gchar *name, struct _ObClient *c) void action_execute(union ActionData *data) { GError *e = NULL; - char *cmd; + gchar *cmd; if (data->execute.path) { cmd = g_filename_from_utf8(data->execute.path, -1, NULL, NULL, NULL); if (cmd) { @@ -996,6 +1000,10 @@ void action_activate(union ActionData *data) void action_focus(union ActionData *data) { + /* if using focus_delay, stop the timer now so that focus doesn't go moving + on us */ + event_halt_focus_delay(); + client_focus(data->client.any.c); } @@ -1304,18 +1312,27 @@ void action_toggle_decorations(union ActionData *data) client_action_end(data); } -static guint32 pick_corner(int x, int y, int cx, int cy, int cw, int ch) +static guint32 pick_corner(gint x, gint y, gint cx, gint cy, gint cw, gint ch) { - if (x - cx > cw / 2) { - if (y - cy > ch / 2) + if ((cw / 3 < 1) || (x - cx > cw / 3 * 2)) { + if ((ch / 3 < 1) || (y - cy > ch / 3 * 2)) return prop_atoms.net_wm_moveresize_size_bottomright; - else + else if (y - cy < ch / 3) return prop_atoms.net_wm_moveresize_size_topright; + else + return prop_atoms.net_wm_moveresize_size_right; + } else if (x - cx < cw / 3) { + if (y - cy > ch / 3 * 2) + return prop_atoms.net_wm_moveresize_size_bottomleft; + else if (y - cy < ch / 3) + return prop_atoms.net_wm_moveresize_size_topleft; + else + return prop_atoms.net_wm_moveresize_size_left; } else { if (y - cy > ch / 2) - return prop_atoms.net_wm_moveresize_size_bottomleft; + return prop_atoms.net_wm_moveresize_size_bottom; else - return prop_atoms.net_wm_moveresize_size_topleft; + return prop_atoms.net_wm_moveresize_size_top; } } @@ -1373,6 +1390,10 @@ void action_showmenu(union ActionData *data) void action_cycle_windows(union ActionData *data) { + /* if using focus_delay, stop the timer now so that focus doesn't go moving + on us */ + event_halt_focus_delay(); + focus_cycle(data->cycle.forward, data->cycle.linear, data->cycle.dialog, data->cycle.inter.final, data->cycle.inter.cancel); @@ -1380,6 +1401,10 @@ void action_cycle_windows(union ActionData *data) void action_directional_focus(union ActionData *data) { + /* if using focus_delay, stop the timer now so that focus doesn't go moving + on us */ + event_halt_focus_delay(); + focus_directional_cycle(data->interdiraction.direction, data->interdiraction.dialog, data->interdiraction.inter.final, @@ -1388,7 +1413,7 @@ void action_directional_focus(union ActionData *data) void action_movetoedge(union ActionData *data) { - int x, y; + gint x, y; ObClient *c = data->diraction.any.c; x = c->frame->area.x; @@ -1420,7 +1445,7 @@ void action_movetoedge(union ActionData *data) void action_growtoedge(union ActionData *data) { - int x, y, width, height, dest; + gint x, y, width, height, dest; ObClient *c = data->diraction.any.c; Rect *a;