9 #include <glib/gi18n-lib.h>
12 #if GTK_MAJOR_VERSION == 2
16 static const guint ALL_ACCELS_MASK = GDK_CONTROL_MASK | GDK_SHIFT_MASK | GDK_MOD1_MASK;
17 static const guint MOUSE_MASK = GDK_CONTROL_MASK | GDK_SHIFT_MASK | GDK_MOD1_MASK |
18 GDK_BUTTON1_MASK | GDK_BUTTON2_MASK | GDK_BUTTON3_MASK | GDK_BUTTON4_MASK | GDK_BUTTON5_MASK;
21 clean_mask(guint hardware_keycode, GdkModifierType
state, gint
group, guint* clean, guint* keyval)
23 GdkModifierType consumed = 0;
24 if ((gdk_keymap_translate_keyboard_state(
25 gdk_keymap_get_default(),
37 *clean = state & ~consumed & ALL_ACCELS_MASK;
87 if (clean_mask(event->hardware_keycode, event->state, event->group, &clean, &keyval) ==
false) {
93 if (session->buffer.command != NULL) {
97 if ( keyval == shortcut->key
98 && (clean == shortcut->mask || (shortcut->key >= 0x21
99 && shortcut->key <= 0x7E && clean == GDK_SHIFT_MASK))
100 && (session->modes.current_mode == shortcut->mode || shortcut->mode == 0)
101 && shortcut->function != NULL
104 int t = (session->buffer.n > 0) ? session->buffer.n : 1;
105 for (
int i = 0; i < t; i++) {
106 if (shortcut->function(session, &(shortcut->argument), NULL, session->buffer.n) ==
false) {
111 if (session->global.buffer != NULL) {
112 g_string_free(session->global.buffer, TRUE);
113 session->global.buffer = NULL;
116 session->buffer.n = 0;
118 if (session->events.buffer_changed != NULL) {
119 session->events.buffer_changed(session);
128 if (keyval >= 0x21 && keyval <= 0x7E) {
130 if (session->global.buffer == NULL) {
131 session->global.buffer = g_string_new(
"");
134 session->global.buffer = g_string_append_c(session->global.buffer, keyval);
136 if (session->buffer.command == NULL && keyval >= 0x30 && keyval <= 0x39) {
137 if (((session->buffer.n * 10) + (keyval -
'0')) < INT_MAX) {
138 session->buffer.n = (session->buffer.n * 10) + (keyval -
'0');
141 if (session->buffer.command == NULL) {
142 session->buffer.command = g_string_new(
"");
145 session->buffer.command = g_string_append_c(session->buffer.command, keyval);
148 if (session->events.buffer_changed != NULL) {
149 session->events.buffer_changed(session);
154 if (session->buffer.command != NULL) {
155 bool matching_command = FALSE;
158 if (shortcut->buffered_command != NULL) {
160 if (!strncmp(session->buffer.command->str, shortcut->buffered_command, session->buffer.command->len)) {
162 if (!strcmp(session->buffer.command->str, shortcut->buffered_command)
163 && (session->modes.current_mode == shortcut->mode || shortcut->mode == 0)) {
164 g_string_free(session->buffer.command, TRUE);
165 g_string_free(session->global.buffer, TRUE);
166 session->buffer.command = NULL;
167 session->global.buffer = NULL;
169 if (session->events.buffer_changed != NULL) {
170 session->events.buffer_changed(session);
173 int t = (session->buffer.n > 0) ? session->buffer.n : 1;
174 for (
int i = 0; i < t; i++) {
175 if (shortcut->function(session, &(shortcut->argument), NULL, session->buffer.n) ==
false) {
180 session->buffer.n = 0;
185 matching_command = TRUE;
191 if (matching_command ==
false) {
192 g_string_free(session->buffer.command, TRUE);
193 g_string_free(session->global.buffer, TRUE);
194 session->buffer.command = NULL;
195 session->global.buffer = NULL;
196 session->buffer.n = 0;
198 if (session->events.buffer_changed != NULL) {
199 session->events.buffer_changed(session);
209 GdkEventButton* button, girara_session_t*
session)
215 girara_event_t
event;
217 switch (button->type) {
218 case GDK_BUTTON_PRESS:
221 case GDK_2BUTTON_PRESS:
224 case GDK_3BUTTON_PRESS:
235 const guint state = button->state & MOUSE_MASK;
238 GIRARA_LIST_FOREACH(session->bindings.mouse_events, girara_mouse_event_t*, iter, mouse_event)
239 if (mouse_event->function != NULL
240 && button->button == mouse_event->button
241 && state == mouse_event->mask
242 && mouse_event->event_type == event.type
243 && (session->modes.current_mode == mouse_event->mode || mouse_event->mode == 0)
245 mouse_event->function(session, &(mouse_event->argument), &event, session->buffer.n);
266 const guint state = button->state & MOUSE_MASK;
269 GIRARA_LIST_FOREACH(session->bindings.mouse_events, girara_mouse_event_t*, iter, mouse_event)
270 if (mouse_event->function != NULL
271 && button->button == mouse_event->button
272 && state == mouse_event->mask
274 && (session->modes.current_mode == mouse_event->mode || mouse_event->mode == 0)
276 mouse_event->function(session, &(mouse_event->argument), &event, session->buffer.n);
292 girara_event_t
event;
297 const guint state = button->state & MOUSE_MASK;
300 GIRARA_LIST_FOREACH(session->bindings.mouse_events, girara_mouse_event_t*, iter, mouse_event)
301 if (mouse_event->function != NULL
302 && state == mouse_event->mask
303 && mouse_event->event_type == event.type
304 && (session->modes.current_mode == mouse_event->mode || mouse_event->mode == 0)
306 mouse_event->function(session, &(mouse_event->argument), &event, session->buffer.n);
322 girara_event_t
event;
326 switch (scroll->direction) {
330 case GDK_SCROLL_DOWN:
333 case GDK_SCROLL_LEFT:
336 case GDK_SCROLL_RIGHT:
343 const guint state = scroll->state & MOUSE_MASK;
347 GIRARA_LIST_FOREACH(session->bindings.mouse_events, girara_mouse_event_t*, iter, mouse_event)
348 if (mouse_event->function != NULL
349 && state == mouse_event->mask
350 && mouse_event->event_type == event.
type
351 && (session->modes.current_mode == mouse_event->mode || mouse_event->mode == 0)
353 mouse_event->function(session, &(mouse_event->argument), &event, session->buffer.n);
368 if (session->signals.inputbar_custom_activate != NULL) {
369 bool return_value = session->signals.inputbar_custom_activate(entry, session->signals.inputbar_custom_data);
372 session->signals.inputbar_custom_activate = NULL;
373 session->signals.inputbar_custom_key_press_event = NULL;
374 session->signals.inputbar_custom_data = NULL;
376 if (session->gtk.inputbar_dialog != NULL && session->gtk.inputbar_entry != NULL) {
377 gtk_label_set_markup(session->gtk.inputbar_dialog,
"");
378 gtk_widget_hide(GTK_WIDGET(session->gtk.inputbar_dialog));
379 if (session->global.autohide_inputbar ==
true) {
380 gtk_widget_hide(GTK_WIDGET(session->gtk.inputbar));
382 gtk_entry_set_visibility(session->gtk.inputbar_entry, TRUE);
390 gchar *input = gtk_editable_get_chars(GTK_EDITABLE(entry), 1, -1);
396 if (strlen(input) == 0) {
403 const char* command = gtk_entry_get_text(entry);
410 if (g_shell_parse_argv(input, &argc, &argv, NULL) == FALSE) {
415 gchar *cmd = argv[0];
418 char *identifier_s = gtk_editable_get_chars(GTK_EDITABLE(entry), 0, 1);
419 if (identifier_s == NULL) {
425 char identifier = identifier_s[0];
426 g_free(identifier_s);
428 GIRARA_LIST_FOREACH(session->bindings.special_commands, girara_special_command_t*, iter, special_command)
429 if (special_command->identifier == identifier) {
430 if (special_command->always !=
true) {
431 special_command->function(session, input, &(special_command->argument));
446 if ((g_strcmp0(cmd, command->command) == 0) ||
447 (g_strcmp0(cmd, command->abbr) == 0))
450 if (argument_list == NULL) {
459 for(
int i = 1; i < argc; i++) {
460 char* argument = g_strdup(argv[i]);
464 command->function(session, argument_list);
472 if (session->global.autohide_inputbar ==
true) {
473 gtk_widget_hide(GTK_WIDGET(session->gtk.inputbar));
475 gtk_widget_hide(GTK_WIDGET(session->gtk.inputbar_dialog));
482 if (session->events.unknown_command != NULL) {
483 if (session->events.unknown_command(session, input) ==
true) {
488 if (session->global.autohide_inputbar ==
true) {
489 gtk_widget_hide(GTK_WIDGET(session->gtk.inputbar));
491 gtk_widget_hide(GTK_WIDGET(session->gtk.inputbar_dialog));
511 bool custom_ret =
false;
512 if (session->signals.inputbar_custom_key_press_event != NULL) {
513 custom_ret = session->signals.inputbar_custom_key_press_event(entry, event, session->signals.inputbar_custom_data);
514 if (custom_ret ==
true) {
517 if (session->global.autohide_inputbar ==
true) {
518 gtk_widget_hide(GTK_WIDGET(session->gtk.inputbar));
520 gtk_widget_hide(GTK_WIDGET(session->gtk.inputbar_dialog));
527 if (clean_mask(event->hardware_keycode, event->state, event->group, &clean, &keyval) ==
false) {
531 if (custom_ret ==
false) {
532 GIRARA_LIST_FOREACH(session->bindings.inputbar_shortcuts, girara_inputbar_shortcut_t*, iter, inputbar_shortcut)
533 if (inputbar_shortcut->key == keyval
534 && inputbar_shortcut->mask == clean)
536 if (inputbar_shortcut->function != NULL) {
537 inputbar_shortcut->function(session, &(inputbar_shortcut->argument), NULL, 0);
543 GIRARA_LIST_FOREACH_END(session->bindings.inputbar_shortcuts, girara_inputbar_shortcut_t*, iter, inputbar_shortcut);
546 if ((session->gtk.results != NULL) &&
547 (gtk_widget_get_visible(GTK_WIDGET(session->gtk.results)) == TRUE) &&
548 (keyval == GDK_KEY_space))
550 gtk_widget_hide(GTK_WIDGET(session->gtk.results));
562 char *identifier_s = gtk_editable_get_chars(entry, 0, 1);
563 if (identifier_s == NULL) {
567 char identifier = identifier_s[0];
568 g_free(identifier_s);
570 GIRARA_LIST_FOREACH(session->bindings.special_commands, girara_special_command_t*, iter, special_command)
571 if ((special_command->identifier == identifier) &&
572 (special_command->always ==
true))
574 gchar *input = gtk_editable_get_chars(GTK_EDITABLE(entry), 1, -1);
575 special_command->function(session, input, &(special_command->argument));
bool girara_callback_view_button_motion_notify_event(GtkWidget *widget, GdkEventMotion *button, girara_session_t *session)
void girara_list_append(girara_list_t *list, void *data)
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_scroll_event(GtkWidget *widget, GdkEventScroll *event, girara_session_t *session)
GIRARA_LIST_FOREACH_END(session->bindings.mouse_events, girara_mouse_event_t *, iter, mouse_event)
if(mouse_event->function!=NULL &&button->button==mouse_event->button &&state==mouse_event->mask &&mouse_event->event_type==GIRARA_EVENT_BUTTON_RELEASE &&(session->modes.current_mode==mouse_event->mode||mouse_event->mode==0))
g_return_val_if_fail(button!=NULL, false)
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_button_release_event(GtkWidget *widget, GdkEventButton *button, 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(list, type, iter, data)