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 = g_strdup(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->buffered_command);
93 g_free(shortcut->argument.data);
94 g_slice_free(girara_shortcut_t, shortcut);
100 g_return_val_if_fail(session != NULL,
false);
101 g_return_val_if_fail(
function != NULL,
false);
103 girara_argument_t argument = {argument_n, argument_data};
106 GIRARA_LIST_FOREACH(session->bindings.inputbar_shortcuts, girara_inputbar_shortcut_t*, iter, inp_sh_it)
107 if (inp_sh_it->mask == modifier && inp_sh_it->key == key) {
108 inp_sh_it->function =
function;
109 inp_sh_it->argument = argument;
117 girara_inputbar_shortcut_t* inputbar_shortcut = g_slice_new(girara_inputbar_shortcut_t);
119 inputbar_shortcut->mask = modifier;
120 inputbar_shortcut->key = key;
121 inputbar_shortcut->function =
function;
122 inputbar_shortcut->argument = argument;
131 g_return_val_if_fail(session != NULL,
false);
134 GIRARA_LIST_FOREACH(session->bindings.inputbar_shortcuts, girara_inputbar_shortcut_t*, iter, inp_sh_it)
135 if (inp_sh_it->mask == modifier && inp_sh_it->key == key) {
148 g_slice_free(girara_inputbar_shortcut_t, inputbar_shortcut);
154 g_return_val_if_fail(session != NULL,
false);
161 gtk_editable_delete_text(GTK_EDITABLE(session->gtk.inputbar_entry), 0, -1);
164 gtk_widget_grab_focus(GTK_WIDGET(session->gtk.view));
167 gtk_widget_hide(GTK_WIDGET(session->gtk.inputbar_dialog));
168 if (session->global.autohide_inputbar ==
true) {
169 gtk_widget_hide(GTK_WIDGET(session->gtk.inputbar));
176 session->signals.inputbar_custom_activate = NULL;
177 session->signals.inputbar_custom_key_press_event = NULL;
178 gtk_entry_set_visibility(session->gtk.inputbar_entry, TRUE);
186 g_return_val_if_fail(session != NULL,
false);
188 gchar *separator = NULL;
190 gchar *input = gtk_editable_get_chars(GTK_EDITABLE(session->gtk.inputbar_entry), 0, -1);
191 int length = strlen(input);
192 int pos = gtk_editable_get_position(GTK_EDITABLE(session->gtk.inputbar_entry));
195 switch (argument->n) {
197 if (pos == 1 && (input[0] ==
':' || input[0] ==
'/')) {
207 for (; i >= 0 && input[i] ==
' '; i--);
210 while ((i == (pos - 1)) || ((i > 0) && !strchr(separator, input[i]))) {
214 gtk_editable_delete_text(GTK_EDITABLE(session->gtk.inputbar_entry), i + 1, pos);
215 gtk_editable_set_position(GTK_EDITABLE(session->gtk.inputbar_entry), i + 1);
218 if (length != 1 && pos == 1 && (input[0] ==
':' || input[0] ==
'/')) {
221 if (length == 1 && pos == 1) {
224 gtk_editable_delete_text(GTK_EDITABLE(session->gtk.inputbar_entry), pos - 1, pos);
227 gtk_editable_delete_text(GTK_EDITABLE(session->gtk.inputbar_entry), 1, pos);
230 gtk_editable_set_position(GTK_EDITABLE(session->gtk.inputbar_entry), pos + 1);
233 gtk_editable_set_position(GTK_EDITABLE(session->gtk.inputbar_entry), (pos == 1) ? 1 : pos - 1);
236 if (length != 1 && pos == 0 && (input[0] ==
':' || input[0] ==
'/')){
239 if(length == 1 && pos == 0) {
242 gtk_editable_delete_text(GTK_EDITABLE(session->gtk.inputbar_entry), pos, pos + 1);
245 gtk_editable_delete_text(GTK_EDITABLE(session->gtk.inputbar_entry), pos, length);
248 gtk_editable_set_position(GTK_EDITABLE(session->gtk.inputbar_entry), 1);
251 gtk_editable_set_position(GTK_EDITABLE(session->gtk.inputbar_entry), -1);
263 argument, girara_event_t*
UNUSED(event),
unsigned int UNUSED(t))
265 g_return_val_if_fail(session != NULL,
false);
267 char* temp = gtk_editable_get_chars(GTK_EDITABLE(session->gtk.inputbar_entry), 0, -1);
273 if (command != NULL) {
274 gtk_entry_set_text(session->gtk.inputbar_entry, command);
275 gtk_widget_grab_focus(GTK_WIDGET(session->gtk.inputbar_entry));
276 gtk_editable_set_position(GTK_EDITABLE(session->gtk.inputbar_entry), -1);
286 g_return_val_if_fail(session != NULL,
false);
287 g_return_val_if_fail(session->gtk.inputbar_entry != NULL,
false);
289 if (gtk_widget_get_visible(GTK_WIDGET(session->gtk.inputbar)) ==
false) {
290 gtk_widget_show(GTK_WIDGET(session->gtk.inputbar));
293 if (gtk_widget_get_visible(GTK_WIDGET(session->gtk.notification_area)) ==
true) {
294 gtk_widget_hide(GTK_WIDGET(session->gtk.notification_area));
297 gtk_widget_grab_focus(GTK_WIDGET(session->gtk.inputbar_entry));
299 if (argument != NULL && argument->data != NULL) {
300 gtk_entry_set_text(session->gtk.inputbar_entry, (
char*) argument->data);
303 gchar* x_clipboard_text = gtk_clipboard_wait_for_text(gtk_clipboard_get(GDK_SELECTION_PRIMARY));
305 gtk_editable_set_position(GTK_EDITABLE(session->gtk.inputbar_entry), -1);
307 if (x_clipboard_text != NULL) {
309 gtk_clipboard_set_text(gtk_clipboard_get(GDK_SELECTION_PRIMARY), x_clipboard_text, -1);
310 g_free(x_clipboard_text);
320 g_return_val_if_fail(session != NULL,
false);
324 gtk_widget_hide(GTK_WIDGET(session->gtk.notification_area));
326 if (session->global.autohide_inputbar ==
false) {
327 gtk_widget_show(GTK_WIDGET(session->gtk.inputbar));
336 g_return_val_if_fail(session != NULL,
false);
349 g_return_val_if_fail(session != NULL,
false);
363 g_return_val_if_fail(session != NULL,
false);
366 if (number_of_tabs == 0) {
372 unsigned int new_tab = (current_tab + step) % number_of_tabs;
374 if (t != 0 && t <= number_of_tabs) {
391 girara_argument_t* argument,
392 girara_event_t* event,
unsigned int t)
400 girara_argument_t* argument,
401 girara_event_t* event,
unsigned int t)
408 girara_toggle_widget_visibility(GtkWidget* widget)
410 if (widget == NULL) {
414 if (gtk_widget_get_visible(widget) == TRUE) {
415 gtk_widget_hide(widget);
417 gtk_widget_show(widget);
424 g_return_val_if_fail(session != NULL,
false);
426 girara_toggle_widget_visibility(GTK_WIDGET(session->gtk.inputbar));
434 g_return_val_if_fail(session != NULL,
false);
436 girara_toggle_widget_visibility(GTK_WIDGET(session->gtk.statusbar));
444 g_return_val_if_fail(session != NULL,
false);
446 girara_toggle_widget_visibility(GTK_WIDGET(session->gtk.tabbar));
454 g_return_val_if_fail(session != NULL,
false);
456 if (argument == NULL || argument->data == NULL) {
462 if (argument_list == NULL) {
470 if (g_shell_parse_argv((
const gchar*) argument->data, &argc, &argv, NULL) != FALSE) {
471 for(
int i = 0; i < argc; i++) {
472 char* argument = g_strdup(argv[i]);
491 girara_event_t*
UNUSED(event),
unsigned int t)
493 if (session == NULL || argument == NULL) {
497 typedef struct gdk_keyboard_button_s {
500 } gdk_keyboard_button_t;
502 static const gdk_keyboard_button_t gdk_keyboard_buttons[] = {
503 {
"BackSpace", GDK_KEY_BackSpace},
504 {
"CapsLock", GDK_KEY_Caps_Lock},
505 {
"Down", GDK_KEY_Down},
506 {
"Esc", GDK_KEY_Escape},
507 {
"F10", GDK_KEY_F10},
508 {
"F11", GDK_KEY_F11},
509 {
"F12", GDK_KEY_F12},
519 {
"Left", GDK_KEY_Left},
520 {
"PageDown", GDK_KEY_Page_Down},
521 {
"PageUp", GDK_KEY_Page_Up},
522 {
"Home", GDK_KEY_Home},
523 {
"End", GDK_KEY_End},
524 {
"Return", GDK_KEY_Return},
525 {
"Right", GDK_KEY_Right},
526 {
"Space", GDK_KEY_space},
527 {
"Super", GDK_KEY_Super_L},
528 {
"Tab", GDK_KEY_Tab},
529 {
"ShiftTab", GDK_KEY_ISO_Left_Tab},
533 char* input = (
char*) argument->data;
534 unsigned int input_length = strlen(input);
536 t = (t == 0) ? 1 : t;
537 for (
unsigned int c = 0; c < t; c++) {
538 for (
unsigned i = 0; i < input_length; i++) {
540 int keyval = input[i];
543 if ((input_length - i) >= 3 && input[i] ==
'<') {
544 char* end = strchr(input + i,
'>');
549 int length = end - (input + i) - 1;
550 char* tmp = g_strndup(input + i + 1, length);
554 if (length > 2 && tmp[1] ==
'-') {
557 state = GDK_SHIFT_MASK;
560 state = GDK_MOD1_MASK;
563 state = GDK_CONTROL_MASK;
573 for (
unsigned int i = 0; i <
LENGTH(gdk_keyboard_buttons); i++) {
574 if (g_strcmp0(tmp + 2, gdk_keyboard_buttons[i].identifier) == 0) {
575 keyval = gdk_keyboard_buttons[i].keyval;
583 for (
unsigned int i = 0; i <
LENGTH(gdk_keyboard_buttons); i++) {
584 if (g_strcmp0(tmp, gdk_keyboard_buttons[i].identifier) == 0) {
585 keyval = gdk_keyboard_buttons[i].keyval;
603 simulate_key_press(session, state, keyval);
613 g_return_val_if_fail(session != NULL,
false);
615 if (
function == NULL || identifier == NULL) {
619 GIRARA_LIST_FOREACH(session->config.shortcut_mappings, girara_shortcut_mapping_t*, iter, data)
620 if (strcmp(data->identifier, identifier) == 0) {
621 data->function =
function;
628 girara_shortcut_mapping_t* mapping = g_slice_new(girara_shortcut_mapping_t);
630 mapping->identifier = g_strdup(identifier);
631 mapping->function =
function;
640 if (mapping == NULL) {
644 g_free(mapping->identifier);
645 g_slice_free(girara_shortcut_mapping_t, mapping);
651 g_return_val_if_fail(session != NULL,
false);
653 if (identifier == NULL) {
657 GIRARA_LIST_FOREACH(session->config.argument_mappings, girara_argument_mapping_t*, iter, mapping);
658 if (g_strcmp0(mapping->identifier, identifier) == 0) {
659 mapping->value = value;
666 girara_argument_mapping_t* mapping = g_slice_new(girara_argument_mapping_t);
668 mapping->identifier = g_strdup(identifier);
669 mapping->value = value;
678 if (argument_mapping == NULL) {
682 g_free(argument_mapping->identifier);
683 g_slice_free(girara_argument_mapping_t, argument_mapping);
689 event_type,
int argument_n,
void* argument_data)
691 g_return_val_if_fail(session != NULL,
false);
692 g_return_val_if_fail(
function != NULL,
false);
694 girara_argument_t argument = {argument_n, argument_data};
698 if (me_it->mask == mask && me_it->button == button &&
699 me_it->mode == mode && me_it->event_type == event_type)
701 me_it->function =
function;
702 me_it->argument = argument;
709 girara_mouse_event_t* mouse_event = g_slice_new(girara_mouse_event_t);
711 mouse_event->mask = mask;
712 mouse_event->button = button;
713 mouse_event->function =
function;
714 mouse_event->mode = mode;
715 mouse_event->event_type = event_type;
716 mouse_event->argument = argument;
725 g_return_val_if_fail(session != NULL,
false);
729 if (me_it->mask == mask && me_it->button == button &&
744 if (mouse_event == NULL) {
747 g_slice_free(girara_mouse_event_t, mouse_event);
751 simulate_key_press(girara_session_t* session,
int state,
int key)
753 if (session == NULL || session->gtk.box == NULL) {
757 GdkEvent*
event = gdk_event_new(GDK_KEY_PRESS);
759 event->key.type = GDK_KEY_PRESS;
760 event->key.window = gtk_widget_get_parent_window(GTK_WIDGET(session->gtk.box));
761 event->key.send_event =
false;
762 event->key.time = GDK_CURRENT_TIME;
763 event->key.state = state;
764 event->key.keyval = key;
766 g_object_ref(event->key.window);
771 if (gdk_keymap_get_entries_for_keyval(gdk_keymap_get_default(),
772 event->key.keyval, &keys, &number_of_keys) == FALSE) {
773 gdk_event_free(event);
777 event->key.hardware_keycode = keys[0].keycode;
778 event->key.group = keys[0].group;
782 gdk_event_put(event);
783 gdk_event_free(event);
785 gtk_main_iteration_do(FALSE);
void girara_list_remove(girara_list_t *list, void *data)
bool girara_shortcut_add(girara_session_t *session, guint modifier, guint key, const char *buffer, girara_shortcut_function_t function, girara_mode_t mode, int argument_n, void *argument_data)
bool girara_sc_abort(girara_session_t *session, girara_argument_t *UNUSED(argument), girara_event_t *UNUSED(event), unsigned int UNUSED(t))
void girara_mouse_event_free(girara_mouse_event_t *mouse_event)
bool girara_inputbar_shortcut_remove(girara_session_t *session, guint modifier, guint key)
void girara_inputbar_shortcut_free(girara_inputbar_shortcut_t *inputbar_shortcut)
void girara_list_append(girara_list_t *list, void *data)
void girara_tab_update(girara_session_t *session)
bool girara_sc_tab_navigate_prev(girara_session_t *session, girara_argument_t *argument, girara_event_t *event, unsigned int t)
bool girara_sc_toggle_inputbar(girara_session_t *session, girara_argument_t *UNUSED(argument), girara_event_t *UNUSED(event), unsigned int UNUSED(t))
bool girara_argument_mapping_add(girara_session_t *session, const char *identifier, int value)
bool girara_sc_tab_navigate(girara_session_t *session, girara_argument_t *argument, girara_event_t *UNUSED(event), unsigned int t)
void girara_tab_remove(girara_session_t *session, girara_tab_t *tab)
bool girara_sc_focus_inputbar(girara_session_t *session, girara_argument_t *argument, girara_event_t *UNUSED(event), unsigned int UNUSED(t))
void girara_list_free(girara_list_t *list)
void girara_list_set_free_function(girara_list_t *list, girara_free_function_t gfree)
void girara_tab_current_set(girara_session_t *session, girara_tab_t *tab)
bool girara_cmd_set(girara_session_t *session, girara_list_t *argument_list)
bool girara_isc_completion(girara_session_t *session, girara_argument_t *argument, girara_event_t *UNUSED(event), unsigned int UNUSED(t))
girara_tab_t * girara_tab_current_get(girara_session_t *session)
bool girara_mouse_event_add(girara_session_t *session, guint mask, guint button, girara_shortcut_function_t function, girara_mode_t mode, girara_event_type_t event_type, int argument_n, void *argument_data)
void girara_input_history_reset(GiraraInputHistory *history)
const char * girara_input_history_previous(GiraraInputHistory *history, const char *current_input)
int girara_tab_position_get(girara_session_t *session, girara_tab_t *tab)
bool girara_sc_feedkeys(girara_session_t *session, girara_argument_t *argument, girara_event_t *UNUSED(event), unsigned int t)
bool girara_shortcut_mapping_add(girara_session_t *session, const char *identifier, girara_shortcut_function_t function)
bool(* girara_shortcut_function_t)(girara_session_t *, girara_argument_t *, girara_event_t *, unsigned int)
girara_list_t * girara_list_new(void)
bool girara_sc_set(girara_session_t *session, girara_argument_t *argument, girara_event_t *UNUSED(event), unsigned int UNUSED(t))
void girara_list_iterator_free(girara_list_iterator_t *iter)
bool girara_isc_command_history(girara_session_t *session, girara_argument_t *argument, girara_event_t *UNUSED(event), unsigned int UNUSED(t))
int girara_get_number_of_tabs(girara_session_t *session)
bool girara_setting_get(girara_session_t *session, const char *name, void *dest)
girara_tab_t * girara_tab_get(girara_session_t *session, unsigned int index)
bool girara_sc_tab_close(girara_session_t *session, girara_argument_t *UNUSED(argument), girara_event_t *UNUSED(event), unsigned int UNUSED(t))
void girara_shortcut_free(girara_shortcut_t *shortcut)
bool girara_mouse_event_remove(girara_session_t *session, guint mask, guint button, girara_mode_t mode)
const char * girara_input_history_next(GiraraInputHistory *history, const char *current_input)
HIDDEN void update_state_by_keyval(int *state, int keyval)
bool girara_isc_abort(girara_session_t *session, girara_argument_t *UNUSED(argument), girara_event_t *UNUSED(event), unsigned int UNUSED(t))
bool girara_sc_toggle_statusbar(girara_session_t *session, girara_argument_t *UNUSED(argument), girara_event_t *UNUSED(event), unsigned int UNUSED(t))
bool girara_sc_tab_navigate_next(girara_session_t *session, girara_argument_t *argument, girara_event_t *event, unsigned int t)
void girara_argument_mapping_free(girara_argument_mapping_t *argument_mapping)
bool girara_sc_toggle_tabbar(girara_session_t *session, girara_argument_t *UNUSED(argument), girara_event_t *UNUSED(event), unsigned int UNUSED(t))
void girara_shortcut_mapping_free(girara_shortcut_mapping_t *mapping)
bool girara_inputbar_shortcut_add(girara_session_t *session, guint modifier, guint key, girara_shortcut_function_t function, int argument_n, void *argument_data)
bool girara_shortcut_remove(girara_session_t *session, guint modifier, guint key, const char *buffer, girara_mode_t mode)
bool girara_sc_quit(girara_session_t *session, girara_argument_t *UNUSED(argument), girara_event_t *UNUSED(event), unsigned int UNUSED(t))
#define GIRARA_LIST_FOREACH_END(list, type, iter, data)
#define GIRARA_LIST_FOREACH(list, type, iter, data)
bool girara_isc_string_manipulation(girara_session_t *session, girara_argument_t *argument, girara_event_t *UNUSED(event), unsigned int UNUSED(t))