4 #include <glib/gi18n-lib.h>
16 #if GTK_MAJOR_VERSION == 2
23 g_return_if_fail(session != NULL && value != NULL);
25 if (session->gtk.window != NULL) {
27 gtk_window_set_icon_from_file(GTK_WINDOW(session->gtk.window), (
const char*) value, &error);
29 girara_error(
"failed to load window icon: %s", error->message);
38 g_return_if_fail(session != NULL && value != NULL);
40 pango_font_description_free(session->style.font);
43 PangoFontDescription* font = pango_font_description_from_string(value);
44 session->style.font = font;
47 if (session->gtk.inputbar_entry != NULL) {
48 gtk_widget_override_font(GTK_WIDGET(session->gtk.inputbar_entry), font);
51 if (session->gtk.inputbar_dialog != NULL) {
52 gtk_widget_override_font(GTK_WIDGET(session->gtk.inputbar_dialog), font);
56 if (session->gtk.notification_text != NULL) {
57 gtk_widget_override_font(GTK_WIDGET(session->gtk.notification_text), font);
62 cb_sort_settings(girara_setting_t* lhs, girara_setting_t* rhs)
70 bindtextdomain(GETTEXT_PACKAGE, LOCALEDIR);
71 bind_textdomain_codeset(GETTEXT_PACKAGE,
"UTF-8");
73 girara_session_t* session = g_slice_alloc0(
sizeof(girara_session_t));
95 session->modes.normal = normal_mode;
96 session->modes.current_mode = normal_mode;
105 session->style.font = NULL;
108 int window_width = 800;
109 int window_height = 600;
110 int n_completion_items = 15;
111 bool show_scrollbars =
false;
121 girara_setting_add(session,
"completion-fg",
"#DDDDDD",
STRING, TRUE, _(
"Completion foreground color"), NULL, NULL);
122 girara_setting_add(session,
"completion-bg",
"#232323",
STRING, TRUE, _(
"Completion background color"), NULL, NULL);
123 girara_setting_add(session,
"completion-group-fg",
"#DEDEDE",
STRING, TRUE, _(
"Completion group foreground color"), NULL, NULL);
124 girara_setting_add(session,
"completion-group-bg",
"#000000",
STRING, TRUE, _(
"Completion group background color"), NULL, NULL);
125 girara_setting_add(session,
"completion-highlight-fg",
"#232323",
STRING, TRUE, _(
"Completion highlight foreground color"), NULL, NULL);
126 girara_setting_add(session,
"completion-highlight-bg",
"#9FBC00",
STRING, TRUE, _(
"Completion highlight background color"), NULL, NULL);
127 girara_setting_add(session,
"notification-error-fg",
"#FFFFFF",
STRING, TRUE, _(
"Error notification foreground color"), NULL, NULL);
128 girara_setting_add(session,
"notification-error-bg",
"#FF1212",
STRING, TRUE, _(
"Error notification background color"), NULL, NULL);
129 girara_setting_add(session,
"notification-warning-fg",
"#000000",
STRING, TRUE, _(
"Warning notification foreground color"), NULL, NULL);
130 girara_setting_add(session,
"notification-warning-bg",
"#F3F000",
STRING, TRUE, _(
"Warning notifaction background color"), NULL, NULL);
131 girara_setting_add(session,
"notification-fg",
"#000000",
STRING, TRUE, _(
"Notification foreground color"), NULL, NULL);
132 girara_setting_add(session,
"notification-bg",
"#FFFFFF",
STRING, TRUE, _(
"Notification background color"), NULL, NULL);
135 girara_setting_add(session,
"tabbar-focus-fg",
"#9FBC00",
STRING, TRUE, _(
"Tab bar foreground color (active)"), NULL, NULL);
136 girara_setting_add(session,
"tabbar-focus-bg",
"#000000",
STRING, TRUE, _(
"Tab bar background color (active)"), NULL, NULL);
138 girara_setting_add(session,
"window-width", &window_width,
INT, TRUE, _(
"Initial window width"), NULL, NULL);
139 girara_setting_add(session,
"window-height", &window_height,
INT, TRUE, _(
"Initial window height"), NULL, NULL);
140 girara_setting_add(session,
"n-completion-items", &n_completion_items,
INT, TRUE, _(
"Number of completion items"), NULL, NULL);
198 if (session->gtk.embed){
199 session->gtk.window = gtk_plug_new(session->gtk.embed);
201 session->gtk.window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
203 if (sessionname != NULL) {
204 gtk_widget_set_name(GTK_WIDGET(session->gtk.window), sessionname);
207 #if GTK_MAJOR_VERSION == 2
208 session->gtk.box = GTK_BOX(gtk_vbox_new(FALSE, 0));
209 session->gtk.statusbar_entries = GTK_BOX(gtk_hbox_new(FALSE, 0));
210 session->gtk.tabbar = gtk_hbox_new(TRUE, 0);
211 session->gtk.inputbar_box = GTK_BOX(gtk_hbox_new(TRUE, 0));
213 session->gtk.box = GTK_BOX(gtk_box_new(GTK_ORIENTATION_VERTICAL, 0));
214 session->gtk.statusbar_entries = GTK_BOX(gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0));
215 session->gtk.tabbar = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
216 session->gtk.inputbar_box = GTK_BOX(gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0));
217 gtk_box_set_homogeneous(GTK_BOX(session->gtk.tabbar), TRUE);
218 gtk_box_set_homogeneous(session->gtk.inputbar_box, TRUE);
220 session->gtk.view = gtk_scrolled_window_new(NULL, NULL);
221 session->gtk.viewport = gtk_viewport_new(NULL, NULL);
222 session->gtk.statusbar = gtk_event_box_new();
223 session->gtk.notification_area = gtk_event_box_new();
224 session->gtk.notification_text = gtk_label_new(NULL);
225 session->gtk.inputbar_dialog = GTK_LABEL(gtk_label_new(NULL));
226 session->gtk.inputbar_entry = GTK_ENTRY(gtk_entry_new());
227 session->gtk.inputbar = gtk_event_box_new();
228 session->gtk.tabs = GTK_NOTEBOOK(gtk_notebook_new());
231 GdkGeometry hints = {
244 gtk_window_set_geometry_hints(GTK_WINDOW(session->gtk.window), NULL, &hints, GDK_HINT_MIN_SIZE);
246 #if (GTK_MAJOR_VERSION == 3)
247 gtk_window_set_has_resize_grip(GTK_WINDOW(session->gtk.window), FALSE);
251 session->signals.view_key_pressed = g_signal_connect(G_OBJECT(session->gtk.view),
"key-press-event",
254 session->signals.view_button_press_event = g_signal_connect(G_OBJECT(session->gtk.view),
"button-press-event",
257 session->signals.view_button_release_event = g_signal_connect(G_OBJECT(session->gtk.view),
"button-release-event",
260 session->signals.view_motion_notify_event = g_signal_connect(G_OBJECT(session->gtk.view),
"motion-notify-event",
263 session->signals.view_key_pressed = g_signal_connect(G_OBJECT(session->gtk.view),
"scroll-event",
266 bool tmp_bool_value =
false;
268 if (tmp_bool_value ==
true) {
269 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(session->gtk.view),
270 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
272 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(session->gtk.view),
273 GTK_POLICY_NEVER, GTK_POLICY_NEVER);
277 gtk_container_add(GTK_CONTAINER(session->gtk.view), session->gtk.viewport);
278 gtk_viewport_set_shadow_type(GTK_VIEWPORT(session->gtk.viewport), GTK_SHADOW_NONE);
281 gtk_box_set_spacing(session->gtk.box, 0);
282 gtk_container_add(GTK_CONTAINER(session->gtk.window), GTK_WIDGET(session->gtk.box));
285 gtk_container_add(GTK_CONTAINER(session->gtk.statusbar), GTK_WIDGET(session->gtk.statusbar_entries));
288 gtk_container_add(GTK_CONTAINER(session->gtk.notification_area), GTK_WIDGET(session->gtk.notification_text));
289 gtk_misc_set_alignment(GTK_MISC(session->gtk.notification_text), 0.0, 0.0);
290 gtk_misc_set_padding(GTK_MISC(session->gtk.notification_text), 2, 2);
291 gtk_label_set_use_markup(GTK_LABEL(session->gtk.notification_text), TRUE);
294 gtk_entry_set_inner_border(session->gtk.inputbar_entry, NULL);
295 gtk_entry_set_has_frame(session->gtk.inputbar_entry, FALSE);
296 gtk_editable_set_editable(GTK_EDITABLE(session->gtk.inputbar_entry), TRUE);
298 session->signals.inputbar_key_pressed = g_signal_connect(
299 G_OBJECT(session->gtk.inputbar_entry),
305 session->signals.inputbar_changed = g_signal_connect(
306 G_OBJECT(session->gtk.inputbar_entry),
312 session->signals.inputbar_activate = g_signal_connect(
313 G_OBJECT(session->gtk.inputbar_entry),
319 gtk_box_set_homogeneous(session->gtk.inputbar_box, FALSE);
320 gtk_box_set_spacing(session->gtk.inputbar_box, 5);
322 gtk_box_pack_start(GTK_BOX(session->gtk.inputbar_box), GTK_WIDGET(session->gtk.inputbar_dialog), FALSE, FALSE, 0);
323 gtk_box_pack_start(GTK_BOX(session->gtk.inputbar_box), GTK_WIDGET(session->gtk.inputbar_entry), TRUE, TRUE, 0);
324 gtk_container_add(GTK_CONTAINER(session->gtk.inputbar), GTK_WIDGET(session->gtk.inputbar_box));
327 gtk_notebook_set_show_border(session->gtk.tabs, FALSE);
328 gtk_notebook_set_show_tabs(session->gtk.tabs, FALSE);
331 gtk_box_pack_start(session->gtk.box, GTK_WIDGET(session->gtk.tabbar), FALSE, FALSE, 0);
332 gtk_box_pack_start(session->gtk.box, GTK_WIDGET(session->gtk.view), TRUE, TRUE, 0);
333 gtk_box_pack_start(session->gtk.box, GTK_WIDGET(session->gtk.statusbar), FALSE, FALSE, 0);
334 gtk_box_pack_start(session->gtk.box, GTK_WIDGET(session->gtk.notification_area), FALSE, FALSE, 0);
335 gtk_box_pack_end( session->gtk.box, GTK_WIDGET(session->gtk.inputbar), FALSE, FALSE, 0);
338 typedef struct color_setting_mapping_s
342 } color_setting_mapping_t;
344 const color_setting_mapping_t color_setting_mappings[] = {
345 {
"default-fg", &(session->style.default_foreground)},
346 {
"default-bg", &(session->style.default_background)},
347 {
"inputbar-fg", &(session->style.inputbar_foreground)},
348 {
"inputbar-bg", &(session->style.inputbar_background)},
349 {
"statusbar-fg", &(session->style.statusbar_foreground)},
350 {
"statusbar-bg", &(session->style.statusbar_background)},
351 {
"completion-fg", &(session->style.completion_foreground)},
352 {
"completion-bg", &(session->style.completion_background)},
353 {
"completion-group-fg", &(session->style.completion_group_foreground)},
354 {
"completion-group-bg", &(session->style.completion_group_background)},
355 {
"completion-highlight-fg", &(session->style.completion_highlight_foreground)},
356 {
"completion-highlight-bg", &(session->style.completion_highlight_background)},
357 {
"notification-error-fg", &(session->style.notification_error_foreground)},
358 {
"notification-error-bg", &(session->style.notification_error_background)},
359 {
"notification-warning-fg", &(session->style.notification_warning_foreground)},
360 {
"notification-warning-bg", &(session->style.notification_warning_background)},
361 {
"notification-fg", &(session->style.notification_default_foreground)},
362 {
"notification-bg", &(session->style.notification_default_background)},
363 {
"tabbar-fg", &(session->style.tabbar_foreground)},
364 {
"tabbar-bg", &(session->style.tabbar_background)},
365 {
"tabbar-focus-fg", &(session->style.tabbar_focus_foreground)},
366 {
"tabbar-focus-bg", &(session->style.tabbar_focus_background)},
369 for (
unsigned i = 0; i <
LENGTH(color_setting_mappings); i++) {
370 char* tmp_value = NULL;
372 if (tmp_value != NULL) {
373 gdk_rgba_parse(color_setting_mappings[i].color, tmp_value);
379 gtk_widget_override_background_color(GTK_WIDGET(session->gtk.viewport),
380 GTK_STATE_NORMAL, &(session->style.default_background));
383 gtk_widget_override_background_color(GTK_WIDGET(session->gtk.statusbar),
384 GTK_STATE_NORMAL, &(session->style.statusbar_background));
387 #if (GTK_MAJOR_VERSION == 3)
388 gtk_widget_override_background_color(GTK_WIDGET(session->gtk.inputbar_entry),
389 GTK_STATE_NORMAL, &(session->style.inputbar_background));
390 gtk_widget_override_color(GTK_WIDGET(session->gtk.inputbar_entry),
391 GTK_STATE_NORMAL, &(session->style.inputbar_foreground));
393 gtk_widget_override_background_color(GTK_WIDGET(session->gtk.inputbar),
394 GTK_STATE_NORMAL, &(session->style.inputbar_background));
395 gtk_widget_override_color(GTK_WIDGET(session->gtk.inputbar_dialog),
396 GTK_STATE_NORMAL, &(session->style.inputbar_foreground));
399 gtk_widget_override_background_color(GTK_WIDGET(session->gtk.notification_area),
400 GTK_STATE_NORMAL, &(session->style.notification_default_background));
401 gtk_widget_override_color(GTK_WIDGET(session->gtk.notification_text),
402 GTK_STATE_NORMAL, &(session->style.notification_default_foreground));
405 gtk_widget_modify_base(GTK_WIDGET(session->gtk.inputbar_entry), GTK_STATE_NORMAL, &(session->style.inputbar_background));
406 gtk_widget_modify_text(GTK_WIDGET(session->gtk.inputbar_entry), GTK_STATE_NORMAL, &(session->style.inputbar_foreground));
408 gtk_widget_modify_bg(GTK_WIDGET(session->gtk.inputbar), GTK_STATE_NORMAL, &(session->style.inputbar_background));
409 gtk_widget_modify_fg(GTK_WIDGET(session->gtk.inputbar_dialog), GTK_STATE_NORMAL, &(session->style.inputbar_foreground));
412 gtk_widget_modify_bg(GTK_WIDGET(session->gtk.notification_area),
413 GTK_STATE_NORMAL, &(session->style.notification_default_background));
414 gtk_widget_modify_text(GTK_WIDGET(session->gtk.notification_text),
415 GTK_STATE_NORMAL, &(session->style.notification_default_foreground));
418 if (session->style.font == NULL) {
422 gtk_widget_override_font(GTK_WIDGET(session->gtk.inputbar_entry), session->style.font);
423 gtk_widget_override_font(GTK_WIDGET(session->gtk.inputbar_dialog), session->style.font);
424 gtk_widget_override_font(GTK_WIDGET(session->gtk.notification_text), session->style.font);
428 int window_width = 0;
429 int window_height = 0;
433 if (window_width > 0&& window_height > 0) {
434 gtk_window_set_default_size(GTK_WINDOW(session->gtk.window), window_width, window_height);
437 gtk_widget_show_all(GTK_WIDGET(session->gtk.window));
438 gtk_widget_hide(GTK_WIDGET(session->gtk.notification_area));
439 gtk_widget_hide(GTK_WIDGET(session->gtk.inputbar));
440 gtk_widget_hide(GTK_WIDGET(session->gtk.inputbar_dialog));
442 char* window_icon = NULL;
444 if (window_icon != NULL) {
445 if (strlen(window_icon) != 0) {
457 g_return_val_if_fail(session != NULL, FALSE);
460 pango_font_description_free(session->style.font);
464 session->bindings.shortcuts = NULL;
468 session->bindings.inputbar_shortcuts = NULL;
472 session->bindings.commands = NULL;
476 session->bindings.special_commands = NULL;
480 session->bindings.mouse_events = NULL;
484 session->settings = NULL;
488 session->elements.statusbar_items = NULL;
492 session->config.handles = NULL;
496 session->config.shortcut_mappings = NULL;
500 session->config.argument_mappings = NULL;
504 session->modes.identifiers = NULL;
507 if (session->buffer.command) {
508 g_string_free(session->buffer.command, TRUE);
511 if (session->global.buffer) {
512 g_string_free(session->global.buffer, TRUE);
515 session->buffer.command = NULL;
516 session->global.buffer = NULL;
519 g_slice_free(girara_session_t, session);
527 g_return_val_if_fail(session != NULL, NULL);
529 return (session->global.buffer) ? g_strdup(session->global.buffer->str) : NULL;
533 girara_notify(girara_session_t* session,
int level,
const char* format, ...)
536 || session->gtk.notification_text == NULL
537 || session->gtk.notification_area == NULL
538 || session->gtk.inputbar == NULL
539 || session->gtk.view == NULL) {
545 gtk_widget_override_background_color(GTK_WIDGET(session->gtk.notification_area),
546 GTK_STATE_NORMAL, &(session->style.notification_error_background));
547 gtk_widget_override_color(GTK_WIDGET(session->gtk.notification_text),
548 GTK_STATE_NORMAL, &(session->style.notification_error_foreground));
551 gtk_widget_override_background_color(GTK_WIDGET(session->gtk.notification_area),
552 GTK_STATE_NORMAL, &(session->style.notification_warning_background));
553 gtk_widget_override_color(GTK_WIDGET(session->gtk.notification_text),
554 GTK_STATE_NORMAL, &(session->style.notification_warning_foreground));
557 gtk_widget_override_background_color(GTK_WIDGET(session->gtk.notification_area),
558 GTK_STATE_NORMAL, &(session->style.notification_default_background));
559 gtk_widget_override_color(GTK_WIDGET(session->gtk.notification_text),
560 GTK_STATE_NORMAL, &(session->style.notification_default_foreground));
568 va_start(ap, format);
569 char* message = g_strdup_vprintf(format, ap);
572 gtk_label_set_markup(GTK_LABEL(session->gtk.notification_text), message);
576 gtk_widget_show(GTK_WIDGET(session->gtk.notification_area));
577 gtk_widget_hide(GTK_WIDGET(session->gtk.inputbar));
579 gtk_widget_grab_focus(GTK_WIDGET(session->gtk.view));
586 if (session == NULL || session->gtk.inputbar == NULL
587 || session->gtk.inputbar_dialog == NULL
588 || session->gtk.inputbar_entry == NULL) {
592 gtk_widget_show(GTK_WIDGET(session->gtk.inputbar_dialog));
595 if (dialog != NULL) {
596 gtk_label_set_markup(session->gtk.inputbar_dialog, dialog);
600 if (invisible ==
true) {
601 gtk_entry_set_visibility(session->gtk.inputbar_entry, FALSE);
603 gtk_entry_set_visibility(session->gtk.inputbar_entry, TRUE);
607 session->signals.inputbar_custom_activate = activate_event;
608 session->signals.inputbar_custom_key_press_event = key_press_event;
609 session->signals.inputbar_custom_data = data;
618 g_return_val_if_fail(session != NULL,
false);
620 GtkWidget* child = gtk_bin_get_child(GTK_BIN(session->gtk.viewport));
624 gtk_container_remove(GTK_CONTAINER(session->gtk.viewport), child);
627 gtk_container_add(GTK_CONTAINER(session->gtk.viewport), widget);
628 gtk_widget_show_all(widget);
636 g_return_if_fail(session != NULL);
638 session->modes.current_mode = mode;
644 g_return_val_if_fail(session != NULL, FALSE);
645 g_return_val_if_fail(name != NULL && name[0] != 0x0, FALSE);
649 if (mode->index > last_index) {
650 last_index = mode->index;
655 girara_mode_string_t* mode = g_slice_new(girara_mode_string_t);
656 mode->index = last_index + 1;
657 mode->name = g_strdup(name);
671 g_slice_free(girara_mode_string_t, mode);
677 g_return_val_if_fail(session != NULL, 0);
679 return session->modes.current_mode;
685 if (session == NULL || session->gtk.window == NULL || name == NULL) {
689 gtk_window_set_title(GTK_WINDOW(session->gtk.window), name);