4 #include <glib/gi18n-lib.h>
7 #include <libnotify/notify.h>
26 cb_sort_settings(girara_setting_t* lhs, girara_setting_t* rhs)
32 ensure_gettext_initialized(
void)
34 static gsize initialized = 0;
35 if (g_once_init_enter(&initialized) == TRUE) {
36 bindtextdomain(GETTEXT_PACKAGE, LOCALEDIR);
37 bind_textdomain_codeset(GETTEXT_PACKAGE,
"UTF-8");
38 g_once_init_leave(&initialized, 1);
43 init_template_engine(GiraraTemplate* csstemplate)
45 static const char* variable_names[] = {
56 "completion-group-fg",
57 "completion-group-bg",
58 "completion-highlight-fg",
59 "completion-highlight-bg",
60 "notification-error-fg",
61 "notification-error-bg",
62 "notification-warning-fg",
63 "notification-warning-bg",
76 for (
size_t idx = 0; idx <
LENGTH(variable_names); ++idx) {
82 fill_template_with_values(girara_session_t* session)
84 GiraraTemplate* csstemplate = session->private_data->csstemplate;
87 session->private_data->session_name);
93 pango_font_description_free(session->style.font);
94 session->style.font = pango_font_description_from_string(font);
99 if (session->style.font == NULL) {
102 char* fontname = pango_font_description_to_string(session->style.font);
109 typedef struct color_setting_mapping_s {
110 const char* identifier;
112 } color_setting_mapping_t;
115 const color_setting_mapping_t color_setting_mappings[] = {
116 {
"default-fg", &(session->style.default_foreground)},
117 {
"default-bg", &(session->style.default_background)},
118 {
"inputbar-fg", &(session->style.inputbar_foreground)},
119 {
"inputbar-bg", &(session->style.inputbar_background)},
120 {
"statusbar-fg", &(session->style.statusbar_foreground)},
121 {
"statusbar-bg", &(session->style.statusbar_background)},
122 {
"completion-fg", &(session->style.completion_foreground)},
123 {
"completion-bg", &(session->style.completion_background)},
124 {
"completion-group-fg", &(session->style.completion_group_foreground)},
125 {
"completion-group-bg", &(session->style.completion_group_background)},
126 {
"completion-highlight-fg", &(session->style.completion_highlight_foreground)},
127 {
"completion-highlight-bg", &(session->style.completion_highlight_background)},
128 {
"notification-error-fg", &(session->style.notification_error_foreground)},
129 {
"notification-error-bg", &(session->style.notification_error_background)},
130 {
"notification-warning-fg", &(session->style.notification_warning_foreground)},
131 {
"notification-warning-bg", &(session->style.notification_warning_background)},
132 {
"notification-fg", &(session->style.notification_default_foreground)},
133 {
"notification-bg", &(session->style.notification_default_background)},
134 {
"tabbar-fg", &(session->style.tabbar_foreground)},
135 {
"tabbar-bg", &(session->style.tabbar_background)},
136 {
"tabbar-focus-fg", &(session->style.tabbar_focus_foreground)},
137 {
"tabbar-focus-bg", &(session->style.tabbar_focus_background)},
141 for (
size_t i = 0; i <
LENGTH(color_setting_mappings); i++) {
142 char* tmp_value = NULL;
144 if (tmp_value != NULL) {
145 gdk_rgba_parse(color_setting_mappings[i].color, tmp_value);
149 char* color = gdk_rgba_to_string(color_setting_mappings[i].color);
151 color_setting_mappings[i].identifier, color);
165 typedef struct padding_mapping_s {
166 const char* identifier;
170 const padding_mapping_t padding_mapping[] = {
171 {
"bottombox-padding1", g_strdup_printf(
"%d", ypadding - ypadding/2)},
172 {
"bottombox-padding2", g_strdup_printf(
"%d", xpadding/2)},
173 {
"bottombox-padding3", g_strdup_printf(
"%d", ypadding/2)},
174 {
"bottombox-padding4", g_strdup_printf(
"%d", xpadding - xpadding/2)},
177 for (
size_t i = 0; i <
LENGTH(padding_mapping); ++i) {
179 padding_mapping[i].identifier, padding_mapping[i].value);
180 g_free(padding_mapping[i].value);
185 css_template_changed(GiraraTemplate* csstemplate, girara_session_t* session)
187 GtkCssProvider* old = session->private_data->gtk.cssprovider;
189 if (css_data == NULL) {
194 GtkCssProvider* provider = gtk_css_provider_new();
195 GError* error = NULL;
196 if (gtk_css_provider_load_from_data(provider, css_data, -1, &error) == FALSE) {
200 g_object_unref(provider);
206 GdkDisplay* display = gdk_display_get_default();
207 GdkScreen* screen = gdk_display_get_default_screen(display);
208 gtk_style_context_add_provider_for_screen(screen,
209 GTK_STYLE_PROVIDER(provider), GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
211 gtk_style_context_remove_provider_for_screen(screen, GTK_STYLE_PROVIDER(old));
214 gtk_widget_queue_draw(GTK_WIDGET(session->gtk.window));
216 session->private_data->gtk.cssprovider = provider;
222 ensure_gettext_initialized();
224 girara_session_t* session = g_slice_alloc0(
sizeof(girara_session_t));
225 session->private_data = g_slice_alloc0(
sizeof(girara_session_private_t));
249 session->private_data->gtk.cssprovider = NULL;
250 init_template_engine(session->private_data->csstemplate);
257 session->modes.normal = normal_mode;
258 session->modes.current_mode = normal_mode;
259 session->modes.inputbar = inputbar_mode;
276 session->gtk.box = GTK_BOX(gtk_box_new(GTK_ORIENTATION_VERTICAL, 0));
277 session->private_data->gtk.overlay = gtk_overlay_new();
278 session->private_data->gtk.bottom_box = GTK_BOX(gtk_box_new(GTK_ORIENTATION_VERTICAL, 0));
279 session->gtk.statusbar_entries = GTK_BOX(gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0));
280 session->gtk.tabbar = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
281 session->gtk.inputbar_box = GTK_BOX(gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0));
282 gtk_box_set_homogeneous(GTK_BOX(session->gtk.tabbar), TRUE);
283 gtk_box_set_homogeneous(session->gtk.inputbar_box, TRUE);
284 session->gtk.view = gtk_scrolled_window_new(NULL, NULL);
285 session->gtk.viewport = gtk_viewport_new(NULL, NULL);
286 #if GTK_MAJOR_VERSION == 3 && GTK_MINOR_VERSION >= 4
287 gtk_widget_add_events(session->gtk.viewport, GDK_SCROLL_MASK);
289 session->gtk.statusbar = gtk_event_box_new();
290 session->gtk.notification_area = gtk_event_box_new();
291 session->gtk.notification_text = gtk_label_new(NULL);
292 session->gtk.inputbar_dialog = GTK_LABEL(gtk_label_new(NULL));
294 session->gtk.inputbar = gtk_event_box_new();
295 session->gtk.tabs = GTK_NOTEBOOK(gtk_notebook_new());
299 session->settings = session->private_data->settings;
309 if (session == NULL) {
313 #if GTK_MAJOR_VERSION == 3 && GTK_MINOR_VERSION >= 4
314 bool smooth_scroll =
false;
317 gtk_widget_add_events(session->gtk.viewport, GDK_SMOOTH_SCROLL_MASK);
321 session->private_data->session_name = g_strdup(
322 (sessionname == NULL) ?
"girara" : sessionname);
325 fill_template_with_values(session);
326 g_signal_connect(G_OBJECT(session->private_data->csstemplate),
"changed",
327 G_CALLBACK(css_template_changed), session);
330 if (session->gtk.embed != 0) {
331 session->gtk.window = gtk_plug_new(session->gtk.embed);
333 session->gtk.window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
336 gtk_widget_set_name(GTK_WIDGET(session->gtk.window),
337 session->private_data->session_name);
340 css_template_changed(session->private_data->csstemplate, session);
342 GdkGeometry hints = {
355 gtk_window_set_geometry_hints(GTK_WINDOW(session->gtk.window), NULL, &hints, GDK_HINT_MIN_SIZE);
358 session->signals.view_key_pressed = g_signal_connect(G_OBJECT(session->gtk.view),
"key-press-event",
361 session->signals.view_button_press_event = g_signal_connect(G_OBJECT(session->gtk.view),
"button-press-event",
364 session->signals.view_button_release_event = g_signal_connect(G_OBJECT(session->gtk.view),
"button-release-event",
367 session->signals.view_motion_notify_event = g_signal_connect(G_OBJECT(session->gtk.view),
"motion-notify-event",
370 session->signals.view_scroll_event = g_signal_connect(G_OBJECT(session->gtk.view),
"scroll-event",
373 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(session->gtk.view), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
376 GtkWidget *vscrollbar = gtk_scrolled_window_get_vscrollbar(GTK_SCROLLED_WINDOW(session->gtk.view));
377 GtkWidget *hscrollbar = gtk_scrolled_window_get_hscrollbar(GTK_SCROLLED_WINDOW(session->gtk.view));
379 char* guioptions = NULL;
382 if (vscrollbar != NULL && strchr(guioptions,
'v') == NULL) {
383 gtk_widget_set_state_flags(vscrollbar, GTK_STATE_FLAG_INSENSITIVE,
false);
385 if (hscrollbar != NULL) {
386 if (strchr(guioptions,
'h') == NULL) {
387 gtk_widget_set_state_flags(hscrollbar, GTK_STATE_FLAG_INSENSITIVE,
false);
393 gtk_container_add(GTK_CONTAINER(session->gtk.view), session->gtk.viewport);
394 gtk_viewport_set_shadow_type(GTK_VIEWPORT(session->gtk.viewport), GTK_SHADOW_NONE);
397 gtk_container_add(GTK_CONTAINER(session->gtk.statusbar), GTK_WIDGET(session->gtk.statusbar_entries));
400 gtk_container_add(GTK_CONTAINER(session->gtk.notification_area), session->gtk.notification_text);
401 gtk_widget_set_halign(session->gtk.notification_text, GTK_ALIGN_START);
402 gtk_widget_set_valign(session->gtk.notification_text, GTK_ALIGN_CENTER);
403 gtk_label_set_use_markup(GTK_LABEL(session->gtk.notification_text), TRUE);
406 gtk_entry_set_has_frame(session->gtk.inputbar_entry, FALSE);
407 gtk_editable_set_editable(GTK_EDITABLE(session->gtk.inputbar_entry), TRUE);
412 session->signals.inputbar_key_pressed = g_signal_connect(
413 G_OBJECT(session->gtk.inputbar_entry),
419 session->signals.inputbar_changed = g_signal_connect(
420 G_OBJECT(session->gtk.inputbar_entry),
426 session->signals.inputbar_activate = g_signal_connect(
427 G_OBJECT(session->gtk.inputbar_entry),
433 gtk_box_set_homogeneous(session->gtk.inputbar_box, FALSE);
434 gtk_box_set_spacing(session->gtk.inputbar_box, 5);
437 gtk_box_pack_start(GTK_BOX(session->gtk.inputbar_box), GTK_WIDGET(session->gtk.inputbar_dialog), FALSE, FALSE, 0);
438 gtk_box_pack_start(GTK_BOX(session->gtk.inputbar_box), GTK_WIDGET(session->gtk.inputbar_entry), TRUE, TRUE, 0);
439 gtk_container_add(GTK_CONTAINER(session->gtk.inputbar), GTK_WIDGET(session->gtk.inputbar_box));
442 gtk_box_set_spacing(session->private_data->gtk.bottom_box, 0);
444 gtk_box_pack_end(GTK_BOX(session->private_data->gtk.bottom_box), GTK_WIDGET(session->gtk.inputbar), TRUE, TRUE, 0);
445 gtk_box_pack_end(GTK_BOX(session->private_data->gtk.bottom_box), GTK_WIDGET(session->gtk.notification_area), TRUE, TRUE, 0);
446 gtk_box_pack_end(GTK_BOX(session->private_data->gtk.bottom_box), GTK_WIDGET(session->gtk.statusbar), TRUE, TRUE, 0);
449 gtk_notebook_set_show_border(session->gtk.tabs, FALSE);
450 gtk_notebook_set_show_tabs(session->gtk.tabs, FALSE);
453 gtk_box_set_spacing(session->gtk.box, 0);
454 gtk_box_pack_start(session->gtk.box, GTK_WIDGET(session->gtk.tabbar), FALSE, FALSE, 0);
455 gtk_box_pack_start(session->gtk.box, GTK_WIDGET(session->gtk.view), TRUE, TRUE, 0);
458 gtk_container_add(GTK_CONTAINER(session->private_data->gtk.overlay), GTK_WIDGET(session->gtk.box));
460 g_object_set(session->private_data->gtk.bottom_box,
"halign", GTK_ALIGN_FILL, NULL);
461 g_object_set(session->private_data->gtk.bottom_box,
"valign", GTK_ALIGN_END, NULL);
463 gtk_overlay_add_overlay(GTK_OVERLAY(session->private_data->gtk.overlay), GTK_WIDGET(session->private_data->gtk.bottom_box));
464 gtk_container_add(GTK_CONTAINER(session->gtk.window), GTK_WIDGET(session->private_data->gtk.overlay));
478 gtk_style_context_save(gtk_widget_get_style_context(session->gtk.notification_area));
479 gtk_style_context_save(gtk_widget_get_style_context(session->gtk.notification_text));
482 int window_width = 0;
483 int window_height = 0;
487 if (window_width > 0 && window_height > 0) {
488 gtk_window_set_default_size(GTK_WINDOW(session->gtk.window), window_width, window_height);
491 gtk_widget_show_all(GTK_WIDGET(session->gtk.window));
492 gtk_widget_hide(GTK_WIDGET(session->gtk.notification_area));
493 gtk_widget_hide(GTK_WIDGET(session->gtk.inputbar_dialog));
495 if (session->global.autohide_inputbar ==
true) {
496 gtk_widget_hide(GTK_WIDGET(session->gtk.inputbar));
499 if (session->global.hide_statusbar ==
true) {
500 gtk_widget_hide(GTK_WIDGET(session->gtk.statusbar));
503 char* window_icon = NULL;
505 if (window_icon != NULL) {
506 if (strlen(window_icon) != 0) {
512 gtk_widget_grab_focus(GTK_WIDGET(session->gtk.view));
518 girara_session_private_free(girara_session_private_t* session)
520 g_return_if_fail(session != NULL);
522 if (session->session_name != NULL) {
523 g_free(session->session_name);
527 if (session->gtk.cssprovider != NULL) {
528 g_object_unref(session->gtk.cssprovider);
530 session->gtk.cssprovider = NULL;
531 if (session->csstemplate != NULL) {
532 g_object_unref(session->csstemplate);
534 session->csstemplate = NULL;
538 session->settings = NULL;
540 g_slice_free(girara_session_private_t, session);
546 g_return_val_if_fail(session != NULL, FALSE);
550 if (session->style.font != NULL) {
551 pango_font_description_free(session->style.font);
557 session->bindings.shortcuts = NULL;
561 session->bindings.inputbar_shortcuts = NULL;
565 session->bindings.commands = NULL;
569 session->bindings.special_commands = NULL;
573 session->bindings.mouse_events = NULL;
576 g_object_unref(session->command_history);
577 session->command_history = NULL;
581 session->elements.statusbar_items = NULL;
585 session->config.handles = NULL;
589 session->config.shortcut_mappings = NULL;
593 session->config.argument_mappings = NULL;
597 session->modes.identifiers = NULL;
600 if (session->buffer.command) {
601 g_string_free(session->buffer.command, TRUE);
604 if (session->global.buffer) {
605 g_string_free(session->global.buffer, TRUE);
608 session->buffer.command = NULL;
609 session->global.buffer = NULL;
612 girara_session_private_free(session->private_data);
613 session->private_data = NULL;
615 session->settings = NULL;
619 g_slice_free(girara_session_t, session);
627 g_return_val_if_fail(session != NULL, NULL);
629 return (session->global.buffer) ? g_strdup(session->global.buffer->str) : NULL;
642 #ifdef WITH_LIBNOTIFY
644 bool was_initialized = notify_is_initted();
646 if (!was_initialized) {
647 notify_init(session->private_data->session_name);
650 NotifyNotification* libnotify_notification = NULL;
651 char* icon_name = NULL;
658 icon_name = g_strdup(gtk_window_get_icon_name(GTK_WINDOW(session->gtk.window)));
659 if (icon_name != NULL) {
661 libnotify_notification = notify_notification_new(summary, body, icon_name);
665 GdkPixbuf* icon_pix = gtk_window_get_icon(GTK_WINDOW(session->gtk.window));
666 if (icon_pix != NULL) {
667 libnotify_notification = notify_notification_new(summary, body, NULL);
668 notify_notification_set_image_from_pixbuf(libnotify_notification, icon_pix);
669 g_object_unref(G_OBJECT(icon_pix));
672 libnotify_notification = notify_notification_new(summary, body,
"info");
676 g_return_if_fail(libnotify_notification != NULL);
677 notify_notification_show(libnotify_notification, NULL);
678 g_object_unref(G_OBJECT(libnotify_notification));
680 if (!was_initialized) {
692 girara_notify(girara_session_t* session,
int level,
const char* format, ...)
695 || session->gtk.notification_text == NULL
696 || session->gtk.notification_area == NULL
697 || session->gtk.inputbar == NULL
698 || session->gtk.view == NULL) {
702 GtkStyleContext* area_context = gtk_widget_get_style_context(session->gtk.notification_area);
703 GtkStyleContext* text_context = gtk_widget_get_style_context(session->gtk.notification_text);
705 gtk_style_context_restore(area_context);
706 gtk_style_context_restore(text_context);
707 gtk_style_context_save(area_context);
708 gtk_style_context_save(text_context);
710 const char* cssclass = NULL;
713 cssclass =
"notification-error";
716 cssclass =
"notification-warning";
724 if (cssclass != NULL) {
731 va_start(ap, format);
732 char* message = g_strdup_vprintf(format, ap);
735 gtk_label_set_markup(GTK_LABEL(session->gtk.notification_text), message);
739 gtk_widget_show(GTK_WIDGET(session->gtk.notification_area));
740 gtk_widget_hide(GTK_WIDGET(session->gtk.inputbar));
742 gtk_widget_grab_focus(GTK_WIDGET(session->gtk.view));
750 if (session == NULL || session->gtk.inputbar == NULL
751 || session->gtk.inputbar_dialog == NULL
752 || session->gtk.inputbar_entry == NULL) {
756 gtk_widget_show(GTK_WIDGET(session->gtk.inputbar_dialog));
759 if (dialog != NULL) {
760 gtk_label_set_markup(session->gtk.inputbar_dialog, dialog);
764 if (invisible ==
true) {
765 gtk_entry_set_visibility(session->gtk.inputbar_entry, FALSE);
767 gtk_entry_set_visibility(session->gtk.inputbar_entry, TRUE);
771 session->signals.inputbar_custom_activate = activate_event;
772 session->signals.inputbar_custom_key_press_event = key_press_event;
773 session->signals.inputbar_custom_data = data;
782 g_return_val_if_fail(session != NULL,
false);
784 GtkWidget* child = gtk_bin_get_child(GTK_BIN(session->gtk.viewport));
788 gtk_container_remove(GTK_CONTAINER(session->gtk.viewport), child);
791 gtk_container_add(GTK_CONTAINER(session->gtk.viewport), widget);
792 gtk_widget_show_all(widget);
793 gtk_widget_grab_focus(session->gtk.view);
801 g_return_if_fail(session != NULL);
803 session->modes.current_mode = mode;
809 g_return_val_if_fail(session != NULL, FALSE);
810 g_return_val_if_fail(name != NULL && name[0] !=
'\0', FALSE);
814 if (mode->index > last_index) {
815 last_index = mode->index;
820 girara_mode_string_t* mode = g_slice_new(girara_mode_string_t);
821 mode->index = last_index + 1;
822 mode->name = g_strdup(name);
836 g_slice_free(girara_mode_string_t, mode);
842 g_return_val_if_fail(session != NULL, 0);
844 return session->modes.current_mode;
850 if (session == NULL || session->gtk.window == NULL || name == NULL) {
854 gtk_window_set_title(GTK_WINDOW(session->gtk.window), name);
862 if (session == NULL || session->gtk.window == NULL || name == NULL) {
866 gtk_window_set_icon_name(GTK_WINDOW(session->gtk.window), name);
874 g_return_val_if_fail(session != NULL, NULL);
881 g_return_val_if_fail(session != NULL, NULL);
883 return session->private_data->csstemplate;
void girara_config_handle_free(girara_config_handle_t *handle)
void girara_special_command_free(girara_special_command_t *special_command)
HIDDEN void girara_setting_free(girara_setting_t *setting)
bool girara_session_init(girara_session_t *session, const char *sessionname)
bool girara_set_window_title(girara_session_t *session, const char *name)
void girara_list_append(girara_list_t *list, void *data)
HIDDEN void girara_argument_mapping_free(girara_argument_mapping_t *argument_mapping)
void(* girara_free_function_t)(void *data)
bool girara_session_destroy(girara_session_t *session)
bool girara_callback_view_button_release_event(GtkWidget *UNUSED(widget), GdkEventButton *button, girara_session_t *session)
girara_list_t * girara_list_new2(girara_free_function_t gfree)
bool girara_callback_inputbar_changed_event(GtkEditable *entry, girara_session_t *session)
bool girara_sc_focus_inputbar(girara_session_t *session, girara_argument_t *argument, girara_event_t *UNUSED(event), unsigned int UNUSED(t))
HIDDEN void girara_statusbar_item_free(girara_statusbar_item_t *statusbaritem)
bool girara_callback_view_key_press_event(GtkWidget *UNUSED(widget), GdkEventKey *event, girara_session_t *session)
void girara_list_free(girara_list_t *list)
void girara_dialog(girara_session_t *session, const char *dialog, bool invisible, girara_callback_inputbar_key_press_event_t key_press_event, girara_callback_inputbar_activate_t activate_event, void *data)
GiraraTemplate * girara_session_get_template(girara_session_t *session)
bool girara_callback_inputbar_key_press_event(GtkWidget *entry, GdkEventKey *event, girara_session_t *session)
girara_mode_t girara_mode_add(girara_session_t *session, const char *name)
HIDDEN void girara_inputbar_shortcut_free(girara_inputbar_shortcut_t *shortcut)
bool girara_set_window_icon(girara_session_t *session, const char *name)
int(* girara_compare_function_t)(const void *data1, const void *data2)
void girara_config_load_default(girara_session_t *session)
GiraraTemplate * girara_template_new(const char *base)
bool(* girara_callback_inputbar_key_press_event_t)(GtkWidget *widget, GdkEventKey *event, void *data)
bool girara_set_view(girara_session_t *session, GtkWidget *widget)
bool(* girara_callback_inputbar_activate_t)(GtkEntry *entry, void *data)
void girara_template_set_variable_value(GiraraTemplate *object, const char *name, const char *value)
void girara_libnotify(girara_session_t *session, const char *summary, const char *body)
HIDDEN void girara_mouse_event_free(girara_mouse_event_t *mouse_event)
HIDDEN void girara_shortcut_mapping_free(girara_shortcut_mapping_t *mapping)
char * girara_template_evaluate(GiraraTemplate *object)
HIDDEN void widget_add_class(GtkWidget *widget, const char *styleclass)
bool girara_setting_get(girara_session_t *session, const char *name, void *dest)
girara_list_t * girara_sorted_list_new2(girara_compare_function_t cmp, girara_free_function_t gfree)
girara_list_t * girara_input_history_list(GiraraInputHistory *history)
#define girara_error(...)
bool girara_callback_view_button_motion_notify_event(GtkWidget *UNUSED(widget), GdkEventMotion *button, girara_session_t *session)
void girara_mode_string_free(girara_mode_string_t *mode)
bool girara_template_add_variable(GiraraTemplate *object, const char *name)
void girara_notify(girara_session_t *session, int level, const char *format,...)
void girara_command_free(girara_command_t *command)
bool girara_callback_inputbar_activate(GtkEntry *entry, girara_session_t *session)
PangoFontDescription * font
bool girara_setting_set(girara_session_t *session, const char *name, void *value)
GiraraInputHistory * girara_input_history_new(GiraraInputHistoryIO *io)
const char * girara_setting_get_name(girara_setting_t *setting)
void girara_mode_set(girara_session_t *session, girara_mode_t mode)
bool girara_callback_view_scroll_event(GtkWidget *UNUSED(widget), GdkEventScroll *scroll, girara_session_t *session)
#define GIRARA_IGNORE_DEPRECATED
girara_session_t * girara_session_create()
bool girara_callback_view_button_press_event(GtkWidget *UNUSED(widget), GdkEventButton *button, girara_session_t *session)
GiraraEntry * girara_entry_new(void)
#define GIRARA_LIST_FOREACH_END(list, type, iter, data)
#define GIRARA_LIST_FOREACH(list, type, iter, data)
girara_list_t * girara_get_command_history(girara_session_t *session)
char * girara_buffer_get(girara_session_t *session)
girara_mode_t girara_mode_get(girara_session_t *session)
HIDDEN void girara_shortcut_free(girara_shortcut_t *shortcut)