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