plugins/mouse/mouseparse.c (raw)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 |
#include "kernel/action.h" #include "kernel/parse.h" #include "kernel/prop.h" #include "mouse.h" void mouseparse(ParseToken *token) { static char *top = NULL; static char *context = NULL, *button = NULL; static char *arg_str = NULL; static int arg_int = 0; static MouseAction event = -1; static Action *action = NULL; static gboolean err = FALSE; if (err) { if (token->type == TOKEN_NEWLINE) err = FALSE; /* just fall through and free the token */ } else if (top == NULL) { if (token->type == TOKEN_IDENTIFIER && !g_ascii_strcasecmp("mbind", token->data.identifier)) { top = token->data.identifier; return; } else { yyerror("syntax error (expected mbind)"); err = TRUE; } } else if (context == NULL) { if (token->type == TOKEN_IDENTIFIER) { context = token->data.identifier; return; } else { yyerror("syntax error (expected Key)"); err = TRUE; } } else if (event == (unsigned) -1) { if (token->type == TOKEN_IDENTIFIER) { if (!g_ascii_strcasecmp("press", token->data.identifier)) event = MouseAction_Press; else if (!g_ascii_strcasecmp("release", token->data.identifier)) event = MouseAction_Release; else if (!g_ascii_strcasecmp("click", token->data.identifier)) event = MouseAction_Click; else if (!g_ascii_strcasecmp("doubleclick",token->data.identifier)) event = MouseAction_DClick; else if (!g_ascii_strcasecmp("drag", token->data.identifier)) event = MouseAction_Motion; if (event != (unsigned) -1) return; else { yyerror("invalid event"); err = TRUE; } } else { yyerror("syntax error (expected event)"); err = TRUE; } } else if (button == NULL) { if (token->type == TOKEN_IDENTIFIER) { button = token->data.identifier; return; } else { yyerror("syntax error (expected button)"); err = TRUE; } } else if (action == NULL) { if (token->type == TOKEN_IDENTIFIER) { action = action_from_string(token->data.identifier); /* check for valid actions for motion events */ if (event == MouseAction_Motion) { if (action && (action->func != action_moveresize || action->data.moveresize.corner == prop_atoms.net_wm_moveresize_move_keyboard || action->data.moveresize.corner == prop_atoms.net_wm_moveresize_size_keyboard)) { action_free(action); action = NULL; } } else { if (action && action->func == action_moveresize && action->data.moveresize.corner != prop_atoms.net_wm_moveresize_move_keyboard && action->data.moveresize.corner != prop_atoms.net_wm_moveresize_size_keyboard) { action_free(action); action = NULL; } } if (action != NULL) { return; } else { yyerror("invalid action"); err = TRUE; } } else { yyerror("syntax error (expected action)"); err = TRUE; } } else if (token->type == TOKEN_STRING) { arg_str = token->data.string; return; } else if (token->type == TOKEN_INTEGER) { arg_int = token->data.integer; return; } else if (token->type != TOKEN_NEWLINE) { yyerror("syntax error (unexpected trailing token)"); } else { /* these use the argument */ if (action->func == action_execute || action->func == action_restart) action->data.execute.path = g_strdup(arg_str); else if (action->func == action_showmenu) action->data.showmenu.name = g_strdup(arg_str); if ((action->func == action_desktop || action->func == action_send_to_desktop) && arg_int) action->data.desktop.desk = (unsigned) arg_int - 1; if (action->func == action_move_relative_horz || action->func == action_move_relative_vert || action->func == action_resize_relative_horz || action->func == action_resize_relative_vert) action->data.relative.delta = arg_int; if (mbind(button, context, event, action)) action = NULL; /* don't free this if mbind succeeds */ else yyerror("failed to add mouse binding"); } g_free(top); top = NULL; g_free(context); context = NULL; g_free(button); button = NULL; g_free(arg_str); arg_str = NULL; arg_int = 0; event = -1; action_free(action); action = NULL; parse_free_token(token); } |