10 #if GTK_MAJOR_VERSION == 2
14 static const guint ALL_ACCELS_MASK = GDK_CONTROL_MASK | GDK_SHIFT_MASK | GDK_MOD1_MASK;
15 static const guint MOUSE_MASK = GDK_CONTROL_MASK | GDK_SHIFT_MASK | GDK_MOD1_MASK |
16 GDK_BUTTON1_MASK | GDK_BUTTON2_MASK | GDK_BUTTON3_MASK | GDK_BUTTON4_MASK | GDK_BUTTON5_MASK;
19 clean_mask(guint hardware_keycode, GdkModifierType state, gint group, guint* clean, guint* keyval)
21 GdkModifierType consumed = 0;
22 if ((gdk_keymap_translate_keyboard_state(
23 gdk_keymap_get_default(),
35 *clean = state & ~consumed & ALL_ACCELS_MASK;
43 GdkEventKey* event, girara_session_t* session)
45 g_return_val_if_fail(session != NULL, FALSE);
49 if (clean_mask(event->hardware_keycode, event->state, event->group, &clean, &keyval) ==
false) {
55 if (session->buffer.command != NULL) {
59 if ( keyval == shortcut->key
60 && (clean == shortcut->mask || (shortcut->key >= 0x21
61 && shortcut->key <= 0x7E && clean == GDK_SHIFT_MASK))
62 && (session->modes.current_mode == shortcut->mode || shortcut->mode == 0)
63 && shortcut->function != NULL
66 int t = (session->buffer.n > 0) ? session->buffer.n : 1;
67 for (
int i = 0; i < t; i++) {
68 if (shortcut->function(session, &(shortcut->argument), NULL, session->buffer.n) ==
false) {
73 if (session->global.buffer != NULL) {
74 g_string_free(session->global.buffer, TRUE);
75 session->global.buffer = NULL;
78 session->buffer.n = 0;
80 if (session->events.buffer_changed != NULL) {
81 session->events.buffer_changed(session);
90 if (event->keyval >= 0x21 && event->keyval <= 0x7E) {
92 if (session->global.buffer == NULL) {
93 session->global.buffer = g_string_new(
"");
96 session->global.buffer = g_string_append_c(session->global.buffer, event->keyval);
98 if (session->buffer.command == NULL && event->keyval >= 0x30 && event->keyval <= 0x39) {
99 if (((session->buffer.n * 10) + (event->keyval -
'0')) < INT_MAX) {
100 session->buffer.n = (session->buffer.n * 10) + (event->keyval -
'0');
103 if (session->buffer.command == NULL) {
104 session->buffer.command = g_string_new(
"");
107 session->buffer.command = g_string_append_c(session->buffer.command, event->keyval);
110 if (session->events.buffer_changed != NULL) {
111 session->events.buffer_changed(session);
116 if (session->buffer.command != NULL) {
117 bool matching_command = FALSE;
120 if (shortcut->buffered_command != NULL) {
122 if (!strncmp(session->buffer.command->str, shortcut->buffered_command, session->buffer.command->len)) {
124 if (!strcmp(session->buffer.command->str, shortcut->buffered_command)) {
125 g_string_free(session->buffer.command, TRUE);
126 g_string_free(session->global.buffer, TRUE);
127 session->buffer.command = NULL;
128 session->global.buffer = NULL;
130 if (session->events.buffer_changed != NULL) {
131 session->events.buffer_changed(session);
134 int t = (session->buffer.n > 0) ? session->buffer.n : 1;
135 for (
int i = 0; i < t; i++) {
136 if (shortcut->function(session, &(shortcut->argument), NULL, session->buffer.n) ==
false) {
141 session->buffer.n = 0;
146 matching_command = TRUE;
152 if (matching_command ==
false) {
153 g_string_free(session->buffer.command, TRUE);
154 g_string_free(session->global.buffer, TRUE);
155 session->buffer.command = NULL;
156 session->global.buffer = NULL;
157 session->buffer.n = 0;
159 if (session->events.buffer_changed != NULL) {
160 session->events.buffer_changed(session);
170 GdkEventButton* button, girara_session_t* session)
172 g_return_val_if_fail(session != NULL,
false);
173 g_return_val_if_fail(button != NULL,
false);
176 girara_event_t event;
178 switch (button->type) {
179 case GDK_BUTTON_PRESS:
182 case GDK_2BUTTON_PRESS:
185 case GDK_3BUTTON_PRESS:
196 const guint state = button->state & MOUSE_MASK;
199 GIRARA_LIST_FOREACH(session->bindings.mouse_events, girara_mouse_event_t*, iter, mouse_event)
200 if (mouse_event->function != NULL
201 && button->button == mouse_event->button
202 && state == mouse_event->mask
203 && mouse_event->event_type == event.type
204 && (session->modes.current_mode & mouse_event->mode || mouse_event->mode == 0)
206 mouse_event->function(session, &(mouse_event->argument), &event, session->buffer.n);
218 g_return_val_if_fail(session != NULL,
false);
219 g_return_val_if_fail(button != NULL,
false);
222 girara_event_t event;
227 const guint state = button->state & MOUSE_MASK;
230 GIRARA_LIST_FOREACH(session->bindings.mouse_events, girara_mouse_event_t*, iter, mouse_event)
231 if (mouse_event->function != NULL
232 && button->button == mouse_event->button
233 && state == mouse_event->mask
235 && (session->modes.current_mode & mouse_event->mode || mouse_event->mode == 0)
237 mouse_event->function(session, &(mouse_event->argument), &event, session->buffer.n);
249 g_return_val_if_fail(session != NULL,
false);
250 g_return_val_if_fail(button != NULL,
false);
253 girara_event_t event;
258 const guint state = button->state & MOUSE_MASK;
261 GIRARA_LIST_FOREACH(session->bindings.mouse_events, girara_mouse_event_t*, iter, mouse_event)
262 if (mouse_event->function != NULL
263 && state == mouse_event->mask
264 && mouse_event->event_type == event.type
265 && (session->modes.current_mode & mouse_event->mode || mouse_event->mode == 0)
267 mouse_event->function(session, &(mouse_event->argument), &event, session->buffer.n);
279 g_return_val_if_fail(session != NULL,
false);
280 g_return_val_if_fail(scroll != NULL,
false);
283 girara_event_t event;
287 switch (scroll->direction) {
291 case GDK_SCROLL_DOWN:
294 case GDK_SCROLL_LEFT:
297 case GDK_SCROLL_RIGHT:
304 const guint state = scroll->state & MOUSE_MASK;
308 GIRARA_LIST_FOREACH(session->bindings.mouse_events, girara_mouse_event_t*, iter, mouse_event)
309 if (mouse_event->function != NULL
310 && state == mouse_event->mask
311 && mouse_event->event_type == event.type
312 && (session->modes.current_mode & mouse_event->mode || mouse_event->mode == 0)
314 mouse_event->function(session, &(mouse_event->argument), &event, session->buffer.n);
326 g_return_val_if_fail(session != NULL, FALSE);
329 if (session->signals.inputbar_custom_activate != NULL) {
330 bool return_value = session->signals.inputbar_custom_activate(entry, session->signals.inputbar_custom_data);
333 session->signals.inputbar_custom_activate = NULL;
334 session->signals.inputbar_custom_key_press_event = NULL;
335 session->signals.inputbar_custom_data = NULL;
337 if (session->gtk.inputbar_dialog != NULL && session->gtk.inputbar_entry != NULL) {
338 gtk_label_set_markup(session->gtk.inputbar_dialog,
"");
339 gtk_widget_hide(GTK_WIDGET(session->gtk.inputbar_dialog));
340 gtk_widget_hide(GTK_WIDGET(session->gtk.inputbar));
341 gtk_entry_set_visibility(session->gtk.inputbar_entry, TRUE);
349 gchar *input = gtk_editable_get_chars(GTK_EDITABLE(entry), 1, -1);
355 if (strlen(input) == 0) {
364 if (g_shell_parse_argv(input, &argc, &argv, NULL) == FALSE) {
369 gchar *cmd = argv[0];
372 char *identifier_s = gtk_editable_get_chars(GTK_EDITABLE(entry), 0, 1);
373 if (identifier_s == NULL) {
379 char identifier = identifier_s[0];
380 g_free(identifier_s);
382 GIRARA_LIST_FOREACH(session->bindings.special_commands, girara_special_command_t*, iter, special_command)
383 if (special_command->identifier == identifier) {
384 if (special_command->always !=
true) {
385 special_command->function(session, input, &(special_command->argument));
400 if ((g_strcmp0(cmd, command->command) == 0) ||
401 (g_strcmp0(cmd, command->abbr) == 0))
404 if (argument_list == NULL) {
413 for(
int i = 1; i < argc; i++) {
414 char* argument = g_strdup(argv[i]);
418 command->function(session, argument_list);
426 gtk_widget_hide(GTK_WIDGET(session->gtk.inputbar));
427 gtk_widget_hide(GTK_WIDGET(session->gtk.inputbar_dialog));
442 g_return_val_if_fail(session != NULL,
false);
445 if (session->signals.inputbar_custom_key_press_event != NULL) {
446 return session->signals.inputbar_custom_key_press_event(entry, event, session);
450 GdkModifierType consumed = 0;
452 if (gdk_keymap_translate_keyboard_state(
453 gdk_keymap_get_default(),
454 event->hardware_keycode,
464 const guint clean =
event->state & ~consumed & ALL_ACCELS_MASK;
466 GIRARA_LIST_FOREACH(session->bindings.inputbar_shortcuts, girara_inputbar_shortcut_t*, iter, inputbar_shortcut)
467 if (inputbar_shortcut->key == keyval
468 && inputbar_shortcut->mask == clean)
470 if (inputbar_shortcut->function != NULL) {
471 inputbar_shortcut->function(session, &(inputbar_shortcut->argument), NULL, 0);
477 GIRARA_LIST_FOREACH_END(session->bindings.inputbar_shortcuts, girara_inputbar_shortcut_t*, iter, inputbar_shortcut);
479 if ((session->gtk.results != NULL) &&
480 (gtk_widget_get_visible(GTK_WIDGET(session->gtk.results)) == TRUE) &&
481 (event->keyval == GDK_KEY_space))
483 gtk_widget_hide(GTK_WIDGET(session->gtk.results));
492 g_return_val_if_fail(session != NULL,
false);
495 char *identifier_s = gtk_editable_get_chars(entry, 0, 1);
496 if (identifier_s == NULL) {
500 char identifier = identifier_s[0];
501 g_free(identifier_s);
503 GIRARA_LIST_FOREACH(session->bindings.special_commands, girara_special_command_t*, iter, special_command)
504 if ((special_command->identifier == identifier) &&
505 (special_command->always ==
true))
507 gchar *input = gtk_editable_get_chars(GTK_EDITABLE(entry), 1, -1);
508 special_command->function(session, input, &(special_command->argument));