9 #include <glib/gi18n-lib.h>
13 static const guint ALL_ACCELS_MASK = GDK_CONTROL_MASK | GDK_SHIFT_MASK | GDK_MOD1_MASK;
14 static const guint MOUSE_MASK = GDK_CONTROL_MASK | GDK_SHIFT_MASK | GDK_MOD1_MASK |
15 GDK_BUTTON1_MASK | GDK_BUTTON2_MASK | GDK_BUTTON3_MASK | GDK_BUTTON4_MASK | GDK_BUTTON5_MASK;
18 clean_mask(guint hardware_keycode, GdkModifierType state, gint group, guint* clean, guint* keyval)
20 GdkModifierType consumed = 0;
21 if ((gdk_keymap_translate_keyboard_state(
22 gdk_keymap_get_default(),
34 *clean = state & ~consumed & ALL_ACCELS_MASK;
77 GdkEventKey* event, girara_session_t* session)
79 g_return_val_if_fail(session != NULL, FALSE);
84 if (clean_mask(event->hardware_keycode, event->state, event->group, &clean, &keyval) ==
false) {
90 if (session->buffer.command != NULL) {
94 if ( keyval == shortcut->key
95 && (clean == shortcut->mask || (shortcut->key >= 0x21
96 && shortcut->key <= 0x7E && clean == GDK_SHIFT_MASK))
97 && (session->modes.current_mode == shortcut->mode || shortcut->mode == 0)
98 && shortcut->function != NULL
101 int t = (session->buffer.n > 0) ? session->buffer.n : 1;
102 for (
int i = 0; i < t; i++) {
103 if (shortcut->function(session, &(shortcut->argument), NULL, session->buffer.n) ==
false) {
108 if (session->global.buffer != NULL) {
109 g_string_free(session->global.buffer, TRUE);
110 session->global.buffer = NULL;
113 session->buffer.n = 0;
115 if (session->events.buffer_changed != NULL) {
116 session->events.buffer_changed(session);
125 if (keyval >= 0x21 && keyval <= 0x7E) {
127 if (session->global.buffer == NULL) {
128 session->global.buffer = g_string_new(
"");
131 session->global.buffer = g_string_append_c(session->global.buffer, keyval);
133 if (session->buffer.command == NULL && keyval >= 0x30 && keyval <= 0x39) {
134 if (((session->buffer.n * 10) + (keyval -
'0')) < INT_MAX) {
135 session->buffer.n = (session->buffer.n * 10) + (keyval -
'0');
138 if (session->buffer.command == NULL) {
139 session->buffer.command = g_string_new(
"");
142 session->buffer.command = g_string_append_c(session->buffer.command, keyval);
145 if (session->events.buffer_changed != NULL) {
146 session->events.buffer_changed(session);
151 if (session->buffer.command != NULL) {
152 bool matching_command = FALSE;
155 if (shortcut->buffered_command != NULL) {
157 if (!strncmp(session->buffer.command->str, shortcut->buffered_command, session->buffer.command->len)) {
159 if (!strcmp(session->buffer.command->str, shortcut->buffered_command)
160 && (session->modes.current_mode == shortcut->mode || shortcut->mode == 0)) {
161 g_string_free(session->buffer.command, TRUE);
162 g_string_free(session->global.buffer, TRUE);
163 session->buffer.command = NULL;
164 session->global.buffer = NULL;
166 if (session->events.buffer_changed != NULL) {
167 session->events.buffer_changed(session);
170 int t = (session->buffer.n > 0) ? session->buffer.n : 1;
171 for (
int i = 0; i < t; i++) {
172 if (shortcut->function(session, &(shortcut->argument), NULL, session->buffer.n) ==
false) {
177 session->buffer.n = 0;
182 matching_command = TRUE;
188 if (matching_command ==
false) {
189 g_string_free(session->buffer.command, TRUE);
190 g_string_free(session->global.buffer, TRUE);
191 session->buffer.command = NULL;
192 session->global.buffer = NULL;
193 session->buffer.n = 0;
195 if (session->events.buffer_changed != NULL) {
196 session->events.buffer_changed(session);
206 GdkEventButton* button, girara_session_t* session)
208 g_return_val_if_fail(session != NULL,
false);
209 g_return_val_if_fail(button != NULL,
false);
212 girara_event_t event;
214 switch (button->type) {
215 case GDK_BUTTON_PRESS:
218 case GDK_2BUTTON_PRESS:
221 case GDK_3BUTTON_PRESS:
232 const guint state = button->state & MOUSE_MASK;
235 GIRARA_LIST_FOREACH(session->bindings.mouse_events, girara_mouse_event_t*, iter, mouse_event)
236 if (mouse_event->function != NULL
237 && button->button == mouse_event->button
238 && state == mouse_event->mask
239 && mouse_event->event_type == event.type
240 && (session->modes.current_mode == mouse_event->mode || mouse_event->mode == 0)
242 mouse_event->function(session, &(mouse_event->argument), &event, session->buffer.n);
254 g_return_val_if_fail(session != NULL,
false);
255 g_return_val_if_fail(button != NULL,
false);
258 girara_event_t event;
263 const guint state = button->state & MOUSE_MASK;
266 GIRARA_LIST_FOREACH(session->bindings.mouse_events, girara_mouse_event_t*, iter, mouse_event)
267 if (mouse_event->function != NULL
268 && button->button == mouse_event->button
269 && state == mouse_event->mask
271 && (session->modes.current_mode == mouse_event->mode || mouse_event->mode == 0)
273 mouse_event->function(session, &(mouse_event->argument), &event, session->buffer.n);
285 g_return_val_if_fail(session != NULL,
false);
286 g_return_val_if_fail(button != NULL,
false);
289 girara_event_t
event = {
295 const guint state = button->state & MOUSE_MASK;
298 GIRARA_LIST_FOREACH(session->bindings.mouse_events, girara_mouse_event_t*, iter, mouse_event)
299 if (mouse_event->function != NULL
300 && state == mouse_event->mask
301 && mouse_event->event_type == event.type
302 && (session->modes.current_mode == mouse_event->mode || mouse_event->mode == 0)
304 mouse_event->function(session, &(mouse_event->argument), &event, session->buffer.n);
316 g_return_val_if_fail(session != NULL,
false);
317 g_return_val_if_fail(scroll != NULL,
false);
320 girara_event_t event;
324 switch (scroll->direction) {
328 case GDK_SCROLL_DOWN:
331 case GDK_SCROLL_LEFT:
334 case GDK_SCROLL_RIGHT:
341 const guint state = scroll->state & MOUSE_MASK;
345 GIRARA_LIST_FOREACH(session->bindings.mouse_events, girara_mouse_event_t*, iter, mouse_event)
346 if (mouse_event->function != NULL
347 && state == mouse_event->mask
348 && mouse_event->event_type == event.type
349 && (session->modes.current_mode == mouse_event->mode || mouse_event->mode == 0)
351 mouse_event->function(session, &(mouse_event->argument), &event, session->buffer.n);
363 g_return_val_if_fail(session != NULL, FALSE);
366 if (session->signals.inputbar_custom_activate != NULL) {
367 bool return_value = session->signals.inputbar_custom_activate(entry, session->signals.inputbar_custom_data);
370 session->signals.inputbar_custom_activate = NULL;
371 session->signals.inputbar_custom_key_press_event = NULL;
372 session->signals.inputbar_custom_data = NULL;
374 if (session->gtk.inputbar_dialog != NULL && session->gtk.inputbar_entry != NULL) {
375 gtk_label_set_markup(session->gtk.inputbar_dialog,
"");
376 gtk_widget_hide(GTK_WIDGET(session->gtk.inputbar_dialog));
377 if (session->global.autohide_inputbar ==
true) {
378 gtk_widget_hide(GTK_WIDGET(session->gtk.inputbar));
380 gtk_entry_set_visibility(session->gtk.inputbar_entry, TRUE);
388 gchar *input = gtk_editable_get_chars(GTK_EDITABLE(entry), 1, -1);
394 if (strlen(input) == 0) {
401 const char* command = gtk_entry_get_text(entry);
408 if (g_shell_parse_argv(input, &argc, &argv, NULL) == FALSE) {
413 gchar *cmd = argv[0];
416 char *identifier_s = gtk_editable_get_chars(GTK_EDITABLE(entry), 0, 1);
417 if (identifier_s == NULL) {
423 char identifier = identifier_s[0];
424 g_free(identifier_s);
426 GIRARA_LIST_FOREACH(session->bindings.special_commands, girara_special_command_t*, iter, special_command)
427 if (special_command->identifier == identifier) {
428 if (special_command->always !=
true) {
429 special_command->function(session, input, &(special_command->argument));
444 if ((g_strcmp0(cmd, command->command) == 0) ||
445 (g_strcmp0(cmd, command->abbr) == 0))
448 if (argument_list == NULL) {
457 for(
int i = 1; i < argc; i++) {
458 char* argument = g_strdup(argv[i]);
462 command->function(session, argument_list);
470 if (session->global.autohide_inputbar ==
true) {
471 gtk_widget_hide(GTK_WIDGET(session->gtk.inputbar));
473 gtk_widget_hide(GTK_WIDGET(session->gtk.inputbar_dialog));
480 if (session->events.unknown_command != NULL) {
481 if (session->events.unknown_command(session, input) ==
true) {
486 if (session->global.autohide_inputbar ==
true) {
487 gtk_widget_hide(GTK_WIDGET(session->gtk.inputbar));
489 gtk_widget_hide(GTK_WIDGET(session->gtk.inputbar_dialog));
506 g_return_val_if_fail(session != NULL,
false);
509 bool custom_ret =
false;
510 if (session->signals.inputbar_custom_key_press_event != NULL) {
511 custom_ret = session->signals.inputbar_custom_key_press_event(entry, event, session->signals.inputbar_custom_data);
512 if (custom_ret ==
true) {
515 if (session->global.autohide_inputbar ==
true) {
516 gtk_widget_hide(GTK_WIDGET(session->gtk.inputbar));
518 gtk_widget_hide(GTK_WIDGET(session->gtk.inputbar_dialog));
525 if (clean_mask(event->hardware_keycode, event->state, event->group, &clean, &keyval) ==
false) {
529 if (custom_ret ==
false) {
530 GIRARA_LIST_FOREACH(session->bindings.inputbar_shortcuts, girara_inputbar_shortcut_t*, iter, inputbar_shortcut)
531 if (inputbar_shortcut->key == keyval
532 && inputbar_shortcut->mask == clean)
534 if (inputbar_shortcut->function != NULL) {
535 inputbar_shortcut->function(session, &(inputbar_shortcut->argument), NULL, 0);
541 GIRARA_LIST_FOREACH_END(session->bindings.inputbar_shortcuts, girara_inputbar_shortcut_t*, iter, inputbar_shortcut);
544 if ((session->gtk.results != NULL) &&
545 (gtk_widget_get_visible(GTK_WIDGET(session->gtk.results)) == TRUE) &&
546 (keyval == GDK_KEY_space))
548 gtk_widget_hide(GTK_WIDGET(session->gtk.results));
557 g_return_val_if_fail(session != NULL,
false);
560 char *identifier_s = gtk_editable_get_chars(entry, 0, 1);
561 if (identifier_s == NULL) {
565 char identifier = identifier_s[0];
566 g_free(identifier_s);
568 GIRARA_LIST_FOREACH(session->bindings.special_commands, girara_special_command_t*, iter, special_command)
569 if ((special_command->identifier == identifier) &&
570 (special_command->always ==
true))
572 gchar *input = gtk_editable_get_chars(GTK_EDITABLE(entry), 1, -1);
573 special_command->function(session, input, &(special_command->argument));
void girara_list_append(girara_list_t *list, void *data)
bool girara_callback_view_button_release_event(GtkWidget *UNUSED(widget), GdkEventButton *button, girara_session_t *session)
bool girara_callback_inputbar_changed_event(GtkEditable *entry, girara_session_t *session)
bool girara_callback_view_key_press_event(GtkWidget *UNUSED(widget), GdkEventKey *event, girara_session_t *session)
void girara_list_free(girara_list_t *list)
bool girara_callback_inputbar_key_press_event(GtkWidget *entry, GdkEventKey *event, girara_session_t *session)
void girara_list_set_free_function(girara_list_t *list, girara_free_function_t gfree)
girara_list_t * girara_list_new(void)
void girara_list_iterator_free(girara_list_iterator_t *iter)
bool girara_callback_view_button_motion_notify_event(GtkWidget *UNUSED(widget), GdkEventMotion *button, girara_session_t *session)
bool girara_isc_abort(girara_session_t *session, girara_argument_t *UNUSED(argument), girara_event_t *UNUSED(event), unsigned int UNUSED(t))
void girara_notify(girara_session_t *session, int level, const char *format,...)
bool girara_callback_inputbar_activate(GtkEntry *entry, girara_session_t *session)
bool girara_callback_view_scroll_event(GtkWidget *UNUSED(widget), GdkEventScroll *scroll, girara_session_t *session)
bool girara_callback_view_button_press_event(GtkWidget *UNUSED(widget), GdkEventButton *button, girara_session_t *session)
void girara_input_history_append(GiraraInputHistory *history, const char *input)
#define GIRARA_LIST_FOREACH_END(list, type, iter, data)
#define GIRARA_LIST_FOREACH(list, type, iter, data)