girara
session.c
Go to the documentation of this file.
00001 /* See LICENSE file for license and copyright information */
00002 
00003 #include <stdlib.h>
00004 #include <glib/gi18n-lib.h>
00005 
00006 #include "session.h"
00007 #include "settings.h"
00008 #include "datastructures.h"
00009 #include "internal.h"
00010 #include "commands.h"
00011 #include "callbacks.h"
00012 #include "shortcuts.h"
00013 #include "config.h"
00014 #include "utils.h"
00015 
00016 #if GTK_MAJOR_VERSION == 2
00017 #include "gtk2-compat.h"
00018 #endif
00019 
00020 static void
00021 cb_window_icon(girara_session_t* session, const char* UNUSED(name), girara_setting_type_t UNUSED(type), void* value, void* UNUSED(data))
00022 {
00023   g_return_if_fail(session != NULL && value != NULL);
00024 
00025   if (session->gtk.window != NULL) {
00026     GError* error = NULL;
00027     gtk_window_set_icon_from_file(GTK_WINDOW(session->gtk.window), (const char*) value, &error);
00028     if (error != NULL) {
00029       girara_error("failed to load window icon: %s", error->message);
00030       g_error_free(error);
00031     }
00032   }
00033 }
00034 
00035 static void
00036 cb_font(girara_session_t* session, const char* UNUSED(name), girara_setting_type_t UNUSED(type), void* value, void* UNUSED(data))
00037 {
00038   g_return_if_fail(session != NULL && value != NULL);
00039 
00040   pango_font_description_free(session->style.font);
00041 
00042   /* parse font */
00043   PangoFontDescription* font = pango_font_description_from_string(value);
00044   session->style.font = font;
00045 
00046   /* inputbar */
00047   if (session->gtk.inputbar_entry != NULL) {
00048     gtk_widget_override_font(GTK_WIDGET(session->gtk.inputbar_entry), font);
00049   }
00050 
00051   if (session->gtk.inputbar_dialog != NULL) {
00052     gtk_widget_override_font(GTK_WIDGET(session->gtk.inputbar_dialog), font);
00053   }
00054 
00055   /* notification area */
00056   if (session->gtk.notification_text != NULL) {
00057     gtk_widget_override_font(GTK_WIDGET(session->gtk.notification_text), font);
00058   }
00059 }
00060 
00061 static int
00062 cb_sort_settings(girara_setting_t* lhs, girara_setting_t* rhs)
00063 {
00064   return g_strcmp0(girara_setting_get_name(lhs), girara_setting_get_name(rhs));
00065 }
00066 
00067 girara_session_t*
00068 girara_session_create()
00069 {
00070   bindtextdomain(GETTEXT_PACKAGE, LOCALEDIR);
00071   bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8");
00072 
00073   girara_session_t* session = g_slice_alloc0(sizeof(girara_session_t));
00074 
00075   /* init values */
00076   session->bindings.mouse_events       = girara_list_new2(
00077       (girara_free_function_t) girara_mouse_event_free);
00078   session->bindings.commands           = girara_list_new2(
00079       (girara_free_function_t) girara_command_free);
00080   session->bindings.special_commands   = girara_list_new2(
00081       (girara_free_function_t) girara_special_command_free);
00082   session->bindings.shortcuts          = girara_list_new2(
00083       (girara_free_function_t) girara_shortcut_free);
00084   session->bindings.inputbar_shortcuts = girara_list_new2(
00085       (girara_free_function_t) girara_inputbar_shortcut_free);
00086   session->elements.statusbar_items    = girara_list_new2(
00087       (girara_free_function_t) girara_statusbar_item_free);
00088   session->settings                    = girara_sorted_list_new2(
00089       (girara_compare_function_t) cb_sort_settings,
00090       (girara_free_function_t) girara_setting_free);
00091 
00092   session->modes.identifiers  = girara_list_new2(
00093       (girara_free_function_t) girara_mode_string_free);
00094   girara_mode_t normal_mode   = girara_mode_add(session, "normal");
00095   session->modes.normal       = normal_mode;
00096   session->modes.current_mode = normal_mode;
00097 
00098   session->config.handles           = girara_list_new2(
00099       (girara_free_function_t) girara_config_handle_free);
00100   session->config.shortcut_mappings = girara_list_new2(
00101       (girara_free_function_t) girara_shortcut_mapping_free);
00102   session->config.argument_mappings = girara_list_new2(
00103       (girara_free_function_t) girara_argument_mapping_free);
00104 
00105   session->style.font = NULL;
00106 
00107   /* default values */
00108   int window_width       = 800;
00109   int window_height      = 600;
00110   int n_completion_items = 15;
00111   bool show_scrollbars   = false;
00112 
00113   /* add default settings */
00114   girara_setting_add(session, "font",                     "monospace normal 9", STRING,  FALSE, _("Font"), cb_font, NULL);
00115   girara_setting_add(session, "default-fg",               "#DDDDDD",            STRING,  TRUE,  _("Default foreground color"), NULL, NULL);
00116   girara_setting_add(session, "default-bg",               "#000000",            STRING,  TRUE,  _("Default background color"), NULL, NULL);
00117   girara_setting_add(session, "inputbar-fg",              "#9FBC00",            STRING,  TRUE,  _("Inputbar foreground color"), NULL, NULL);
00118   girara_setting_add(session, "inputbar-bg",              "#131313",            STRING,  TRUE,  _("Inputbar background color"), NULL, NULL);
00119   girara_setting_add(session, "statusbar-fg",             "#FFFFFF",            STRING,  TRUE,  _("Statusbar foreground color"), NULL, NULL);
00120   girara_setting_add(session, "statusbar-bg",             "#000000",            STRING,  TRUE,  _("Statsubar background color"), NULL, NULL);
00121   girara_setting_add(session, "completion-fg",            "#DDDDDD",            STRING,  TRUE,  _("Completion foreground color"), NULL, NULL);
00122   girara_setting_add(session, "completion-bg",            "#232323",            STRING,  TRUE,  _("Completion background color"), NULL, NULL);
00123   girara_setting_add(session, "completion-group-fg",      "#DEDEDE",            STRING,  TRUE,  _("Completion group foreground color"), NULL, NULL);
00124   girara_setting_add(session, "completion-group-bg",      "#000000",            STRING,  TRUE,  _("Completion group background color"), NULL, NULL);
00125   girara_setting_add(session, "completion-highlight-fg",  "#232323",            STRING,  TRUE,  _("Completion highlight foreground color"), NULL, NULL);
00126   girara_setting_add(session, "completion-highlight-bg",  "#9FBC00",            STRING,  TRUE,  _("Completion highlight background color"), NULL, NULL);
00127   girara_setting_add(session, "notification-error-fg",    "#FFFFFF",            STRING,  TRUE,  _("Error notification foreground color"), NULL, NULL);
00128   girara_setting_add(session, "notification-error-bg",    "#FF1212",            STRING,  TRUE,  _("Error notification background color"), NULL, NULL);
00129   girara_setting_add(session, "notification-warning-fg",  "#000000",            STRING,  TRUE,  _("Warning notification foreground color"), NULL, NULL);
00130   girara_setting_add(session, "notification-warning-bg",  "#F3F000",            STRING,  TRUE,  _("Warning notifaction background color"), NULL, NULL);
00131   girara_setting_add(session, "notification-fg",          "#000000",            STRING,  TRUE,  _("Notification foreground color"), NULL, NULL);
00132   girara_setting_add(session, "notification-bg",          "#FFFFFF",            STRING,  TRUE,  _("Notification background color"), NULL, NULL);
00133   girara_setting_add(session, "tabbar-fg",                "#939393",            STRING,  TRUE,  _("Tab bar foreground color"), NULL, NULL);
00134   girara_setting_add(session, "tabbar-bg",                "#000000",            STRING,  TRUE,  _("Tab bar background color"), NULL, NULL);
00135   girara_setting_add(session, "tabbar-focus-fg",          "#9FBC00",            STRING,  TRUE,  _("Tab bar foreground color (active)"), NULL, NULL);
00136   girara_setting_add(session, "tabbar-focus-bg",          "#000000",            STRING,  TRUE,  _("Tab bar background color (active)"), NULL, NULL);
00137   girara_setting_add(session, "word-separator",           " /.-=&#?",           STRING,  TRUE,  NULL, NULL, NULL);
00138   girara_setting_add(session, "window-width",             &window_width,        INT,     TRUE,  _("Initial window width"), NULL, NULL);
00139   girara_setting_add(session, "window-height",            &window_height,       INT,     TRUE,  _("Initial window height"), NULL, NULL);
00140   girara_setting_add(session, "n-completion-items",       &n_completion_items,  INT,     TRUE,  _("Number of completion items"), NULL, NULL);
00141   girara_setting_add(session, "show-scrollbars",          &show_scrollbars,     BOOLEAN, TRUE,  _("Show scrollbars"), NULL, NULL);
00142 
00143   /* window icon */
00144   girara_setting_add(session, "window-icon",              "",                   STRING,  FALSE, _("Window icon"), cb_window_icon, NULL);
00145   /* exec-command */
00146   girara_setting_add(session, "exec-command",             "",                   STRING,  FALSE, _("Command to execute in :exec"), NULL, NULL);
00147 
00148   /* default shortcuts */
00149   girara_shortcut_add(session, 0,                GDK_KEY_Escape, NULL, girara_sc_abort,           normal_mode, 0, NULL);
00150   girara_shortcut_add(session, GDK_CONTROL_MASK, GDK_KEY_c,      NULL, girara_sc_abort,           normal_mode, 0, NULL);
00151   girara_shortcut_add(session, GDK_CONTROL_MASK, GDK_KEY_q,      NULL, girara_sc_quit,            normal_mode, 0, NULL);
00152   girara_shortcut_add(session, 0,                GDK_KEY_colon,  NULL, girara_sc_focus_inputbar,  normal_mode, 0, ":");
00153   girara_shortcut_add(session, GDK_CONTROL_MASK, GDK_KEY_w,      NULL, girara_sc_tab_close,       normal_mode, 0, NULL);
00154   girara_shortcut_add(session, 0,                0,              "gt", girara_sc_tab_navigate,    normal_mode, GIRARA_NEXT,     NULL);
00155   girara_shortcut_add(session, 0,                0,              "gT", girara_sc_tab_navigate,    normal_mode, GIRARA_PREVIOUS, NULL);
00156 
00157   /* default inputbar shortcuts */
00158   girara_inputbar_shortcut_add(session, 0,                GDK_KEY_Escape,       girara_isc_abort,               0,                           NULL);
00159   girara_inputbar_shortcut_add(session, GDK_CONTROL_MASK, GDK_KEY_c,            girara_isc_abort,               0,                           NULL);
00160   girara_inputbar_shortcut_add(session, 0,                GDK_KEY_Tab,          girara_isc_completion,          GIRARA_NEXT,                 NULL);
00161   girara_inputbar_shortcut_add(session, GDK_CONTROL_MASK, GDK_KEY_Tab,          girara_isc_completion,          GIRARA_NEXT_GROUP,           NULL);
00162   girara_inputbar_shortcut_add(session, 0,                GDK_KEY_ISO_Left_Tab, girara_isc_completion,          GIRARA_PREVIOUS,             NULL);
00163   girara_inputbar_shortcut_add(session, GDK_CONTROL_MASK, GDK_KEY_ISO_Left_Tab, girara_isc_completion,          GIRARA_PREVIOUS_GROUP,       NULL);
00164   girara_inputbar_shortcut_add(session, 0,                GDK_KEY_BackSpace,    girara_isc_string_manipulation, GIRARA_DELETE_LAST_CHAR,     NULL);
00165   girara_inputbar_shortcut_add(session, GDK_CONTROL_MASK, GDK_KEY_h,            girara_isc_string_manipulation, GIRARA_DELETE_LAST_CHAR,     NULL);
00166   girara_inputbar_shortcut_add(session, GDK_CONTROL_MASK, GDK_KEY_u,            girara_isc_string_manipulation, GIRARA_DELETE_TO_LINE_START, NULL);
00167   girara_inputbar_shortcut_add(session, GDK_CONTROL_MASK, GDK_KEY_k,            girara_isc_string_manipulation, GIRARA_DELETE_TO_LINE_END,   NULL);
00168   girara_inputbar_shortcut_add(session, GDK_CONTROL_MASK, GDK_KEY_d,            girara_isc_string_manipulation, GIRARA_DELETE_CURR_CHAR,     NULL);
00169   girara_inputbar_shortcut_add(session, GDK_CONTROL_MASK, GDK_KEY_w,            girara_isc_string_manipulation, GIRARA_DELETE_LAST_WORD,     NULL);
00170   girara_inputbar_shortcut_add(session, GDK_CONTROL_MASK, GDK_KEY_f,            girara_isc_string_manipulation, GIRARA_NEXT_CHAR,            NULL);
00171   girara_inputbar_shortcut_add(session, GDK_CONTROL_MASK, GDK_KEY_b,            girara_isc_string_manipulation, GIRARA_PREVIOUS_CHAR,        NULL);
00172   girara_inputbar_shortcut_add(session, GDK_CONTROL_MASK, GDK_KEY_a,            girara_isc_string_manipulation, GIRARA_GOTO_START,           NULL);
00173   girara_inputbar_shortcut_add(session, GDK_CONTROL_MASK, GDK_KEY_e,            girara_isc_string_manipulation, GIRARA_GOTO_END,             NULL);
00174 
00175   /* default commands */
00176   girara_inputbar_command_add(session, "exec",  NULL, girara_cmd_exec,  NULL,          _("Execute a command"));
00177   girara_inputbar_command_add(session, "map",   "m",  girara_cmd_map,   NULL,          _("Map a key sequence"));
00178   girara_inputbar_command_add(session, "quit",  "q",  girara_cmd_quit,  NULL,          _("Quit the program"));
00179   girara_inputbar_command_add(session, "set",   "s",  girara_cmd_set,   girara_cc_set, _("Set an option"));
00180   girara_inputbar_command_add(session, "unmap", NULL, girara_cmd_unmap, NULL,          _("Unmap a key sequence"));
00181 
00182   /* default config handle */
00183   girara_config_handle_add(session, "map",   girara_cmd_map);
00184   girara_config_handle_add(session, "set",   girara_cmd_set);
00185   girara_config_handle_add(session, "unmap", girara_cmd_unmap);
00186 
00187   /* default shortcut mappings */
00188   girara_shortcut_mapping_add(session, "focus_inputbar", girara_sc_focus_inputbar);
00189   girara_shortcut_mapping_add(session, "quit",           girara_sc_quit);
00190   girara_shortcut_mapping_add(session, "set",            girara_sc_set);
00191 
00192   return session;
00193 }
00194 
00195 bool
00196 girara_session_init(girara_session_t* session, const char* sessionname)
00197 {
00198   if (session->gtk.embed){
00199     session->gtk.window = gtk_plug_new(session->gtk.embed);
00200   } else {
00201     session->gtk.window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
00202   }
00203   if (sessionname != NULL) {
00204     gtk_widget_set_name(GTK_WIDGET(session->gtk.window), sessionname);
00205   }
00206 
00207 #if GTK_MAJOR_VERSION == 2
00208   session->gtk.box               = GTK_BOX(gtk_vbox_new(FALSE, 0));
00209   session->gtk.statusbar_entries = GTK_BOX(gtk_hbox_new(FALSE, 0));
00210   session->gtk.tabbar            = gtk_hbox_new(TRUE, 0);
00211   session->gtk.inputbar_box      = GTK_BOX(gtk_hbox_new(TRUE, 0));
00212 #else
00213   session->gtk.box               = GTK_BOX(gtk_box_new(GTK_ORIENTATION_VERTICAL, 0));
00214   session->gtk.statusbar_entries = GTK_BOX(gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0));
00215   session->gtk.tabbar            = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
00216   session->gtk.inputbar_box      = GTK_BOX(gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0));
00217   gtk_box_set_homogeneous(GTK_BOX(session->gtk.tabbar), TRUE);
00218   gtk_box_set_homogeneous(session->gtk.inputbar_box, TRUE);
00219 #endif
00220   session->gtk.view              = gtk_scrolled_window_new(NULL, NULL);
00221   session->gtk.viewport          = gtk_viewport_new(NULL, NULL);
00222   session->gtk.statusbar         = gtk_event_box_new();
00223   session->gtk.notification_area = gtk_event_box_new();
00224   session->gtk.notification_text = gtk_label_new(NULL);
00225   session->gtk.inputbar_dialog   = GTK_LABEL(gtk_label_new(NULL));
00226   session->gtk.inputbar_entry    = GTK_ENTRY(gtk_entry_new());
00227   session->gtk.inputbar          = gtk_event_box_new();
00228   session->gtk.tabs              = GTK_NOTEBOOK(gtk_notebook_new());
00229 
00230   /* window */
00231   GdkGeometry hints = {
00232     .base_height = 1,
00233     .base_width  = 1,
00234     .height_inc  = 0,
00235     .max_aspect  = 0,
00236     .max_height  = 0,
00237     .max_width   = 0,
00238     .min_aspect  = 0,
00239     .min_height  = 0,
00240     .min_width   = 0,
00241     .width_inc   = 0
00242   };
00243 
00244   gtk_window_set_geometry_hints(GTK_WINDOW(session->gtk.window), NULL, &hints, GDK_HINT_MIN_SIZE);
00245 
00246 #if (GTK_MAJOR_VERSION == 3)
00247   gtk_window_set_has_resize_grip(GTK_WINDOW(session->gtk.window), FALSE);
00248 #endif
00249 
00250   /* view */
00251   session->signals.view_key_pressed = g_signal_connect(G_OBJECT(session->gtk.view), "key-press-event",
00252       G_CALLBACK(girara_callback_view_key_press_event), session);
00253 
00254   session->signals.view_button_press_event = g_signal_connect(G_OBJECT(session->gtk.view), "button-press-event",
00255       G_CALLBACK(girara_callback_view_button_press_event), session);
00256 
00257   session->signals.view_button_release_event = g_signal_connect(G_OBJECT(session->gtk.view), "button-release-event",
00258       G_CALLBACK(girara_callback_view_button_release_event), session);
00259 
00260   session->signals.view_motion_notify_event = g_signal_connect(G_OBJECT(session->gtk.view), "motion-notify-event",
00261       G_CALLBACK(girara_callback_view_button_motion_notify_event), session);
00262 
00263   session->signals.view_key_pressed = g_signal_connect(G_OBJECT(session->gtk.view), "scroll-event",
00264       G_CALLBACK(girara_callback_view_scroll_event), session);
00265 
00266   bool tmp_bool_value = false;
00267   girara_setting_get(session, "show-scrollbars", &tmp_bool_value);
00268   if (tmp_bool_value == true) {
00269     gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(session->gtk.view),
00270         GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
00271   } else {
00272     gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(session->gtk.view),
00273         GTK_POLICY_NEVER, GTK_POLICY_NEVER);
00274   }
00275 
00276   /* viewport */
00277   gtk_container_add(GTK_CONTAINER(session->gtk.view), session->gtk.viewport);
00278   gtk_viewport_set_shadow_type(GTK_VIEWPORT(session->gtk.viewport), GTK_SHADOW_NONE);
00279 
00280   /* box */
00281   gtk_box_set_spacing(session->gtk.box, 0);
00282   gtk_container_add(GTK_CONTAINER(session->gtk.window), GTK_WIDGET(session->gtk.box));
00283 
00284   /* statusbar */
00285   gtk_container_add(GTK_CONTAINER(session->gtk.statusbar), GTK_WIDGET(session->gtk.statusbar_entries));
00286 
00287   /* notification area */
00288   gtk_container_add(GTK_CONTAINER(session->gtk.notification_area), GTK_WIDGET(session->gtk.notification_text));
00289   gtk_misc_set_alignment(GTK_MISC(session->gtk.notification_text), 0.0, 0.0);
00290   gtk_misc_set_padding(GTK_MISC(session->gtk.notification_text), 2, 2);
00291   gtk_label_set_use_markup(GTK_LABEL(session->gtk.notification_text), TRUE);
00292 
00293   /* inputbar */
00294   gtk_entry_set_inner_border(session->gtk.inputbar_entry, NULL);
00295   gtk_entry_set_has_frame(session->gtk.inputbar_entry, FALSE);
00296   gtk_editable_set_editable(GTK_EDITABLE(session->gtk.inputbar_entry), TRUE);
00297 
00298   session->signals.inputbar_key_pressed = g_signal_connect(
00299       G_OBJECT(session->gtk.inputbar_entry),
00300       "key-press-event",
00301       G_CALLBACK(girara_callback_inputbar_key_press_event),
00302       session
00303     );
00304 
00305   session->signals.inputbar_changed = g_signal_connect(
00306       G_OBJECT(session->gtk.inputbar_entry),
00307       "changed",
00308       G_CALLBACK(girara_callback_inputbar_changed_event),
00309       session
00310     );
00311 
00312   session->signals.inputbar_activate = g_signal_connect(
00313       G_OBJECT(session->gtk.inputbar_entry),
00314       "activate",
00315       G_CALLBACK(girara_callback_inputbar_activate),
00316       session
00317     );
00318 
00319   gtk_box_set_homogeneous(session->gtk.inputbar_box, FALSE);
00320   gtk_box_set_spacing(session->gtk.inputbar_box, 5);
00321 
00322   gtk_box_pack_start(GTK_BOX(session->gtk.inputbar_box),  GTK_WIDGET(session->gtk.inputbar_dialog), FALSE, FALSE, 0);
00323   gtk_box_pack_start(GTK_BOX(session->gtk.inputbar_box),  GTK_WIDGET(session->gtk.inputbar_entry),  TRUE,  TRUE,  0);
00324   gtk_container_add(GTK_CONTAINER(session->gtk.inputbar), GTK_WIDGET(session->gtk.inputbar_box));
00325 
00326   /* tabs */
00327   gtk_notebook_set_show_border(session->gtk.tabs, FALSE);
00328   gtk_notebook_set_show_tabs(session->gtk.tabs,   FALSE);
00329 
00330   /* packing */
00331   gtk_box_pack_start(session->gtk.box, GTK_WIDGET(session->gtk.tabbar),            FALSE, FALSE, 0);
00332   gtk_box_pack_start(session->gtk.box, GTK_WIDGET(session->gtk.view),              TRUE,  TRUE, 0);
00333   gtk_box_pack_start(session->gtk.box, GTK_WIDGET(session->gtk.statusbar),         FALSE, FALSE, 0);
00334   gtk_box_pack_start(session->gtk.box, GTK_WIDGET(session->gtk.notification_area), FALSE, FALSE, 0);
00335   gtk_box_pack_end(  session->gtk.box, GTK_WIDGET(session->gtk.inputbar),          FALSE, FALSE, 0);
00336 
00337   /* parse color values */
00338   typedef struct color_setting_mapping_s
00339   {
00340     char* identifier;
00341     GdkRGBA *color;
00342   } color_setting_mapping_t;
00343 
00344   const color_setting_mapping_t color_setting_mappings[] = {
00345     {"default-fg",              &(session->style.default_foreground)},
00346     {"default-bg",              &(session->style.default_background)},
00347     {"inputbar-fg",             &(session->style.inputbar_foreground)},
00348     {"inputbar-bg",             &(session->style.inputbar_background)},
00349     {"statusbar-fg",            &(session->style.statusbar_foreground)},
00350     {"statusbar-bg",            &(session->style.statusbar_background)},
00351     {"completion-fg",           &(session->style.completion_foreground)},
00352     {"completion-bg",           &(session->style.completion_background)},
00353     {"completion-group-fg",     &(session->style.completion_group_foreground)},
00354     {"completion-group-bg",     &(session->style.completion_group_background)},
00355     {"completion-highlight-fg", &(session->style.completion_highlight_foreground)},
00356     {"completion-highlight-bg", &(session->style.completion_highlight_background)},
00357     {"notification-error-fg",   &(session->style.notification_error_foreground)},
00358     {"notification-error-bg",   &(session->style.notification_error_background)},
00359     {"notification-warning-fg", &(session->style.notification_warning_foreground)},
00360     {"notification-warning-bg", &(session->style.notification_warning_background)},
00361     {"notification-fg",         &(session->style.notification_default_foreground)},
00362     {"notification-bg",         &(session->style.notification_default_background)},
00363     {"tabbar-fg",               &(session->style.tabbar_foreground)},
00364     {"tabbar-bg",               &(session->style.tabbar_background)},
00365     {"tabbar-focus-fg",         &(session->style.tabbar_focus_foreground)},
00366     {"tabbar-focus-bg",         &(session->style.tabbar_focus_background)},
00367   };
00368 
00369   for (unsigned i = 0; i < LENGTH(color_setting_mappings); i++) {
00370     char* tmp_value = NULL;
00371     girara_setting_get(session, color_setting_mappings[i].identifier, &tmp_value);
00372     if (tmp_value != NULL) {
00373       gdk_rgba_parse(color_setting_mappings[i].color, tmp_value);
00374       g_free(tmp_value);
00375     }
00376   }
00377 
00378   /* view */
00379   gtk_widget_override_background_color(GTK_WIDGET(session->gtk.viewport),
00380       GTK_STATE_NORMAL, &(session->style.default_background));
00381 
00382   /* statusbar */
00383   gtk_widget_override_background_color(GTK_WIDGET(session->gtk.statusbar),
00384       GTK_STATE_NORMAL, &(session->style.statusbar_background));
00385 
00386   /* inputbar */
00387 #if (GTK_MAJOR_VERSION == 3)
00388   gtk_widget_override_background_color(GTK_WIDGET(session->gtk.inputbar_entry),
00389       GTK_STATE_NORMAL, &(session->style.inputbar_background));
00390   gtk_widget_override_color(GTK_WIDGET(session->gtk.inputbar_entry),
00391       GTK_STATE_NORMAL, &(session->style.inputbar_foreground));
00392 
00393   gtk_widget_override_background_color(GTK_WIDGET(session->gtk.inputbar),
00394       GTK_STATE_NORMAL, &(session->style.inputbar_background));
00395   gtk_widget_override_color(GTK_WIDGET(session->gtk.inputbar_dialog),
00396       GTK_STATE_NORMAL, &(session->style.inputbar_foreground));
00397 
00398   /* notification area */
00399   gtk_widget_override_background_color(GTK_WIDGET(session->gtk.notification_area),
00400       GTK_STATE_NORMAL, &(session->style.notification_default_background));
00401   gtk_widget_override_color(GTK_WIDGET(session->gtk.notification_text),
00402       GTK_STATE_NORMAL, &(session->style.notification_default_foreground));
00403 #else
00404   /* inputbar */
00405   gtk_widget_modify_base(GTK_WIDGET(session->gtk.inputbar_entry), GTK_STATE_NORMAL, &(session->style.inputbar_background));
00406   gtk_widget_modify_text(GTK_WIDGET(session->gtk.inputbar_entry), GTK_STATE_NORMAL, &(session->style.inputbar_foreground));
00407 
00408   gtk_widget_modify_bg(GTK_WIDGET(session->gtk.inputbar),        GTK_STATE_NORMAL, &(session->style.inputbar_background));
00409   gtk_widget_modify_fg(GTK_WIDGET(session->gtk.inputbar_dialog), GTK_STATE_NORMAL, &(session->style.inputbar_foreground));
00410 
00411   /* notification area */
00412   gtk_widget_modify_bg(GTK_WIDGET(session->gtk.notification_area),
00413     GTK_STATE_NORMAL, &(session->style.notification_default_background));
00414   gtk_widget_modify_text(GTK_WIDGET(session->gtk.notification_text),
00415     GTK_STATE_NORMAL, &(session->style.notification_default_foreground));
00416 #endif
00417 
00418   if (session->style.font == NULL) {
00419     /* set default font */
00420     girara_setting_set(session, "font", "monospace normal 9");
00421   } else {
00422     gtk_widget_override_font(GTK_WIDGET(session->gtk.inputbar_entry),    session->style.font);
00423     gtk_widget_override_font(GTK_WIDGET(session->gtk.inputbar_dialog),   session->style.font);
00424     gtk_widget_override_font(GTK_WIDGET(session->gtk.notification_text), session->style.font);
00425   }
00426 
00427   /* set window size */
00428   int window_width = 0;
00429   int window_height = 0;
00430   girara_setting_get(session, "window-width", &window_width);
00431   girara_setting_get(session, "window-height", &window_height);
00432 
00433   if (window_width > 0&& window_height > 0) {
00434     gtk_window_set_default_size(GTK_WINDOW(session->gtk.window), window_width, window_height);
00435   }
00436 
00437   gtk_widget_show_all(GTK_WIDGET(session->gtk.window));
00438   gtk_widget_hide(GTK_WIDGET(session->gtk.notification_area));
00439   gtk_widget_hide(GTK_WIDGET(session->gtk.inputbar));
00440   gtk_widget_hide(GTK_WIDGET(session->gtk.inputbar_dialog));
00441 
00442   char* window_icon = NULL;
00443   girara_setting_get(session, "window-icon", &window_icon);
00444   if (window_icon != NULL) {
00445     if (strlen(window_icon) != 0) {
00446       girara_setting_set(session, "window-icon", window_icon);
00447     }
00448     g_free(window_icon);
00449   }
00450 
00451   return TRUE;
00452 }
00453 
00454 bool
00455 girara_session_destroy(girara_session_t* session)
00456 {
00457   g_return_val_if_fail(session != NULL, FALSE);
00458 
00459   /* clean up style */
00460   pango_font_description_free(session->style.font);
00461 
00462   /* clean up shortcuts */
00463   girara_list_free(session->bindings.shortcuts);
00464   session->bindings.shortcuts = NULL;
00465 
00466   /* clean up inputbar shortcuts */
00467   girara_list_free(session->bindings.inputbar_shortcuts);
00468   session->bindings.inputbar_shortcuts = NULL;
00469 
00470   /* clean up commands */
00471   girara_list_free(session->bindings.commands);
00472   session->bindings.commands = NULL;
00473 
00474   /* clean up special commands */
00475   girara_list_free(session->bindings.special_commands);
00476   session->bindings.special_commands = NULL;
00477 
00478   /* clean up mouse events */
00479   girara_list_free(session->bindings.mouse_events);
00480   session->bindings.mouse_events = NULL;
00481 
00482   /* clean up settings */
00483   girara_list_free(session->settings);
00484   session->settings = NULL;
00485 
00486   /* clean up statusbar items */
00487   girara_list_free(session->elements.statusbar_items);
00488   session->elements.statusbar_items = NULL;
00489 
00490   /* clean up config handles */
00491   girara_list_free(session->config.handles);
00492   session->config.handles = NULL;
00493 
00494   /* clean up shortcut mappings */
00495   girara_list_free(session->config.shortcut_mappings);
00496   session->config.shortcut_mappings = NULL;
00497 
00498   /* clean up argument mappings */
00499   girara_list_free(session->config.argument_mappings);
00500   session->config.argument_mappings = NULL;
00501 
00502   /* clean up modes */
00503   girara_list_free(session->modes.identifiers);
00504   session->modes.identifiers = NULL;
00505 
00506   /* clean up buffer */
00507   if (session->buffer.command) {
00508     g_string_free(session->buffer.command, TRUE);
00509   }
00510 
00511   if (session->global.buffer) {
00512     g_string_free(session->global.buffer,  TRUE);
00513   }
00514 
00515   session->buffer.command = NULL;
00516   session->global.buffer  = NULL;
00517 
00518   /* clean up session */
00519   g_slice_free(girara_session_t, session);
00520 
00521   return TRUE;
00522 }
00523 
00524 char*
00525 girara_buffer_get(girara_session_t* session)
00526 {
00527   g_return_val_if_fail(session != NULL, NULL);
00528 
00529   return (session->global.buffer) ? g_strdup(session->global.buffer->str) : NULL;
00530 }
00531 
00532 void
00533 girara_notify(girara_session_t* session, int level, const char* format, ...)
00534 {
00535   if (session == NULL
00536       || session->gtk.notification_text == NULL
00537       || session->gtk.notification_area == NULL
00538       || session->gtk.inputbar == NULL
00539       || session->gtk.view == NULL) {
00540     return;
00541   }
00542 
00543   switch (level) {
00544     case GIRARA_ERROR:
00545       gtk_widget_override_background_color(GTK_WIDGET(session->gtk.notification_area),
00546           GTK_STATE_NORMAL, &(session->style.notification_error_background));
00547       gtk_widget_override_color(GTK_WIDGET(session->gtk.notification_text),
00548           GTK_STATE_NORMAL, &(session->style.notification_error_foreground));
00549       break;
00550     case GIRARA_WARNING:
00551       gtk_widget_override_background_color(GTK_WIDGET(session->gtk.notification_area),
00552           GTK_STATE_NORMAL, &(session->style.notification_warning_background));
00553       gtk_widget_override_color(GTK_WIDGET(session->gtk.notification_text),
00554           GTK_STATE_NORMAL, &(session->style.notification_warning_foreground));
00555       break;
00556     case GIRARA_INFO:
00557       gtk_widget_override_background_color(GTK_WIDGET(session->gtk.notification_area),
00558           GTK_STATE_NORMAL, &(session->style.notification_default_background));
00559       gtk_widget_override_color(GTK_WIDGET(session->gtk.notification_text),
00560           GTK_STATE_NORMAL, &(session->style.notification_default_foreground));
00561       break;
00562     default:
00563       return;
00564   }
00565 
00566   /* prepare message */
00567   va_list ap;
00568   va_start(ap, format);
00569   char* message = g_strdup_vprintf(format, ap);
00570   va_end(ap);
00571 
00572   gtk_label_set_markup(GTK_LABEL(session->gtk.notification_text), message);
00573   g_free(message);
00574 
00575   /* update visibility */
00576   gtk_widget_show(GTK_WIDGET(session->gtk.notification_area));
00577   gtk_widget_hide(GTK_WIDGET(session->gtk.inputbar));
00578 
00579   gtk_widget_grab_focus(GTK_WIDGET(session->gtk.view));
00580 }
00581 
00582 void girara_dialog(girara_session_t* session, const char* dialog, bool
00583     invisible, girara_callback_inputbar_key_press_event_t key_press_event,
00584     girara_callback_inputbar_activate_t activate_event, void* data)
00585 {
00586   if (session == NULL || session->gtk.inputbar == NULL
00587       || session->gtk.inputbar_dialog == NULL
00588       || session->gtk.inputbar_entry == NULL) {
00589     return;
00590   }
00591 
00592   gtk_widget_show(GTK_WIDGET(session->gtk.inputbar_dialog));
00593 
00594   /* set dialog message */
00595   if (dialog != NULL) {
00596     gtk_label_set_markup(session->gtk.inputbar_dialog, dialog);
00597   }
00598 
00599   /* set input visibility */
00600   if (invisible == true) {
00601     gtk_entry_set_visibility(session->gtk.inputbar_entry, FALSE);
00602   } else {
00603     gtk_entry_set_visibility(session->gtk.inputbar_entry, TRUE);
00604   }
00605 
00606   /* set handler */
00607   session->signals.inputbar_custom_activate        = activate_event;
00608   session->signals.inputbar_custom_key_press_event = key_press_event;
00609   session->signals.inputbar_custom_data            = data;
00610 
00611   /* focus inputbar */
00612   girara_sc_focus_inputbar(session, NULL, NULL, 0);
00613 }
00614 
00615 bool
00616 girara_set_view(girara_session_t* session, GtkWidget* widget)
00617 {
00618   g_return_val_if_fail(session != NULL, false);
00619 
00620   GtkWidget* child = gtk_bin_get_child(GTK_BIN(session->gtk.viewport));
00621 
00622   if (child) {
00623     g_object_ref(child);
00624     gtk_container_remove(GTK_CONTAINER(session->gtk.viewport), child);
00625   }
00626 
00627   gtk_container_add(GTK_CONTAINER(session->gtk.viewport), widget);
00628   gtk_widget_show_all(widget);
00629 
00630   return true;
00631 }
00632 
00633 void
00634 girara_mode_set(girara_session_t* session, girara_mode_t mode)
00635 {
00636   g_return_if_fail(session != NULL);
00637 
00638   session->modes.current_mode = mode;
00639 }
00640 
00641 girara_mode_t
00642 girara_mode_add(girara_session_t* session, const char* name)
00643 {
00644   g_return_val_if_fail(session  != NULL, FALSE);
00645   g_return_val_if_fail(name != NULL && name[0] != 0x0, FALSE);
00646 
00647   girara_mode_t last_index = 0;
00648   GIRARA_LIST_FOREACH(session->modes.identifiers, girara_mode_string_t*, iter, mode)
00649     if (mode->index > last_index) {
00650       last_index = mode->index;
00651     }
00652   GIRARA_LIST_FOREACH_END(session->modes.identifiers, girara_mode_string_t*, iter, mode);
00653 
00654   /* create new mode identifier */
00655   girara_mode_string_t* mode = g_slice_new(girara_mode_string_t);
00656   mode->index = last_index + 1;
00657   mode->name = g_strdup(name);
00658   girara_list_append(session->modes.identifiers, mode);
00659 
00660   return mode->index;
00661 }
00662 
00663 void
00664 girara_mode_string_free(girara_mode_string_t* mode)
00665 {
00666   if (!mode) {
00667     return;
00668   }
00669 
00670   g_free(mode->name);
00671   g_slice_free(girara_mode_string_t, mode);
00672 }
00673 
00674 girara_mode_t
00675 girara_mode_get(girara_session_t* session)
00676 {
00677   g_return_val_if_fail(session != NULL, 0);
00678 
00679   return session->modes.current_mode;
00680 }
00681 
00682 bool
00683 girara_set_window_title(girara_session_t* session, const char* name)
00684 {
00685   if (session == NULL || session->gtk.window == NULL || name == NULL) {
00686     return false;
00687   }
00688 
00689   gtk_window_set_title(GTK_WINDOW(session->gtk.window), name);
00690 
00691   return true;
00692 }
00693 
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Defines