girara
.pc/update-translations/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 foeground 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   session->gtk.box               = GTK_BOX(gtk_vbox_new(FALSE, 0));
00208   session->gtk.view              = gtk_scrolled_window_new(NULL, NULL);
00209   session->gtk.viewport          = gtk_viewport_new(NULL, NULL);
00210   session->gtk.statusbar         = gtk_event_box_new();
00211   session->gtk.statusbar_entries = GTK_BOX(gtk_hbox_new(FALSE, 0));
00212   session->gtk.notification_area = gtk_event_box_new();
00213   session->gtk.notification_text = gtk_label_new(NULL);
00214   session->gtk.tabbar            = gtk_hbox_new(TRUE, 0);
00215   session->gtk.inputbar_box      = GTK_BOX(gtk_hbox_new(TRUE, 0));
00216   session->gtk.inputbar_dialog   = GTK_LABEL(gtk_label_new(NULL));
00217   session->gtk.inputbar_entry    = GTK_ENTRY(gtk_entry_new());
00218   session->gtk.inputbar          = gtk_event_box_new();
00219   session->gtk.tabs              = GTK_NOTEBOOK(gtk_notebook_new());
00220 
00221   /* window */
00222   GdkGeometry hints = {
00223     .base_height = 1,
00224     .base_width  = 1,
00225     .height_inc  = 0,
00226     .max_aspect  = 0,
00227     .max_height  = 0,
00228     .max_width   = 0,
00229     .min_aspect  = 0,
00230     .min_height  = 0,
00231     .min_width   = 0,
00232     .width_inc   = 0
00233   };
00234 
00235   gtk_window_set_geometry_hints(GTK_WINDOW(session->gtk.window), NULL, &hints, GDK_HINT_MIN_SIZE);
00236 
00237 #if (GTK_MAJOR_VERSION == 3)
00238   gtk_window_set_has_resize_grip(GTK_WINDOW(session->gtk.window), FALSE);
00239 #endif
00240 
00241   /* view */
00242   session->signals.view_key_pressed = g_signal_connect(G_OBJECT(session->gtk.view), "key-press-event",
00243       G_CALLBACK(girara_callback_view_key_press_event), session);
00244 
00245   session->signals.view_button_press_event = g_signal_connect(G_OBJECT(session->gtk.view), "button-press-event",
00246       G_CALLBACK(girara_callback_view_button_press_event), session);
00247 
00248   session->signals.view_button_release_event = g_signal_connect(G_OBJECT(session->gtk.view), "button-release-event",
00249       G_CALLBACK(girara_callback_view_button_release_event), session);
00250 
00251   session->signals.view_motion_notify_event = g_signal_connect(G_OBJECT(session->gtk.view), "motion-notify-event",
00252       G_CALLBACK(girara_callback_view_button_motion_notify_event), session);
00253 
00254   session->signals.view_key_pressed = g_signal_connect(G_OBJECT(session->gtk.view), "scroll-event",
00255       G_CALLBACK(girara_callback_view_scroll_event), session);
00256 
00257   bool tmp_bool_value = false;
00258   girara_setting_get(session, "show-scrollbars", &tmp_bool_value);
00259   if (tmp_bool_value == true) {
00260     gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(session->gtk.view),
00261         GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
00262   } else {
00263     gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(session->gtk.view),
00264         GTK_POLICY_NEVER, GTK_POLICY_NEVER);
00265   }
00266 
00267   /* viewport */
00268   gtk_container_add(GTK_CONTAINER(session->gtk.view), session->gtk.viewport);
00269   gtk_viewport_set_shadow_type(GTK_VIEWPORT(session->gtk.viewport), GTK_SHADOW_NONE);
00270 
00271   /* box */
00272   gtk_box_set_spacing(session->gtk.box, 0);
00273   gtk_container_add(GTK_CONTAINER(session->gtk.window), GTK_WIDGET(session->gtk.box));
00274 
00275   /* statusbar */
00276   gtk_container_add(GTK_CONTAINER(session->gtk.statusbar), GTK_WIDGET(session->gtk.statusbar_entries));
00277 
00278   /* notification area */
00279   gtk_container_add(GTK_CONTAINER(session->gtk.notification_area), GTK_WIDGET(session->gtk.notification_text));
00280   gtk_misc_set_alignment(GTK_MISC(session->gtk.notification_text), 0.0, 0.0);
00281   gtk_misc_set_padding(GTK_MISC(session->gtk.notification_text), 2, 2);
00282   gtk_label_set_use_markup(GTK_LABEL(session->gtk.notification_text), TRUE);
00283 
00284   /* inputbar */
00285   gtk_entry_set_inner_border(session->gtk.inputbar_entry, NULL);
00286   gtk_entry_set_has_frame(session->gtk.inputbar_entry, FALSE);
00287   gtk_editable_set_editable(GTK_EDITABLE(session->gtk.inputbar_entry), TRUE);
00288 
00289   session->signals.inputbar_key_pressed = g_signal_connect(
00290       G_OBJECT(session->gtk.inputbar_entry),
00291       "key-press-event",
00292       G_CALLBACK(girara_callback_inputbar_key_press_event),
00293       session
00294     );
00295 
00296   session->signals.inputbar_changed = g_signal_connect(
00297       G_OBJECT(session->gtk.inputbar_entry),
00298       "changed",
00299       G_CALLBACK(girara_callback_inputbar_changed_event),
00300       session
00301     );
00302 
00303   session->signals.inputbar_activate = g_signal_connect(
00304       G_OBJECT(session->gtk.inputbar_entry),
00305       "activate",
00306       G_CALLBACK(girara_callback_inputbar_activate),
00307       session
00308     );
00309 
00310   gtk_box_set_homogeneous(session->gtk.inputbar_box, FALSE);
00311   gtk_box_set_spacing(session->gtk.inputbar_box, 5);
00312 
00313   gtk_box_pack_start(GTK_BOX(session->gtk.inputbar_box),  GTK_WIDGET(session->gtk.inputbar_dialog), FALSE, FALSE, 0);
00314   gtk_box_pack_start(GTK_BOX(session->gtk.inputbar_box),  GTK_WIDGET(session->gtk.inputbar_entry),  TRUE,  TRUE,  0);
00315   gtk_container_add(GTK_CONTAINER(session->gtk.inputbar), GTK_WIDGET(session->gtk.inputbar_box));
00316 
00317   /* tabs */
00318   gtk_notebook_set_show_border(session->gtk.tabs, FALSE);
00319   gtk_notebook_set_show_tabs(session->gtk.tabs,   FALSE);
00320 
00321   /* packing */
00322   gtk_box_pack_start(session->gtk.box, GTK_WIDGET(session->gtk.tabbar),            FALSE, FALSE, 0);
00323   gtk_box_pack_start(session->gtk.box, GTK_WIDGET(session->gtk.view),              TRUE,  TRUE, 0);
00324   gtk_box_pack_start(session->gtk.box, GTK_WIDGET(session->gtk.statusbar),         FALSE, FALSE, 0);
00325   gtk_box_pack_start(session->gtk.box, GTK_WIDGET(session->gtk.notification_area), FALSE, FALSE, 0);
00326   gtk_box_pack_end(  session->gtk.box, GTK_WIDGET(session->gtk.inputbar),          FALSE, FALSE, 0);
00327 
00328   /* parse color values */
00329   typedef struct color_setting_mapping_s
00330   {
00331     char* identifier;
00332     GdkRGBA *color;
00333   } color_setting_mapping_t;
00334 
00335   const color_setting_mapping_t color_setting_mappings[] = {
00336     {"default-fg",              &(session->style.default_foreground)},
00337     {"default-bg",              &(session->style.default_background)},
00338     {"inputbar-fg",             &(session->style.inputbar_foreground)},
00339     {"inputbar-bg",             &(session->style.inputbar_background)},
00340     {"statusbar-fg",            &(session->style.statusbar_foreground)},
00341     {"statusbar-bg",            &(session->style.statusbar_background)},
00342     {"completion-fg",           &(session->style.completion_foreground)},
00343     {"completion-bg",           &(session->style.completion_background)},
00344     {"completion-group-fg",     &(session->style.completion_group_foreground)},
00345     {"completion-group-bg",     &(session->style.completion_group_background)},
00346     {"completion-highlight-fg", &(session->style.completion_highlight_foreground)},
00347     {"completion-highlight-bg", &(session->style.completion_highlight_background)},
00348     {"notification-error-fg",   &(session->style.notification_error_foreground)},
00349     {"notification-error-bg",   &(session->style.notification_error_background)},
00350     {"notification-warning-fg", &(session->style.notification_warning_foreground)},
00351     {"notification-warning-bg", &(session->style.notification_warning_background)},
00352     {"notification-fg",         &(session->style.notification_default_foreground)},
00353     {"notification-bg",         &(session->style.notification_default_background)},
00354     {"tabbar-fg",               &(session->style.tabbar_foreground)},
00355     {"tabbar-bg",               &(session->style.tabbar_background)},
00356     {"tabbar-focus-fg",         &(session->style.tabbar_focus_foreground)},
00357     {"tabbar-focus-bg",         &(session->style.tabbar_focus_background)},
00358   };
00359 
00360   for (unsigned i = 0; i < LENGTH(color_setting_mappings); i++) {
00361     char* tmp_value = NULL;
00362     girara_setting_get(session, color_setting_mappings[i].identifier, &tmp_value);
00363     if (tmp_value != NULL) {
00364       gdk_rgba_parse(color_setting_mappings[i].color, tmp_value);
00365       g_free(tmp_value);
00366     }
00367   }
00368 
00369   /* view */
00370   gtk_widget_override_background_color(GTK_WIDGET(session->gtk.viewport),
00371       GTK_STATE_NORMAL, &(session->style.default_background));
00372 
00373   /* statusbar */
00374   gtk_widget_override_background_color(GTK_WIDGET(session->gtk.statusbar),
00375       GTK_STATE_NORMAL, &(session->style.statusbar_background));
00376 
00377   /* inputbar */
00378 #if (GTK_MAJOR_VERSION == 3)
00379   gtk_widget_override_background_color(GTK_WIDGET(session->gtk.inputbar_entry),
00380       GTK_STATE_NORMAL, &(session->style.inputbar_background));
00381   gtk_widget_override_color(GTK_WIDGET(session->gtk.inputbar_entry),
00382       GTK_STATE_NORMAL, &(session->style.inputbar_foreground));
00383 
00384   gtk_widget_override_background_color(GTK_WIDGET(session->gtk.inputbar),
00385       GTK_STATE_NORMAL, &(session->style.inputbar_background));
00386   gtk_widget_override_color(GTK_WIDGET(session->gtk.inputbar_dialog),
00387       GTK_STATE_NORMAL, &(session->style.inputbar_foreground));
00388 
00389   /* notification area */
00390   gtk_widget_override_background_color(GTK_WIDGET(session->gtk.notification_area),
00391       GTK_STATE_NORMAL, &(session->style.notification_default_background));
00392   gtk_widget_override_color(GTK_WIDGET(session->gtk.notification_text),
00393       GTK_STATE_NORMAL, &(session->style.notification_default_foreground));
00394 #else
00395   /* inputbar */
00396   gtk_widget_modify_base(GTK_WIDGET(session->gtk.inputbar_entry), GTK_STATE_NORMAL, &(session->style.inputbar_background));
00397   gtk_widget_modify_text(GTK_WIDGET(session->gtk.inputbar_entry), GTK_STATE_NORMAL, &(session->style.inputbar_foreground));
00398 
00399   gtk_widget_modify_bg(GTK_WIDGET(session->gtk.inputbar),        GTK_STATE_NORMAL, &(session->style.inputbar_background));
00400   gtk_widget_modify_fg(GTK_WIDGET(session->gtk.inputbar_dialog), GTK_STATE_NORMAL, &(session->style.inputbar_foreground));
00401 
00402   /* notification area */
00403   gtk_widget_modify_bg(GTK_WIDGET(session->gtk.notification_area),
00404     GTK_STATE_NORMAL, &(session->style.notification_default_background));
00405   gtk_widget_modify_text(GTK_WIDGET(session->gtk.notification_text),
00406     GTK_STATE_NORMAL, &(session->style.notification_default_foreground));
00407 #endif
00408 
00409   if (session->style.font == NULL) {
00410     /* set default font */
00411     girara_setting_set(session, "font", "monospace normal 9");
00412   } else {
00413     gtk_widget_override_font(GTK_WIDGET(session->gtk.inputbar_entry),    session->style.font);
00414     gtk_widget_override_font(GTK_WIDGET(session->gtk.inputbar_dialog),   session->style.font);
00415     gtk_widget_override_font(GTK_WIDGET(session->gtk.notification_text), session->style.font);
00416   }
00417 
00418   /* set window size */
00419   int window_width = 0;
00420   int window_height = 0;
00421   girara_setting_get(session, "window-width", &window_width);
00422   girara_setting_get(session, "window-height", &window_height);
00423 
00424   if (window_width > 0&& window_height > 0) {
00425     gtk_window_set_default_size(GTK_WINDOW(session->gtk.window), window_width, window_height);
00426   }
00427 
00428   gtk_widget_show_all(GTK_WIDGET(session->gtk.window));
00429   gtk_widget_hide(GTK_WIDGET(session->gtk.notification_area));
00430   gtk_widget_hide(GTK_WIDGET(session->gtk.inputbar));
00431   gtk_widget_hide(GTK_WIDGET(session->gtk.inputbar_dialog));
00432 
00433   char* window_icon = NULL;
00434   girara_setting_get(session, "window-icon", &window_icon);
00435   if (window_icon != NULL) {
00436     if (strlen(window_icon) != 0) {
00437       girara_setting_set(session, "window-icon", window_icon);
00438     }
00439     g_free(window_icon);
00440   }
00441 
00442   return TRUE;
00443 }
00444 
00445 bool
00446 girara_session_destroy(girara_session_t* session)
00447 {
00448   g_return_val_if_fail(session != NULL, FALSE);
00449 
00450   /* clean up style */
00451   pango_font_description_free(session->style.font);
00452 
00453   /* clean up shortcuts */
00454   girara_list_free(session->bindings.shortcuts);
00455   session->bindings.shortcuts = NULL;
00456 
00457   /* clean up inputbar shortcuts */
00458   girara_list_free(session->bindings.inputbar_shortcuts);
00459   session->bindings.inputbar_shortcuts = NULL;
00460 
00461   /* clean up commands */
00462   girara_list_free(session->bindings.commands);
00463   session->bindings.commands = NULL;
00464 
00465   /* clean up special commands */
00466   girara_list_free(session->bindings.special_commands);
00467   session->bindings.special_commands = NULL;
00468 
00469   /* clean up mouse events */
00470   girara_list_free(session->bindings.mouse_events);
00471   session->bindings.mouse_events = NULL;
00472 
00473   /* clean up settings */
00474   girara_list_free(session->settings);
00475   session->settings = NULL;
00476 
00477   /* clean up statusbar items */
00478   girara_list_free(session->elements.statusbar_items);
00479   session->elements.statusbar_items = NULL;
00480 
00481   /* clean up config handles */
00482   girara_list_free(session->config.handles);
00483   session->config.handles = NULL;
00484 
00485   /* clean up shortcut mappings */
00486   girara_list_free(session->config.shortcut_mappings);
00487   session->config.shortcut_mappings = NULL;
00488 
00489   /* clean up argument mappings */
00490   girara_list_free(session->config.argument_mappings);
00491   session->config.argument_mappings = NULL;
00492 
00493   /* clean up modes */
00494   girara_list_free(session->modes.identifiers);
00495   session->modes.identifiers = NULL;
00496 
00497   /* clean up buffer */
00498   if (session->buffer.command) {
00499     g_string_free(session->buffer.command, TRUE);
00500   }
00501 
00502   if (session->global.buffer) {
00503     g_string_free(session->global.buffer,  TRUE);
00504   }
00505 
00506   session->buffer.command = NULL;
00507   session->global.buffer  = NULL;
00508 
00509   /* clean up session */
00510   g_slice_free(girara_session_t, session);
00511 
00512   return TRUE;
00513 }
00514 
00515 char*
00516 girara_buffer_get(girara_session_t* session)
00517 {
00518   g_return_val_if_fail(session != NULL, NULL);
00519 
00520   return (session->global.buffer) ? g_strdup(session->global.buffer->str) : NULL;
00521 }
00522 
00523 void
00524 girara_notify(girara_session_t* session, int level, const char* format, ...)
00525 {
00526   if (session == NULL
00527       || session->gtk.notification_text == NULL
00528       || session->gtk.notification_area == NULL
00529       || session->gtk.inputbar == NULL
00530       || session->gtk.view == NULL) {
00531     return;
00532   }
00533 
00534   switch (level) {
00535     case GIRARA_ERROR:
00536       gtk_widget_override_background_color(GTK_WIDGET(session->gtk.notification_area),
00537           GTK_STATE_NORMAL, &(session->style.notification_error_background));
00538       gtk_widget_override_color(GTK_WIDGET(session->gtk.notification_text),
00539           GTK_STATE_NORMAL, &(session->style.notification_error_foreground));
00540       break;
00541     case GIRARA_WARNING:
00542       gtk_widget_override_background_color(GTK_WIDGET(session->gtk.notification_area),
00543           GTK_STATE_NORMAL, &(session->style.notification_warning_background));
00544       gtk_widget_override_color(GTK_WIDGET(session->gtk.notification_text),
00545           GTK_STATE_NORMAL, &(session->style.notification_warning_foreground));
00546       break;
00547     case GIRARA_INFO:
00548       gtk_widget_override_background_color(GTK_WIDGET(session->gtk.notification_area),
00549           GTK_STATE_NORMAL, &(session->style.notification_default_background));
00550       gtk_widget_override_color(GTK_WIDGET(session->gtk.notification_text),
00551           GTK_STATE_NORMAL, &(session->style.notification_default_foreground));
00552       break;
00553     default:
00554       return;
00555   }
00556 
00557   /* prepare message */
00558   va_list ap;
00559   va_start(ap, format);
00560   char* message = g_strdup_vprintf(format, ap);
00561   va_end(ap);
00562 
00563   gtk_label_set_markup(GTK_LABEL(session->gtk.notification_text), message);
00564   g_free(message);
00565 
00566   /* update visibility */
00567   gtk_widget_show(GTK_WIDGET(session->gtk.notification_area));
00568   gtk_widget_hide(GTK_WIDGET(session->gtk.inputbar));
00569 
00570   gtk_widget_grab_focus(GTK_WIDGET(session->gtk.view));
00571 }
00572 
00573 void girara_dialog(girara_session_t* session, const char* dialog, bool
00574     invisible, girara_callback_inputbar_key_press_event_t key_press_event,
00575     girara_callback_inputbar_activate_t activate_event, void* data)
00576 {
00577   if (session == NULL || session->gtk.inputbar == NULL
00578       || session->gtk.inputbar_dialog == NULL
00579       || session->gtk.inputbar_entry == NULL) {
00580     return;
00581   }
00582 
00583   gtk_widget_show(GTK_WIDGET(session->gtk.inputbar_dialog));
00584 
00585   /* set dialog message */
00586   if (dialog != NULL) {
00587     gtk_label_set_markup(session->gtk.inputbar_dialog, dialog);
00588   }
00589 
00590   /* set input visibility */
00591   if (invisible == true) {
00592     gtk_entry_set_visibility(session->gtk.inputbar_entry, FALSE);
00593   } else {
00594     gtk_entry_set_visibility(session->gtk.inputbar_entry, TRUE);
00595   }
00596 
00597   /* set handler */
00598   session->signals.inputbar_custom_activate        = activate_event;
00599   session->signals.inputbar_custom_key_press_event = key_press_event;
00600   session->signals.inputbar_custom_data            = data;
00601 
00602   /* focus inputbar */
00603   girara_sc_focus_inputbar(session, NULL, NULL, 0);
00604 }
00605 
00606 bool
00607 girara_set_view(girara_session_t* session, GtkWidget* widget)
00608 {
00609   g_return_val_if_fail(session != NULL, false);
00610 
00611   GtkWidget* child = gtk_bin_get_child(GTK_BIN(session->gtk.viewport));
00612 
00613   if (child) {
00614     g_object_ref(child);
00615     gtk_container_remove(GTK_CONTAINER(session->gtk.viewport), child);
00616   }
00617 
00618   gtk_container_add(GTK_CONTAINER(session->gtk.viewport), widget);
00619   gtk_widget_show_all(widget);
00620 
00621   return true;
00622 }
00623 
00624 void
00625 girara_mode_set(girara_session_t* session, girara_mode_t mode)
00626 {
00627   g_return_if_fail(session != NULL);
00628 
00629   session->modes.current_mode = mode;
00630 }
00631 
00632 girara_mode_t
00633 girara_mode_add(girara_session_t* session, const char* name)
00634 {
00635   g_return_val_if_fail(session  != NULL, FALSE);
00636   g_return_val_if_fail(name != NULL && name[0] != 0x0, FALSE);
00637 
00638   girara_mode_t last_index = 0;
00639   GIRARA_LIST_FOREACH(session->modes.identifiers, girara_mode_string_t*, iter, mode)
00640     if (mode->index > last_index) {
00641       last_index = mode->index;
00642     }
00643   GIRARA_LIST_FOREACH_END(session->modes.identifiers, girara_mode_string_t*, iter, mode);
00644 
00645   /* create new mode identifier */
00646   girara_mode_string_t* mode = g_slice_new(girara_mode_string_t);
00647   mode->index = last_index + 1;
00648   mode->name = g_strdup(name);
00649   girara_list_append(session->modes.identifiers, mode);
00650 
00651   return mode->index;
00652 }
00653 
00654 void
00655 girara_mode_string_free(girara_mode_string_t* mode)
00656 {
00657   if (!mode) {
00658     return;
00659   }
00660 
00661   g_free(mode->name);
00662   g_slice_free(girara_mode_string_t, mode);
00663 }
00664 
00665 girara_mode_t
00666 girara_mode_get(girara_session_t* session)
00667 {
00668   g_return_val_if_fail(session != NULL, 0);
00669 
00670   return session->modes.current_mode;
00671 }
00672 
00673 bool
00674 girara_set_window_title(girara_session_t* session, const char* name)
00675 {
00676   if (session == NULL || session->gtk.window == NULL || name == NULL) {
00677     return false;
00678   }
00679 
00680   gtk_window_set_title(GTK_WINDOW(session->gtk.window), name);
00681 
00682   return true;
00683 }
00684 
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Defines