5 #include <glib/gi18n-lib.h>
16 #define COMMENT_PREFIX "\"#"
19 cb_window_icon(girara_session_t* session,
const char*
UNUSED(name),
22 g_return_if_fail(session != NULL && value != NULL);
24 if (session->gtk.window != NULL) {
28 gtk_window_set_icon_from_file(GTK_WINDOW(session->gtk.window), path, &error);
30 girara_error(
"failed to load window icon: %s", error->message);
39 cb_font(girara_session_t* session,
const char*
UNUSED(name),
42 g_return_if_fail(session != NULL && value != NULL);
44 pango_font_description_free(session->style.font);
47 PangoFontDescription* font = pango_font_description_from_string(value);
48 session->style.font = font;
51 if (session->gtk.inputbar_entry != NULL) {
52 gtk_widget_override_font(GTK_WIDGET(session->gtk.inputbar_entry), font);
55 if (session->gtk.inputbar_dialog != NULL) {
56 gtk_widget_override_font(GTK_WIDGET(session->gtk.inputbar_dialog), font);
60 if (session->gtk.notification_text != NULL) {
61 gtk_widget_override_font(GTK_WIDGET(session->gtk.notification_text), font);
64 GIRARA_LIST_FOREACH(session->elements.statusbar_items, girara_statusbar_item_t *, iter, item)
66 gtk_widget_override_font(GTK_WIDGET(item->text), font);
72 cb_guioptions(girara_session_t* session,
const char*
UNUSED(name),
75 g_return_if_fail(session != NULL && value != NULL);
78 bool show_commandline =
false;
79 bool show_statusbar =
false;
80 bool show_hscrollbar =
false;
81 bool show_vscrollbar =
false;
84 char* input = (
char*) value;
85 const size_t input_length = strlen(input);
87 for (
size_t i = 0; i < input_length; i++) {
91 show_commandline =
true;
95 show_statusbar =
true;
98 show_hscrollbar =
true;
101 show_vscrollbar =
true;
107 if (show_commandline ==
true) {
108 session->global.autohide_inputbar =
false;
109 gtk_widget_show(session->gtk.inputbar);
111 session->global.autohide_inputbar =
true;
112 gtk_widget_hide(session->gtk.inputbar);
115 if (show_statusbar ==
true) {
116 session->global.hide_statusbar =
false;
117 gtk_widget_show(session->gtk.statusbar);
119 session->global.hide_statusbar =
true;
120 gtk_widget_hide(session->gtk.statusbar);
123 GtkWidget* vscrollbar = gtk_scrolled_window_get_vscrollbar(GTK_SCROLLED_WINDOW(session->gtk.view));
124 GtkWidget* hscrollbar = gtk_scrolled_window_get_hscrollbar(GTK_SCROLLED_WINDOW(session->gtk.view));
126 if (vscrollbar != NULL) {
127 gtk_widget_set_visible(vscrollbar, show_vscrollbar);
130 if (hscrollbar != NULL) {
131 gtk_widget_set_visible(hscrollbar, show_hscrollbar);
136 cb_scrollbars(girara_session_t* session,
const char* name,
139 g_return_if_fail(session != NULL && value != NULL);
141 const bool val = *(
bool*) value;
143 char* guioptions = NULL;
145 g_return_if_fail(guioptions != NULL);
147 bool show_hscrollbar = strchr(guioptions,
'h') != NULL;
148 bool show_vscrollbar = strchr(guioptions,
'v') != NULL;
150 if (strcmp(name,
"show-scrollbars") == 0) {
151 show_hscrollbar = show_vscrollbar = val;
152 }
else if (strcmp(name,
"show-h-scrollbar") == 0) {
153 show_hscrollbar = val;
154 }
else if (strcmp(name,
"show-v-scrollbar") == 0) {
155 show_vscrollbar = val;
158 const size_t guioptions_len = strlen(guioptions);
159 char* new_guioptions = g_try_malloc0(
sizeof(
char) * (guioptions_len + 3));
160 char* iterator = new_guioptions;
161 if (new_guioptions == NULL) {
167 for (
size_t i = 0; i != guioptions_len; ++i) {
168 if (guioptions[i] !=
'h' && guioptions[i] !=
'v') {
169 *iterator = guioptions[i];
175 if (show_hscrollbar ==
true) {
179 if (show_vscrollbar ==
true) {
185 g_free(new_guioptions);
191 if (session == NULL) {
196 int statusbar_h_padding = 8;
197 int statusbar_v_padding = 2;
198 int window_width = 800;
199 int window_height = 600;
200 int n_completion_items = 15;
201 bool show_scrollbars =
false;
205 session->global.autohide_inputbar =
true;
215 girara_setting_add(session,
"completion-fg",
"#DDDDDD",
STRING, TRUE, _(
"Completion foreground color"), NULL, NULL);
216 girara_setting_add(session,
"completion-bg",
"#232323",
STRING, TRUE, _(
"Completion background color"), NULL, NULL);
217 girara_setting_add(session,
"completion-group-fg",
"#DEDEDE",
STRING, TRUE, _(
"Completion group foreground color"), NULL, NULL);
218 girara_setting_add(session,
"completion-group-bg",
"#000000",
STRING, TRUE, _(
"Completion group background color"), NULL, NULL);
219 girara_setting_add(session,
"completion-highlight-fg",
"#232323",
STRING, TRUE, _(
"Completion highlight foreground color"), NULL, NULL);
220 girara_setting_add(session,
"completion-highlight-bg",
"#9FBC00",
STRING, TRUE, _(
"Completion highlight background color"), NULL, NULL);
221 girara_setting_add(session,
"notification-error-fg",
"#FFFFFF",
STRING, TRUE, _(
"Error notification foreground color"), NULL, NULL);
222 girara_setting_add(session,
"notification-error-bg",
"#FF1212",
STRING, TRUE, _(
"Error notification background color"), NULL, NULL);
223 girara_setting_add(session,
"notification-warning-fg",
"#000000",
STRING, TRUE, _(
"Warning notification foreground color"), NULL, NULL);
224 girara_setting_add(session,
"notification-warning-bg",
"#F3F000",
STRING, TRUE, _(
"Warning notifaction background color"), NULL, NULL);
225 girara_setting_add(session,
"notification-fg",
"#000000",
STRING, TRUE, _(
"Notification foreground color"), NULL, NULL);
226 girara_setting_add(session,
"notification-bg",
"#FFFFFF",
STRING, TRUE, _(
"Notification background color"), NULL, NULL);
229 girara_setting_add(session,
"tabbar-focus-fg",
"#9FBC00",
STRING, TRUE, _(
"Tab bar foreground color (active)"), NULL, NULL);
230 girara_setting_add(session,
"tabbar-focus-bg",
"#000000",
STRING, TRUE, _(
"Tab bar background color (active)"), NULL, NULL);
232 girara_setting_add(session,
"window-width", &window_width,
INT, TRUE, _(
"Initial window width"), NULL, NULL);
233 girara_setting_add(session,
"window-height", &window_height,
INT, TRUE, _(
"Initial window height"), NULL, NULL);
234 girara_setting_add(session,
"statusbar-h-padding", &statusbar_h_padding,
INT, TRUE, _(
"Horizontal padding for the status input and notification bars"), NULL, NULL);
235 girara_setting_add(session,
"statusbar-v-padding", &statusbar_v_padding,
INT, TRUE, _(
"Vertical padding for the status input and notification bars"), NULL, NULL);
236 girara_setting_add(session,
"n-completion-items", &n_completion_items,
INT, TRUE, _(
"Number of completion items"), NULL, NULL);
237 girara_setting_add(session,
"show-scrollbars", &show_scrollbars,
BOOLEAN, FALSE, _(
"Show both the horizontal and vertical scrollbars"), cb_scrollbars, NULL);
238 girara_setting_add(session,
"show-h-scrollbar", &show_scrollbars,
BOOLEAN, FALSE, _(
"Show the horizontal scrollbar"), cb_scrollbars, NULL);
239 girara_setting_add(session,
"show-v-scrollbar", &show_scrollbars,
BOOLEAN, FALSE, _(
"Show the vertical scrollbar"), cb_scrollbars, NULL);
242 girara_setting_add(session,
"guioptions",
"s",
STRING, FALSE, _(
"Show or hide certain GUI elements"), cb_guioptions, NULL);
301 g_return_val_if_fail(session != NULL,
false);
302 g_return_val_if_fail(identifier != NULL,
false);
306 if (strcmp(data->identifier, identifier) == 0) {
307 data->handle = handle;
314 girara_config_handle_t* config_handle = g_slice_new(girara_config_handle_t);
316 config_handle->identifier = g_strdup(identifier);
317 config_handle->handle = handle;
326 if (handle == NULL) {
330 g_free(handle->identifier);
331 g_slice_free(girara_config_handle_t, handle);
335 config_parse(girara_session_t* session,
const char* path)
346 unsigned int line_number = 1;
349 if (strlen(line) == 0 || strchr(
COMMENT_PREFIX, line[0]) != NULL) {
358 if (argument_list == NULL) {
365 if (g_shell_parse_argv(line, &argc, &argv, NULL) != FALSE) {
366 for(
int i = 1; i < argc; i++) {
367 char* argument = g_strdup(argv[i]);
378 if (strcmp(argv[0],
"include") == 0) {
380 girara_warning(
"Could not process line %d in '%s': usage: include path.", line_number, path);
382 char* newpath = NULL;
383 if (g_path_is_absolute(argv[1]) == TRUE) {
384 newpath = g_strdup(argv[1]);
386 char* basename = g_path_get_dirname(path);
387 char* tmp = g_build_filename(basename, argv[1], NULL);
393 if (strcmp(newpath, path) == 0) {
394 girara_warning(
"Could not process line %d in '%s': trying to include itself.", line_number, path);
397 if (config_parse(session, newpath) == FALSE) {
398 girara_warning(
"Could not process line %d in '%s': failed to load '%s'.", line_number, path, newpath);
405 girara_config_handle_t* handle = NULL;
408 if (strcmp(handle->identifier, argv[0]) == 0) {
409 handle->handle(session, argument_list);
416 if (handle == NULL) {
417 girara_warning(
"Could not process line %d in '%s': Unknown handle '%s'", line_number, path, argv[0]);
434 config_parse(session, path);
bool girara_shortcut_add(girara_session_t *session, guint modifier, guint key, const char *buffer, girara_shortcut_function_t function, girara_mode_t mode, int argument_n, void *argument_data)
void girara_config_handle_free(girara_config_handle_t *handle)
bool girara_setting_add(girara_session_t *session, const char *name, void *value, girara_setting_type_t type, bool init_only, const char *description, girara_setting_callback_t callback, void *data)
bool girara_sc_abort(girara_session_t *session, girara_argument_t *UNUSED(argument), girara_event_t *UNUSED(event), unsigned int UNUSED(t))
HIDDEN girara_completion_t * girara_cc_set(girara_session_t *session, const char *input)
#define girara_debug(...)
void girara_list_append(girara_list_t *list, void *data)
bool girara_sc_tab_navigate_prev(girara_session_t *session, girara_argument_t *argument, girara_event_t *event, unsigned int t)
FILE * girara_file_open(const char *path, const char *mode)
bool girara_sc_tab_navigate(girara_session_t *session, girara_argument_t *argument, girara_event_t *UNUSED(event), unsigned int t)
HIDDEN bool girara_sc_feedkeys(girara_session_t *session, girara_argument_t *argument, girara_event_t *event, unsigned int t)
bool girara_cmd_exec(girara_session_t *session, girara_list_t *argument_list)
bool girara_sc_focus_inputbar(girara_session_t *session, girara_argument_t *argument, girara_event_t *UNUSED(event), unsigned int UNUSED(t))
void girara_list_free(girara_list_t *list)
void girara_list_set_free_function(girara_list_t *list, girara_free_function_t gfree)
bool girara_cmd_set(girara_session_t *session, girara_list_t *argument_list)
void girara_config_load_default(girara_session_t *session)
bool girara_isc_completion(girara_session_t *session, girara_argument_t *argument, girara_event_t *UNUSED(event), unsigned int UNUSED(t))
bool girara_config_handle_add(girara_session_t *session, const char *identifier, girara_command_function_t handle)
bool girara_shortcut_mapping_add(girara_session_t *session, const char *identifier, girara_shortcut_function_t function)
bool girara_inputbar_command_add(girara_session_t *session, const char *command, const char *abbreviation, girara_command_function_t function, girara_completion_function_t completion, const char *description)
girara_list_t * girara_list_new(void)
bool girara_sc_set(girara_session_t *session, girara_argument_t *argument, girara_event_t *UNUSED(event), unsigned int UNUSED(t))
void girara_list_iterator_free(girara_list_iterator_t *iter)
bool girara_cmd_quit(girara_session_t *session, girara_list_t *UNUSED(argument_list))
char * girara_file_read_line(FILE *file)
bool girara_isc_command_history(girara_session_t *session, girara_argument_t *argument, girara_event_t *UNUSED(event), unsigned int UNUSED(t))
char * girara_fix_path(const char *path)
bool girara_setting_get(girara_session_t *session, const char *name, void *dest)
bool girara_sc_tab_close(girara_session_t *session, girara_argument_t *UNUSED(argument), girara_event_t *UNUSED(event), unsigned int UNUSED(t))
#define girara_error(...)
#define girara_warning(...)
bool girara_isc_abort(girara_session_t *session, girara_argument_t *UNUSED(argument), girara_event_t *UNUSED(event), unsigned int UNUSED(t))
bool(* girara_command_function_t)(girara_session_t *session, girara_list_t *argument_list)
bool girara_sc_tab_navigate_next(girara_session_t *session, girara_argument_t *argument, girara_event_t *event, unsigned int t)
bool girara_cmd_unmap(girara_session_t *session, girara_list_t *argument_list)
bool girara_setting_set(girara_session_t *session, const char *name, void *value)
bool girara_inputbar_shortcut_add(girara_session_t *session, guint modifier, guint key, girara_shortcut_function_t function, int argument_n, void *argument_data)
void girara_config_parse(girara_session_t *session, const char *path)
bool girara_sc_quit(girara_session_t *session, girara_argument_t *UNUSED(argument), girara_event_t *UNUSED(event), unsigned int UNUSED(t))
bool girara_cmd_map(girara_session_t *session, girara_list_t *argument_list)
#define GIRARA_LIST_FOREACH_END(list, type, iter, data)
#define GIRARA_LIST_FOREACH(list, type, iter, data)
bool girara_isc_string_manipulation(girara_session_t *session, girara_argument_t *argument, girara_event_t *UNUSED(event), unsigned int UNUSED(t))