14 static void girara_toggle_widget_visibility(GtkWidget* widget);
15 static bool simulate_key_press(girara_session_t* session,
int state,
int key);
20 g_return_val_if_fail(session != NULL,
false);
21 g_return_val_if_fail(buffer || key || modifier,
false);
22 g_return_val_if_fail(
function != NULL,
false);
24 girara_argument_t argument = {argument_n, (argument_data != NULL) ?
25 g_strdup(argument_data) : NULL};
28 bool found_existing_shortcut =
false;
30 if (((shortcuts_it->mask == modifier && shortcuts_it->key == key && (modifier != 0 || key != 0)) ||
31 (buffer && shortcuts_it->buffered_command && !strcmp(shortcuts_it->buffered_command, buffer)))
32 && ((shortcuts_it->mode == mode) || (mode == 0)))
34 if (shortcuts_it->argument.data != NULL) {
35 g_free(shortcuts_it->argument.data);
38 shortcuts_it->function =
function;
39 shortcuts_it->argument = argument;
40 found_existing_shortcut =
true;
49 if (found_existing_shortcut ==
true) {
54 girara_shortcut_t* shortcut = g_slice_new(girara_shortcut_t);
56 shortcut->mask = modifier;
58 shortcut->buffered_command = buffer;
59 shortcut->function =
function;
60 shortcut->mode = mode;
61 shortcut->argument = argument;
70 g_return_val_if_fail(session != NULL,
false);
71 g_return_val_if_fail(buffer || key || modifier,
false);
75 if (((shortcuts_it->mask == modifier && shortcuts_it->key == key && (modifier != 0 || key != 0)) ||
76 (buffer && shortcuts_it->buffered_command && !strcmp(shortcuts_it->buffered_command, buffer)))
77 && shortcuts_it->mode == mode)
91 g_return_if_fail(shortcut != NULL);
92 g_free(shortcut->argument.data);
93 g_slice_free(girara_shortcut_t, shortcut);
99 g_return_val_if_fail(session != NULL,
false);
100 g_return_val_if_fail(
function != NULL,
false);
102 girara_argument_t argument = {argument_n, argument_data};
105 GIRARA_LIST_FOREACH(session->bindings.inputbar_shortcuts, girara_inputbar_shortcut_t*, iter, inp_sh_it)
106 if (inp_sh_it->mask == modifier && inp_sh_it->key == key) {
107 inp_sh_it->function =
function;
108 inp_sh_it->argument = argument;
116 girara_inputbar_shortcut_t* inputbar_shortcut = g_slice_new(girara_inputbar_shortcut_t);
118 inputbar_shortcut->mask = modifier;
119 inputbar_shortcut->key = key;
120 inputbar_shortcut->function =
function;
121 inputbar_shortcut->argument = argument;
130 g_return_val_if_fail(session != NULL,
false);
133 GIRARA_LIST_FOREACH(session->bindings.inputbar_shortcuts, girara_inputbar_shortcut_t*, iter, inp_sh_it)
134 if (inp_sh_it->mask == modifier && inp_sh_it->key == key) {
147 g_slice_free(girara_inputbar_shortcut_t, inputbar_shortcut);
153 g_return_val_if_fail(session != NULL,
false);
160 gtk_editable_delete_text(GTK_EDITABLE(session->gtk.inputbar_entry), 0, -1);
163 gtk_widget_grab_focus(GTK_WIDGET(session->gtk.view));
166 gtk_widget_hide(GTK_WIDGET(session->gtk.inputbar_dialog));
167 if (session->global.autohide_inputbar ==
true) {
168 gtk_widget_hide(GTK_WIDGET(session->gtk.inputbar));
175 session->signals.inputbar_custom_activate = NULL;
176 session->signals.inputbar_custom_key_press_event = NULL;
177 gtk_entry_set_visibility(session->gtk.inputbar_entry, TRUE);
185 g_return_val_if_fail(session != NULL,
false);
187 gchar *separator = NULL;
189 gchar *input = gtk_editable_get_chars(GTK_EDITABLE(session->gtk.inputbar_entry), 0, -1);
190 int length = strlen(input);
191 int pos = gtk_editable_get_position(GTK_EDITABLE(session->gtk.inputbar_entry));
194 switch (argument->n) {
196 if (pos == 1 && (input[0] ==
':' || input[0] ==
'/')) {
206 for (; i >= 0 && input[i] ==
' '; i--);
209 while ((i == (pos - 1)) || ((i > 0) && !strchr(separator, input[i]))) {
213 gtk_editable_delete_text(GTK_EDITABLE(session->gtk.inputbar_entry), i + 1, pos);
214 gtk_editable_set_position(GTK_EDITABLE(session->gtk.inputbar_entry), i + 1);
217 if (length != 1 && pos == 1 && (input[0] ==
':' || input[0] ==
'/')) {
220 if (length == 1 && pos == 1) {
223 gtk_editable_delete_text(GTK_EDITABLE(session->gtk.inputbar_entry), pos - 1, pos);
226 gtk_editable_delete_text(GTK_EDITABLE(session->gtk.inputbar_entry), 1, pos);
229 gtk_editable_set_position(GTK_EDITABLE(session->gtk.inputbar_entry), pos + 1);
232 gtk_editable_set_position(GTK_EDITABLE(session->gtk.inputbar_entry), (pos == 1) ? 1 : pos - 1);
235 if (length != 1 && pos == 0 && (input[0] ==
':' || input[0] ==
'/')){
238 if(length == 1 && pos == 0) {
241 gtk_editable_delete_text(GTK_EDITABLE(session->gtk.inputbar_entry), pos, pos + 1);
244 gtk_editable_delete_text(GTK_EDITABLE(session->gtk.inputbar_entry), pos, length);
247 gtk_editable_set_position(GTK_EDITABLE(session->gtk.inputbar_entry), 1);
250 gtk_editable_set_position(GTK_EDITABLE(session->gtk.inputbar_entry), -1);
262 argument, girara_event_t*
UNUSED(event),
unsigned int UNUSED(t))
264 g_return_val_if_fail(session != NULL,
false);
266 char* temp = gtk_editable_get_chars(GTK_EDITABLE(session->gtk.inputbar_entry), 0, -1);
272 if (command != NULL) {
273 gtk_entry_set_text(session->gtk.inputbar_entry, command);
274 gtk_widget_grab_focus(GTK_WIDGET(session->gtk.inputbar_entry));
275 gtk_editable_set_position(GTK_EDITABLE(session->gtk.inputbar_entry), -1);
285 g_return_val_if_fail(session != NULL,
false);
286 g_return_val_if_fail(session->gtk.inputbar_entry != NULL,
false);
288 if (gtk_widget_get_visible(GTK_WIDGET(session->gtk.inputbar)) ==
false) {
289 gtk_widget_show(GTK_WIDGET(session->gtk.inputbar));
292 if (gtk_widget_get_visible(GTK_WIDGET(session->gtk.notification_area)) ==
true) {
293 gtk_widget_hide(GTK_WIDGET(session->gtk.notification_area));
296 gtk_widget_grab_focus(GTK_WIDGET(session->gtk.inputbar_entry));
298 if (argument != NULL && argument->data != NULL) {
299 gtk_entry_set_text(session->gtk.inputbar_entry, (
char*) argument->data);
302 gchar* x_clipboard_text = gtk_clipboard_wait_for_text(gtk_clipboard_get(GDK_SELECTION_PRIMARY));
304 gtk_editable_set_position(GTK_EDITABLE(session->gtk.inputbar_entry), -1);
306 if (x_clipboard_text != NULL) {
308 gtk_clipboard_set_text(gtk_clipboard_get(GDK_SELECTION_PRIMARY), x_clipboard_text, -1);
309 g_free(x_clipboard_text);
319 g_return_val_if_fail(session != NULL,
false);
323 gtk_widget_hide(GTK_WIDGET(session->gtk.notification_area));
325 if (session->global.autohide_inputbar ==
false) {
326 gtk_widget_show(GTK_WIDGET(session->gtk.inputbar));
335 g_return_val_if_fail(session != NULL,
false);
348 g_return_val_if_fail(session != NULL,
false);
362 g_return_val_if_fail(session != NULL,
false);
365 if (number_of_tabs == 0)
370 unsigned int new_tab = (current_tab + step) % number_of_tabs;
372 if (t != 0 && t <= number_of_tabs) {
389 girara_argument_t* argument,
390 girara_event_t* event,
unsigned int t)
398 girara_argument_t* argument,
399 girara_event_t* event,
unsigned int t)
406 girara_toggle_widget_visibility(GtkWidget* widget)
408 if (widget == NULL) {
412 if (gtk_widget_get_visible(widget)) {
413 gtk_widget_hide(widget);
415 gtk_widget_show(widget);
422 g_return_val_if_fail(session != NULL,
false);
424 girara_toggle_widget_visibility(GTK_WIDGET(session->gtk.inputbar));
432 g_return_val_if_fail(session != NULL,
false);
434 girara_toggle_widget_visibility(GTK_WIDGET(session->gtk.statusbar));
442 g_return_val_if_fail(session != NULL,
false);
444 girara_toggle_widget_visibility(GTK_WIDGET(session->gtk.tabbar));
452 g_return_val_if_fail(session != NULL,
false);
454 if (argument == NULL || argument->data == NULL) {
460 if (argument_list == NULL) {
468 if (g_shell_parse_argv((
const gchar*) argument->data, &argc, &argv, NULL) != FALSE) {
469 for(
int i = 0; i < argc; i++) {
470 char* argument = g_strdup(argv[i]);
489 girara_event_t*
UNUSED(event),
unsigned int t)
491 if (session == NULL || argument == NULL) {
495 typedef struct gdk_keyboard_button_s {
498 } gdk_keyboard_button_t;
500 static const gdk_keyboard_button_t gdk_keyboard_buttons[] = {
501 {
"BackSpace", GDK_KEY_BackSpace},
502 {
"CapsLock", GDK_KEY_Caps_Lock},
503 {
"Down", GDK_KEY_Down},
504 {
"Esc", GDK_KEY_Escape},
505 {
"F10", GDK_KEY_F10},
506 {
"F11", GDK_KEY_F11},
507 {
"F12", GDK_KEY_F12},
517 {
"Left", GDK_KEY_Left},
518 {
"PageDown", GDK_KEY_Page_Down},
519 {
"PageUp", GDK_KEY_Page_Up},
520 {
"Home", GDK_KEY_Home},
521 {
"End", GDK_KEY_End},
522 {
"Return", GDK_KEY_Return},
523 {
"Right", GDK_KEY_Right},
524 {
"Space", GDK_KEY_space},
525 {
"Super", GDK_KEY_Super_L},
526 {
"Tab", GDK_KEY_Tab},
527 {
"ShiftTab", GDK_KEY_ISO_Left_Tab},
531 char* input = (
char*) argument->data;
532 unsigned int input_length = strlen(input);
534 t = (t == 0) ? 1 : t;
535 for (
unsigned int c = 0; c < t; c++) {
536 for (
unsigned i = 0; i < input_length; i++) {
538 int keyval = input[i];
541 if ((input_length - i) >= 3 && input[i] ==
'<') {
542 char* end = strchr(input + i,
'>');
547 int length = end - (input + i) - 1;
548 char* tmp = g_strndup(input + i + 1, length);
552 if (length > 2 && tmp[1] ==
'-') {
555 state = GDK_SHIFT_MASK;
558 state = GDK_MOD1_MASK;
561 state = GDK_CONTROL_MASK;
571 for (
unsigned int i = 0; i <
LENGTH(gdk_keyboard_buttons); i++) {
572 if (g_strcmp0(tmp + 2, gdk_keyboard_buttons[i].identifier) == 0) {
573 keyval = gdk_keyboard_buttons[i].keyval;
581 for (
unsigned int i = 0; i <
LENGTH(gdk_keyboard_buttons); i++) {
582 if (g_strcmp0(tmp, gdk_keyboard_buttons[i].identifier) == 0) {
583 keyval = gdk_keyboard_buttons[i].keyval;
601 simulate_key_press(session, state, keyval);
611 g_return_val_if_fail(session != NULL,
false);
613 if (
function == NULL || identifier == NULL) {
617 GIRARA_LIST_FOREACH(session->config.shortcut_mappings, girara_shortcut_mapping_t*, iter, data)
618 if (strcmp(data->identifier, identifier) == 0) {
619 data->function =
function;
626 girara_shortcut_mapping_t* mapping = g_slice_new(girara_shortcut_mapping_t);
628 mapping->identifier = g_strdup(identifier);
629 mapping->function =
function;
638 if (mapping == NULL) {
642 g_free(mapping->identifier);
643 g_slice_free(girara_shortcut_mapping_t, mapping);
649 g_return_val_if_fail(session != NULL,
false);
651 if (identifier == NULL) {
655 GIRARA_LIST_FOREACH(session->config.argument_mappings, girara_argument_mapping_t*, iter, mapping);
656 if (g_strcmp0(mapping->identifier, identifier) == 0) {
657 mapping->value = value;
664 girara_argument_mapping_t* mapping = g_slice_new(girara_argument_mapping_t);
666 mapping->identifier = g_strdup(identifier);
667 mapping->value = value;
676 if (argument_mapping == NULL) {
680 g_free(argument_mapping->identifier);
681 g_slice_free(girara_argument_mapping_t, argument_mapping);
687 event_type,
int argument_n,
void* argument_data)
689 g_return_val_if_fail(session != NULL,
false);
690 g_return_val_if_fail(
function != NULL,
false);
692 girara_argument_t argument = {argument_n, argument_data};
696 if (me_it->mask == mask && me_it->button == button &&
697 me_it->mode == mode && me_it->event_type == event_type)
699 me_it->function =
function;
700 me_it->argument = argument;
707 girara_mouse_event_t* mouse_event = g_slice_new(girara_mouse_event_t);
709 mouse_event->mask = mask;
710 mouse_event->button = button;
711 mouse_event->function =
function;
712 mouse_event->mode = mode;
713 mouse_event->event_type = event_type;
714 mouse_event->argument = argument;
723 g_return_val_if_fail(session != NULL,
false);
727 if (me_it->mask == mask && me_it->button == button &&
742 if (mouse_event == NULL) {
745 g_slice_free(girara_mouse_event_t, mouse_event);
749 simulate_key_press(girara_session_t* session,
int state,
int key)
751 if (session == NULL || session->gtk.box == NULL) {
755 GdkEvent*
event = gdk_event_new(GDK_KEY_PRESS);
757 event->key.type = GDK_KEY_PRESS;
758 event->key.window = gtk_widget_get_parent_window(GTK_WIDGET(session->gtk.box));
759 event->key.send_event =
false;
760 event->key.time = GDK_CURRENT_TIME;
761 event->key.state = state;
762 event->key.keyval = key;
764 g_object_ref(event->key.window);
769 if (gdk_keymap_get_entries_for_keyval(gdk_keymap_get_default(),
770 event->key.keyval, &keys, &number_of_keys) == FALSE) {
771 gdk_event_free(event);
775 event->key.hardware_keycode = keys[0].keycode;
776 event->key.group = keys[0].group;
780 gdk_event_put(event);
781 gdk_event_free(event);
783 gtk_main_iteration_do(FALSE);