4 #include <glib/gi18n-lib.h>
17 #if GTK_MAJOR_VERSION == 2
22 cb_sort_settings(girara_setting_t* lhs, girara_setting_t* rhs)
28 ensure_gettext_initialized(
void)
30 static gsize initialized = 0;
31 if (g_once_init_enter(&initialized) == TRUE) {
32 bindtextdomain(GETTEXT_PACKAGE, LOCALEDIR);
33 bind_textdomain_codeset(GETTEXT_PACKAGE,
"UTF-8");
34 g_once_init_leave(&initialized, 1);
41 ensure_gettext_initialized();
43 girara_session_t* session = g_slice_alloc0(
sizeof(girara_session_t));
69 session->modes.normal = normal_mode;
70 session->modes.current_mode = normal_mode;
71 session->modes.inputbar = inputbar_mode;
89 #if GTK_MAJOR_VERSION == 2
90 session->gtk.box = GTK_BOX(gtk_vbox_new(FALSE, 0));
91 session->gtk.statusbar_entries = GTK_BOX(gtk_hbox_new(FALSE, 0));
92 session->gtk.tabbar = gtk_hbox_new(TRUE, 0);
93 session->gtk.inputbar_box = GTK_BOX(gtk_hbox_new(TRUE, 0));
95 session->gtk.box = GTK_BOX(gtk_box_new(GTK_ORIENTATION_VERTICAL, 0));
96 session->gtk.statusbar_entries = GTK_BOX(gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0));
97 session->gtk.tabbar = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
98 session->gtk.inputbar_box = GTK_BOX(gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0));
99 gtk_box_set_homogeneous(GTK_BOX(session->gtk.tabbar), TRUE);
100 gtk_box_set_homogeneous(session->gtk.inputbar_box, TRUE);
102 session->gtk.view = gtk_scrolled_window_new(NULL, NULL);
103 session->gtk.viewport = gtk_viewport_new(NULL, NULL);
104 session->gtk.statusbar = gtk_event_box_new();
105 session->gtk.notification_area = gtk_event_box_new();
106 session->gtk.notification_text = gtk_label_new(NULL);
107 session->gtk.inputbar_dialog = GTK_LABEL(gtk_label_new(NULL));
108 session->gtk.inputbar_entry = GTK_ENTRY(gtk_entry_new());
109 session->gtk.inputbar = gtk_event_box_new();
110 session->gtk.tabs = GTK_NOTEBOOK(gtk_notebook_new());
118 if (session == NULL) {
123 if (session->gtk.embed){
124 session->gtk.window = gtk_plug_new(session->gtk.embed);
126 session->gtk.window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
129 if (sessionname != NULL) {
130 gtk_widget_set_name(GTK_WIDGET(session->gtk.window), sessionname);
133 GdkGeometry hints = {
146 gtk_window_set_geometry_hints(GTK_WINDOW(session->gtk.window), NULL, &hints, GDK_HINT_MIN_SIZE);
148 #if (GTK_MAJOR_VERSION == 3)
149 gtk_window_set_has_resize_grip(GTK_WINDOW(session->gtk.window), FALSE);
152 #if (GTK_MAJOR_VERSION == 3)
153 gtk_widget_override_background_color(GTK_WIDGET(session->gtk.window), GTK_STATE_NORMAL, &(session->style.default_background));
155 gtk_widget_modify_bg(GTK_WIDGET(session->gtk.window), GTK_STATE_NORMAL, &(session->style.default_background));
159 session->signals.view_key_pressed = g_signal_connect(G_OBJECT(session->gtk.view),
"key-press-event",
162 session->signals.view_button_press_event = g_signal_connect(G_OBJECT(session->gtk.view),
"button-press-event",
165 session->signals.view_button_release_event = g_signal_connect(G_OBJECT(session->gtk.view),
"button-release-event",
168 session->signals.view_motion_notify_event = g_signal_connect(G_OBJECT(session->gtk.view),
"motion-notify-event",
171 session->signals.view_scroll_event = g_signal_connect(G_OBJECT(session->gtk.view),
"scroll-event",
174 bool tmp_bool_value =
false;
176 if (tmp_bool_value ==
true) {
177 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(session->gtk.view),
178 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
180 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(session->gtk.view),
181 GTK_POLICY_NEVER, GTK_POLICY_NEVER);
185 gtk_container_add(GTK_CONTAINER(session->gtk.view), session->gtk.viewport);
186 gtk_viewport_set_shadow_type(GTK_VIEWPORT(session->gtk.viewport), GTK_SHADOW_NONE);
188 #if (GTK_MAJOR_VERSION == 3)
189 gtk_widget_override_background_color(GTK_WIDGET(session->gtk.viewport), GTK_STATE_NORMAL, &(session->style.default_background));
191 gtk_widget_modify_bg(GTK_WIDGET(session->gtk.viewport), GTK_STATE_NORMAL, &(session->style.default_background));
195 gtk_box_set_spacing(session->gtk.box, 0);
196 gtk_container_add(GTK_CONTAINER(session->gtk.window), GTK_WIDGET(session->gtk.box));
199 gtk_container_add(GTK_CONTAINER(session->gtk.statusbar), GTK_WIDGET(session->gtk.statusbar_entries));
202 gtk_container_add(GTK_CONTAINER(session->gtk.notification_area), GTK_WIDGET(session->gtk.notification_text));
203 gtk_misc_set_alignment(GTK_MISC(session->gtk.notification_text), 0.0, 0.0);
204 gtk_misc_set_padding(GTK_MISC(session->gtk.notification_text), 2, 2);
205 gtk_label_set_use_markup(GTK_LABEL(session->gtk.notification_text), TRUE);
208 gtk_entry_set_inner_border(session->gtk.inputbar_entry, NULL);
209 gtk_entry_set_has_frame(session->gtk.inputbar_entry, FALSE);
210 gtk_editable_set_editable(GTK_EDITABLE(session->gtk.inputbar_entry), TRUE);
212 session->signals.inputbar_key_pressed = g_signal_connect(
213 G_OBJECT(session->gtk.inputbar_entry),
219 session->signals.inputbar_changed = g_signal_connect(
220 G_OBJECT(session->gtk.inputbar_entry),
226 session->signals.inputbar_activate = g_signal_connect(
227 G_OBJECT(session->gtk.inputbar_entry),
233 gtk_box_set_homogeneous(session->gtk.inputbar_box, FALSE);
234 gtk_box_set_spacing(session->gtk.inputbar_box, 5);
236 gtk_box_pack_start(GTK_BOX(session->gtk.inputbar_box), GTK_WIDGET(session->gtk.inputbar_dialog), FALSE, FALSE, 0);
237 gtk_box_pack_start(GTK_BOX(session->gtk.inputbar_box), GTK_WIDGET(session->gtk.inputbar_entry), TRUE, TRUE, 0);
238 gtk_container_add(GTK_CONTAINER(session->gtk.inputbar), GTK_WIDGET(session->gtk.inputbar_box));
241 gtk_notebook_set_show_border(session->gtk.tabs, FALSE);
242 gtk_notebook_set_show_tabs(session->gtk.tabs, FALSE);
245 gtk_box_pack_start(session->gtk.box, GTK_WIDGET(session->gtk.tabbar), FALSE, FALSE, 0);
246 gtk_box_pack_start(session->gtk.box, GTK_WIDGET(session->gtk.view), TRUE, TRUE, 0);
247 gtk_box_pack_start(session->gtk.box, GTK_WIDGET(session->gtk.statusbar), FALSE, FALSE, 0);
248 gtk_box_pack_start(session->gtk.box, GTK_WIDGET(session->gtk.notification_area), FALSE, FALSE, 0);
249 gtk_box_pack_end( session->gtk.box, GTK_WIDGET(session->gtk.inputbar), FALSE, FALSE, 0);
252 typedef struct color_setting_mapping_s
256 } color_setting_mapping_t;
258 const color_setting_mapping_t color_setting_mappings[] = {
259 {
"default-fg", &(session->style.default_foreground)},
260 {
"default-bg", &(session->style.default_background)},
261 {
"inputbar-fg", &(session->style.inputbar_foreground)},
262 {
"inputbar-bg", &(session->style.inputbar_background)},
263 {
"statusbar-fg", &(session->style.statusbar_foreground)},
264 {
"statusbar-bg", &(session->style.statusbar_background)},
265 {
"completion-fg", &(session->style.completion_foreground)},
266 {
"completion-bg", &(session->style.completion_background)},
267 {
"completion-group-fg", &(session->style.completion_group_foreground)},
268 {
"completion-group-bg", &(session->style.completion_group_background)},
269 {
"completion-highlight-fg", &(session->style.completion_highlight_foreground)},
270 {
"completion-highlight-bg", &(session->style.completion_highlight_background)},
271 {
"notification-error-fg", &(session->style.notification_error_foreground)},
272 {
"notification-error-bg", &(session->style.notification_error_background)},
273 {
"notification-warning-fg", &(session->style.notification_warning_foreground)},
274 {
"notification-warning-bg", &(session->style.notification_warning_background)},
275 {
"notification-fg", &(session->style.notification_default_foreground)},
276 {
"notification-bg", &(session->style.notification_default_background)},
277 {
"tabbar-fg", &(session->style.tabbar_foreground)},
278 {
"tabbar-bg", &(session->style.tabbar_background)},
279 {
"tabbar-focus-fg", &(session->style.tabbar_focus_foreground)},
280 {
"tabbar-focus-bg", &(session->style.tabbar_focus_background)},
283 for (
unsigned i = 0; i <
LENGTH(color_setting_mappings); i++) {
284 char* tmp_value = NULL;
286 if (tmp_value != NULL) {
287 gdk_rgba_parse(color_setting_mappings[i].color, tmp_value);
293 gtk_widget_override_background_color(GTK_WIDGET(session->gtk.viewport),
294 GTK_STATE_NORMAL, &(session->style.default_background));
297 gtk_widget_override_background_color(GTK_WIDGET(session->gtk.statusbar),
298 GTK_STATE_NORMAL, &(session->style.statusbar_background));
301 #if (GTK_MAJOR_VERSION == 3)
302 gtk_widget_override_background_color(GTK_WIDGET(session->gtk.inputbar_entry),
303 GTK_STATE_NORMAL, &(session->style.inputbar_background));
304 gtk_widget_override_color(GTK_WIDGET(session->gtk.inputbar_entry),
305 GTK_STATE_NORMAL, &(session->style.inputbar_foreground));
307 gtk_widget_override_background_color(GTK_WIDGET(session->gtk.inputbar),
308 GTK_STATE_NORMAL, &(session->style.inputbar_background));
309 gtk_widget_override_color(GTK_WIDGET(session->gtk.inputbar_dialog),
310 GTK_STATE_NORMAL, &(session->style.inputbar_foreground));
313 gtk_widget_override_background_color(GTK_WIDGET(session->gtk.notification_area),
314 GTK_STATE_NORMAL, &(session->style.notification_default_background));
315 gtk_widget_override_color(GTK_WIDGET(session->gtk.notification_text),
316 GTK_STATE_NORMAL, &(session->style.notification_default_foreground));
319 gtk_widget_modify_base(GTK_WIDGET(session->gtk.inputbar_entry), GTK_STATE_NORMAL, &(session->style.inputbar_background));
320 gtk_widget_modify_text(GTK_WIDGET(session->gtk.inputbar_entry), GTK_STATE_NORMAL, &(session->style.inputbar_foreground));
322 gtk_widget_modify_bg(GTK_WIDGET(session->gtk.inputbar), GTK_STATE_NORMAL, &(session->style.inputbar_background));
323 gtk_widget_modify_fg(GTK_WIDGET(session->gtk.inputbar_dialog), GTK_STATE_NORMAL, &(session->style.inputbar_foreground));
326 gtk_widget_modify_bg(GTK_WIDGET(session->gtk.notification_area),
327 GTK_STATE_NORMAL, &(session->style.notification_default_background));
328 gtk_widget_modify_text(GTK_WIDGET(session->gtk.notification_text),
329 GTK_STATE_NORMAL, &(session->style.notification_default_foreground));
332 if (session->style.font == NULL) {
336 gtk_widget_override_font(GTK_WIDGET(session->gtk.inputbar_entry), session->style.font);
337 gtk_widget_override_font(GTK_WIDGET(session->gtk.inputbar_dialog), session->style.font);
338 gtk_widget_override_font(GTK_WIDGET(session->gtk.notification_text), session->style.font);
342 int window_width = 0;
343 int window_height = 0;
347 if (window_width > 0&& window_height > 0) {
348 gtk_window_set_default_size(GTK_WINDOW(session->gtk.window), window_width, window_height);
351 gtk_widget_show_all(GTK_WIDGET(session->gtk.window));
352 gtk_widget_hide(GTK_WIDGET(session->gtk.notification_area));
353 gtk_widget_hide(GTK_WIDGET(session->gtk.inputbar_dialog));
355 if (session->global.autohide_inputbar ==
true) {
356 gtk_widget_hide(GTK_WIDGET(session->gtk.inputbar));
359 if (session->global.hide_statusbar ==
true) {
360 gtk_widget_hide(GTK_WIDGET(session->gtk.statusbar));
363 char* window_icon = NULL;
365 if (window_icon != NULL) {
366 if (strlen(window_icon) != 0) {
372 gtk_widget_grab_focus(GTK_WIDGET(session->gtk.view));
380 g_return_val_if_fail(session != NULL, FALSE);
383 if (session->style.font) {
384 pango_font_description_free(session->style.font);
389 session->bindings.shortcuts = NULL;
393 session->bindings.inputbar_shortcuts = NULL;
397 session->bindings.commands = NULL;
401 session->bindings.special_commands = NULL;
405 session->bindings.mouse_events = NULL;
409 session->settings = NULL;
412 g_object_unref(session->command_history);
413 session->command_history = NULL;
417 session->elements.statusbar_items = NULL;
421 session->config.handles = NULL;
425 session->config.shortcut_mappings = NULL;
429 session->config.argument_mappings = NULL;
433 session->modes.identifiers = NULL;
436 if (session->buffer.command) {
437 g_string_free(session->buffer.command, TRUE);
440 if (session->global.buffer) {
441 g_string_free(session->global.buffer, TRUE);
444 session->buffer.command = NULL;
445 session->global.buffer = NULL;
448 g_slice_free(girara_session_t, session);
456 g_return_val_if_fail(session != NULL, NULL);
458 return (session->global.buffer) ? g_strdup(session->global.buffer->str) : NULL;
462 girara_notify(girara_session_t* session,
int level,
const char* format, ...)
465 || session->gtk.notification_text == NULL
466 || session->gtk.notification_area == NULL
467 || session->gtk.inputbar == NULL
468 || session->gtk.view == NULL) {
474 gtk_widget_override_background_color(GTK_WIDGET(session->gtk.notification_area),
475 GTK_STATE_NORMAL, &(session->style.notification_error_background));
476 gtk_widget_override_color(GTK_WIDGET(session->gtk.notification_text),
477 GTK_STATE_NORMAL, &(session->style.notification_error_foreground));
480 gtk_widget_override_background_color(GTK_WIDGET(session->gtk.notification_area),
481 GTK_STATE_NORMAL, &(session->style.notification_warning_background));
482 gtk_widget_override_color(GTK_WIDGET(session->gtk.notification_text),
483 GTK_STATE_NORMAL, &(session->style.notification_warning_foreground));
486 gtk_widget_override_background_color(GTK_WIDGET(session->gtk.notification_area),
487 GTK_STATE_NORMAL, &(session->style.notification_default_background));
488 gtk_widget_override_color(GTK_WIDGET(session->gtk.notification_text),
489 GTK_STATE_NORMAL, &(session->style.notification_default_foreground));
497 va_start(ap, format);
498 char* message = g_strdup_vprintf(format, ap);
501 gtk_label_set_markup(GTK_LABEL(session->gtk.notification_text), message);
505 gtk_widget_show(GTK_WIDGET(session->gtk.notification_area));
506 gtk_widget_hide(GTK_WIDGET(session->gtk.inputbar));
508 gtk_widget_grab_focus(GTK_WIDGET(session->gtk.view));
515 if (session == NULL || session->gtk.inputbar == NULL
516 || session->gtk.inputbar_dialog == NULL
517 || session->gtk.inputbar_entry == NULL) {
521 gtk_widget_show(GTK_WIDGET(session->gtk.inputbar_dialog));
524 if (dialog != NULL) {
525 gtk_label_set_markup(session->gtk.inputbar_dialog, dialog);
529 if (invisible ==
true) {
530 gtk_entry_set_visibility(session->gtk.inputbar_entry, FALSE);
532 gtk_entry_set_visibility(session->gtk.inputbar_entry, TRUE);
536 session->signals.inputbar_custom_activate = activate_event;
537 session->signals.inputbar_custom_key_press_event = key_press_event;
538 session->signals.inputbar_custom_data = data;
547 g_return_val_if_fail(session != NULL,
false);
549 GtkWidget* child = gtk_bin_get_child(GTK_BIN(session->gtk.viewport));
553 gtk_container_remove(GTK_CONTAINER(session->gtk.viewport), child);
556 gtk_container_add(GTK_CONTAINER(session->gtk.viewport), widget);
557 gtk_widget_show_all(widget);
565 g_return_if_fail(session != NULL);
567 session->modes.current_mode = mode;
573 g_return_val_if_fail(session != NULL, FALSE);
574 g_return_val_if_fail(name != NULL && name[0] != 0x0, FALSE);
578 if (mode->index > last_index) {
579 last_index = mode->index;
584 girara_mode_string_t* mode = g_slice_new(girara_mode_string_t);
585 mode->index = last_index + 1;
586 mode->name = g_strdup(name);
600 g_slice_free(girara_mode_string_t, mode);
606 g_return_val_if_fail(session != NULL, 0);
608 return session->modes.current_mode;
614 if (session == NULL || session->gtk.window == NULL || name == NULL) {
618 gtk_window_set_title(GTK_WINDOW(session->gtk.window), name);
626 g_return_val_if_fail(session != NULL, FALSE);