girara
|
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