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) {
388 girara_toggle_widget_visibility(GtkWidget* widget)
390 if (widget == NULL) {
394 if (gtk_widget_get_visible(widget)) {
395 gtk_widget_hide(widget);
397 gtk_widget_show(widget);
404 g_return_val_if_fail(session != NULL,
false);
406 girara_toggle_widget_visibility(GTK_WIDGET(session->gtk.inputbar));
414 g_return_val_if_fail(session != NULL,
false);
416 girara_toggle_widget_visibility(GTK_WIDGET(session->gtk.statusbar));
424 g_return_val_if_fail(session != NULL,
false);
426 girara_toggle_widget_visibility(GTK_WIDGET(session->gtk.tabbar));
434 g_return_val_if_fail(session != NULL,
false);
436 if (argument == NULL || argument->data == NULL) {
442 if (argument_list == NULL) {
450 if (g_shell_parse_argv((
const gchar*) argument->data, &argc, &argv, NULL) != FALSE) {
451 for(
int i = 0; i < argc; i++) {
452 char* argument = g_strdup(argv[i]);
471 girara_event_t*
UNUSED(event),
unsigned int t)
473 if (session == NULL || argument == NULL) {
477 typedef struct gdk_keyboard_button_s {
480 } gdk_keyboard_button_t;
482 static const gdk_keyboard_button_t gdk_keyboard_buttons[] = {
483 {
"BackSpace", GDK_KEY_BackSpace},
484 {
"CapsLock", GDK_KEY_Caps_Lock},
485 {
"Down", GDK_KEY_Down},
486 {
"Esc", GDK_KEY_Escape},
487 {
"F10", GDK_KEY_F10},
488 {
"F11", GDK_KEY_F11},
489 {
"F12", GDK_KEY_F12},
499 {
"Left", GDK_KEY_Left},
500 {
"PageDown", GDK_KEY_Page_Down},
501 {
"PageUp", GDK_KEY_Page_Up},
502 {
"Home", GDK_KEY_Home},
503 {
"End", GDK_KEY_End},
504 {
"Return", GDK_KEY_Return},
505 {
"Right", GDK_KEY_Right},
506 {
"Space", GDK_KEY_space},
507 {
"Super", GDK_KEY_Super_L},
508 {
"Tab", GDK_KEY_Tab},
509 {
"ShiftTab", GDK_KEY_ISO_Left_Tab},
513 char* input = (
char*) argument->data;
514 unsigned int input_length = strlen(input);
516 t = (t == 0) ? 1 : t;
517 for (
unsigned int c = 0; c < t; c++) {
518 for (
unsigned i = 0; i < input_length; i++) {
520 int keyval = input[i];
523 if ((input_length - i) >= 3 && input[i] ==
'<') {
524 char* end = strchr(input + i,
'>');
529 int length = end - (input + i) - 1;
530 char* tmp = g_strndup(input + i + 1, length);
534 if (length > 2 && tmp[1] ==
'-') {
537 state = GDK_SHIFT_MASK;
540 state = GDK_MOD1_MASK;
543 state = GDK_CONTROL_MASK;
553 for (
unsigned int i = 0; i <
LENGTH(gdk_keyboard_buttons); i++) {
554 if (g_strcmp0(tmp + 2, gdk_keyboard_buttons[i].identifier) == 0) {
555 keyval = gdk_keyboard_buttons[i].keyval;
563 for (
unsigned int i = 0; i <
LENGTH(gdk_keyboard_buttons); i++) {
564 if (g_strcmp0(tmp, gdk_keyboard_buttons[i].identifier) == 0) {
565 keyval = gdk_keyboard_buttons[i].keyval;
583 simulate_key_press(session, state, keyval);
593 g_return_val_if_fail(session != NULL,
false);
595 if (
function == NULL || identifier == NULL) {
599 GIRARA_LIST_FOREACH(session->config.shortcut_mappings, girara_shortcut_mapping_t*, iter, data)
600 if (strcmp(data->identifier, identifier) == 0) {
601 data->function =
function;
608 girara_shortcut_mapping_t* mapping = g_slice_new(girara_shortcut_mapping_t);
610 mapping->identifier = g_strdup(identifier);
611 mapping->function =
function;
620 if (mapping == NULL) {
624 g_free(mapping->identifier);
625 g_slice_free(girara_shortcut_mapping_t, mapping);
631 g_return_val_if_fail(session != NULL,
false);
633 if (identifier == NULL) {
637 GIRARA_LIST_FOREACH(session->config.argument_mappings, girara_argument_mapping_t*, iter, mapping);
638 if (g_strcmp0(mapping->identifier, identifier) == 0) {
639 mapping->value = value;
646 girara_argument_mapping_t* mapping = g_slice_new(girara_argument_mapping_t);
648 mapping->identifier = g_strdup(identifier);
649 mapping->value = value;
658 if (argument_mapping == NULL) {
662 g_free(argument_mapping->identifier);
663 g_slice_free(girara_argument_mapping_t, argument_mapping);
669 event_type,
int argument_n,
void* argument_data)
671 g_return_val_if_fail(session != NULL,
false);
672 g_return_val_if_fail(
function != NULL,
false);
674 girara_argument_t argument = {argument_n, argument_data};
678 if (me_it->mask == mask && me_it->button == button &&
679 me_it->mode == mode && me_it->event_type == event_type)
681 me_it->function =
function;
682 me_it->argument = argument;
689 girara_mouse_event_t* mouse_event = g_slice_new(girara_mouse_event_t);
691 mouse_event->mask = mask;
692 mouse_event->button = button;
693 mouse_event->function =
function;
694 mouse_event->mode = mode;
695 mouse_event->event_type = event_type;
696 mouse_event->argument = argument;
705 g_return_val_if_fail(session != NULL,
false);
709 if (me_it->mask == mask && me_it->button == button &&
724 if (mouse_event == NULL) {
727 g_slice_free(girara_mouse_event_t, mouse_event);
731 simulate_key_press(girara_session_t* session,
int state,
int key)
733 if (session == NULL || session->gtk.box == NULL) {
737 GdkEvent*
event = gdk_event_new(GDK_KEY_PRESS);
739 event->key.type = GDK_KEY_PRESS;
740 event->key.window = gtk_widget_get_parent_window(GTK_WIDGET(session->gtk.box));
741 event->key.send_event =
false;
742 event->key.time = GDK_CURRENT_TIME;
743 event->key.state = state;
744 event->key.keyval = key;
746 g_object_ref(event->key.window);
751 if (gdk_keymap_get_entries_for_keyval(gdk_keymap_get_default(),
752 event->key.keyval, &keys, &number_of_keys) == FALSE) {
753 gdk_event_free(event);
757 event->key.hardware_keycode = keys[0].keycode;
758 event->key.group = keys[0].group;
762 gdk_event_put(event);
763 gdk_event_free(event);
765 gtk_main_iteration_do(FALSE);