girara
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros
config.c
Go to the documentation of this file.
1 /* See LICENSE file for license and copyright information */
2 
3 #include <stdlib.h>
4 #include <string.h>
5 #include <glib/gi18n-lib.h>
6 
7 #include "config.h"
8 #include "commands.h"
9 #include "datastructures.h"
10 #include "internal.h"
11 #include "session.h"
12 #include "settings.h"
13 #include "shortcuts.h"
14 #include "utils.h"
15 #include "template.h"
16 
17 #define COMMENT_PREFIX "\"#"
18 
19 static void
20 cb_window_icon(girara_session_t* session, const char* UNUSED(name),
21  girara_setting_type_t UNUSED(type), void* value, void* UNUSED(data))
22 {
23  g_return_if_fail(session != NULL && value != NULL);
24 
25  if (session->gtk.window == NULL) {
26  return;
27  }
28 
29  char* path = girara_fix_path(value);
30  GtkWindow* window = GTK_WINDOW(session->gtk.window);
31 
32  GError* error = NULL;
33  gtk_window_set_icon_from_file(window, path, &error);
34  free(path);
35 
36  if (error == NULL) {
37  return;
38  }
39 
40  girara_debug("Failed to load window icon (file): %s", error->message);
41  girara_debug("Trying name instead.");
42  g_error_free(error);
43 
44  gtk_window_set_icon_name(window, value);
45 }
46 
47 static void
48 cb_font(girara_session_t* session, const char* UNUSED(name),
49  girara_setting_type_t UNUSED(type), void* value, void* UNUSED(data))
50 {
51  g_return_if_fail(session != NULL && value != NULL);
52 
54  pango_font_description_free(session->style.font);
55 
56  /* parse font */
57  PangoFontDescription* font = pango_font_description_from_string(value);
58  session->style.font = font;
59 
60  char* fontname = pango_font_description_to_string(session->style.font);
61  girara_template_set_variable_value(session->private_data->csstemplate, "font",
62  fontname);
63  g_free(fontname);
65 }
66 
67 static void
68 cb_guioptions(girara_session_t* session, const char* UNUSED(name),
69  girara_setting_type_t UNUSED(type), void* value, void* UNUSED(data))
70 {
71  g_return_if_fail(session != NULL && value != NULL);
72 
73  /* set default values */
74  bool show_commandline = false;
75  bool show_statusbar = false;
76  bool show_hscrollbar = false;
77  bool show_vscrollbar = false;
78 
79  /* evaluate input */
80  char* input = (char*) value;
81  const size_t input_length = strlen(input);
82 
83  for (size_t i = 0; i < input_length; i++) {
84  switch (input[i]) {
85  /* command line */
86  case 'c':
87  show_commandline = true;
88  break;
89  /* statusbar */
90  case 's':
91  show_statusbar = true;
92  break;
93  case 'h':
94  show_hscrollbar = true;
95  break;
96  case 'v':
97  show_vscrollbar = true;
98  break;
99  }
100  }
101 
102  /* apply settings */
103  if (show_commandline == true) {
104  session->global.autohide_inputbar = false;
105  gtk_widget_show(session->gtk.inputbar);
106  } else {
107  session->global.autohide_inputbar = true;
108  gtk_widget_hide(session->gtk.inputbar);
109  }
110 
111  if (show_statusbar == true) {
112  session->global.hide_statusbar = false;
113  gtk_widget_show(session->gtk.statusbar);
114  } else {
115  session->global.hide_statusbar = true;
116  gtk_widget_hide(session->gtk.statusbar);
117  }
118 
119  GtkWidget* vscrollbar = gtk_scrolled_window_get_vscrollbar(GTK_SCROLLED_WINDOW(session->gtk.view));
120  GtkWidget* hscrollbar = gtk_scrolled_window_get_hscrollbar(GTK_SCROLLED_WINDOW(session->gtk.view));
121 
122  if (vscrollbar != NULL) {
123  if (show_vscrollbar == true) {
124  gtk_widget_unset_state_flags(vscrollbar, GTK_STATE_FLAG_INSENSITIVE);
125  } else {
126  gtk_widget_set_state_flags(vscrollbar, GTK_STATE_FLAG_INSENSITIVE, false);
127  }
128  }
129  if (hscrollbar != NULL) {
130  if (show_hscrollbar == true) {
131  gtk_widget_unset_state_flags(hscrollbar, GTK_STATE_FLAG_INSENSITIVE);
132  } else {
133  gtk_widget_set_state_flags(hscrollbar, GTK_STATE_FLAG_INSENSITIVE, false);
134  }
135  }
136 }
137 
138 static void
139 cb_scrollbars(girara_session_t* session, const char* name,
140  girara_setting_type_t UNUSED(type), void* value, void* UNUSED(data))
141 {
142  g_return_if_fail(session != NULL && value != NULL);
143 
144  const bool val = *(bool*) value;
145 
146  char* guioptions = NULL;
147  girara_setting_get(session, "guioptions", &guioptions);
148  g_return_if_fail(guioptions != NULL);
149 
150  bool show_hscrollbar = strchr(guioptions, 'h') != NULL;
151  bool show_vscrollbar = strchr(guioptions, 'v') != NULL;
152 
153  if (strcmp(name, "show-scrollbars") == 0) {
154  show_hscrollbar = show_vscrollbar = val;
155  } else if (strcmp(name, "show-h-scrollbar") == 0) {
156  show_hscrollbar = val;
157  } else if (strcmp(name, "show-v-scrollbar") == 0) {
158  show_vscrollbar = val;
159  }
160 
161  const size_t guioptions_len = strlen(guioptions);
162  char* new_guioptions = g_try_malloc0(sizeof(char) * (guioptions_len + 3));
163  char* iterator = new_guioptions;
164  if (new_guioptions == NULL) {
165  g_free(guioptions);
166  return;
167  }
168 
169  /* copy everything apart from h and v */
170  for (size_t i = 0; i != guioptions_len; ++i) {
171  if (guioptions[i] != 'h' && guioptions[i] != 'v') {
172  *iterator = guioptions[i];
173  ++iterator;
174  }
175  }
176  g_free(guioptions);
177 
178  if (show_hscrollbar == true) {
179  *iterator = 'h';
180  ++iterator;
181  }
182  if (show_vscrollbar == true) {
183  *iterator = 'v';
184  ++iterator;
185  }
186 
187  girara_setting_set(session, "guioptions", new_guioptions);
188  g_free(new_guioptions);
189 }
190 
191 void
192 girara_config_load_default(girara_session_t* session)
193 {
194  if (session == NULL) {
195  return;
196  }
197 
198  /* values */
199  int statusbar_h_padding = 8;
200  int statusbar_v_padding = 2;
201  int window_width = 800;
202  int window_height = 600;
203  int n_completion_items = 15;
204  bool show_scrollbars = false;
205  girara_mode_t normal_mode = session->modes.normal;
206  bool use_smooth_scroll = false;
207 
208  /* other values */
209  session->global.autohide_inputbar = true;
210 
211  /* settings */
212  girara_setting_add(session, "font", "monospace normal 9", STRING, FALSE, _("Font"), cb_font, NULL);
213  girara_setting_add(session, "default-fg", "#DDDDDD", STRING, TRUE, _("Default foreground color"), NULL, NULL);
214  girara_setting_add(session, "default-bg", "#000000", STRING, TRUE, _("Default background color"), NULL, NULL);
215  girara_setting_add(session, "inputbar-fg", "#9FBC00", STRING, TRUE, _("Inputbar foreground color"), NULL, NULL);
216  girara_setting_add(session, "inputbar-bg", "#131313", STRING, TRUE, _("Inputbar background color"), NULL, NULL);
217  girara_setting_add(session, "statusbar-fg", "#FFFFFF", STRING, TRUE, _("Statusbar foreground color"), NULL, NULL);
218  girara_setting_add(session, "statusbar-bg", "#000000", STRING, TRUE, _("Statsubar background color"), NULL, NULL);
219  girara_setting_add(session, "completion-fg", "#DDDDDD", STRING, TRUE, _("Completion foreground color"), NULL, NULL);
220  girara_setting_add(session, "completion-bg", "#232323", STRING, TRUE, _("Completion background color"), NULL, NULL);
221  girara_setting_add(session, "completion-group-fg", "#DEDEDE", STRING, TRUE, _("Completion group foreground color"), NULL, NULL);
222  girara_setting_add(session, "completion-group-bg", "#000000", STRING, TRUE, _("Completion group background color"), NULL, NULL);
223  girara_setting_add(session, "completion-highlight-fg", "#232323", STRING, TRUE, _("Completion highlight foreground color"), NULL, NULL);
224  girara_setting_add(session, "completion-highlight-bg", "#9FBC00", STRING, TRUE, _("Completion highlight background color"), NULL, NULL);
225  girara_setting_add(session, "notification-error-fg", "#FFFFFF", STRING, TRUE, _("Error notification foreground color"), NULL, NULL);
226  girara_setting_add(session, "notification-error-bg", "#FF1212", STRING, TRUE, _("Error notification background color"), NULL, NULL);
227  girara_setting_add(session, "notification-warning-fg", "#000000", STRING, TRUE, _("Warning notification foreground color"), NULL, NULL);
228  girara_setting_add(session, "notification-warning-bg", "#F3F000", STRING, TRUE, _("Warning notifaction background color"), NULL, NULL);
229  girara_setting_add(session, "notification-fg", "#000000", STRING, TRUE, _("Notification foreground color"), NULL, NULL);
230  girara_setting_add(session, "notification-bg", "#FFFFFF", STRING, TRUE, _("Notification background color"), NULL, NULL);
231  girara_setting_add(session, "tabbar-fg", "#939393", STRING, TRUE, _("Tab bar foreground color"), NULL, NULL);
232  girara_setting_add(session, "tabbar-bg", "#000000", STRING, TRUE, _("Tab bar background color"), NULL, NULL);
233  girara_setting_add(session, "tabbar-focus-fg", "#9FBC00", STRING, TRUE, _("Tab bar foreground color (active)"), NULL, NULL);
234  girara_setting_add(session, "tabbar-focus-bg", "#000000", STRING, TRUE, _("Tab bar background color (active)"), NULL, NULL);
235  girara_setting_add(session, "word-separator", " /.-=&#?", STRING, TRUE, NULL, NULL, NULL);
236  girara_setting_add(session, "window-width", &window_width, INT, TRUE, _("Initial window width"), NULL, NULL);
237  girara_setting_add(session, "window-height", &window_height, INT, TRUE, _("Initial window height"), NULL, NULL);
238  girara_setting_add(session, "statusbar-h-padding", &statusbar_h_padding, INT, TRUE, _("Horizontal padding for the status input and notification bars"), NULL, NULL);
239  girara_setting_add(session, "statusbar-v-padding", &statusbar_v_padding, INT, TRUE, _("Vertical padding for the status input and notification bars"), NULL, NULL);
240  girara_setting_add(session, "n-completion-items", &n_completion_items, INT, TRUE, _("Number of completion items"), NULL, NULL);
241  girara_setting_add(session, "show-scrollbars", &show_scrollbars, BOOLEAN, FALSE, _("Show both the horizontal and vertical scrollbars"), cb_scrollbars, NULL);
242  girara_setting_add(session, "show-h-scrollbar", &show_scrollbars, BOOLEAN, FALSE, _("Show the horizontal scrollbar"), cb_scrollbars, NULL);
243  girara_setting_add(session, "show-v-scrollbar", &show_scrollbars, BOOLEAN, FALSE, _("Show the vertical scrollbar"), cb_scrollbars, NULL);
244  girara_setting_add(session, "window-icon", "", STRING, FALSE, _("Window icon"), cb_window_icon, NULL);
245  girara_setting_add(session, "exec-command", "", STRING, FALSE, _("Command to execute in :exec"), NULL, NULL);
246  girara_setting_add(session, "guioptions", "s", STRING, FALSE, _("Show or hide certain GUI elements"), cb_guioptions, NULL);
247  girara_setting_add(session, "smooth-scroll", &use_smooth_scroll, BOOLEAN, TRUE, _("Enable smooth scrolling and zooming"), NULL, NULL);
248 
249  /* shortcuts */
250  girara_shortcut_add(session, 0, GDK_KEY_Escape, NULL, girara_sc_abort, normal_mode, 0, NULL);
251  girara_shortcut_add(session, GDK_CONTROL_MASK, GDK_KEY_c, NULL, girara_sc_abort, normal_mode, 0, NULL);
252  girara_shortcut_add(session, GDK_CONTROL_MASK, GDK_KEY_q, NULL, girara_sc_quit, normal_mode, 0, NULL);
253  girara_shortcut_add(session, 0, GDK_KEY_colon, NULL, girara_sc_focus_inputbar, normal_mode, 0, ":");
254  girara_shortcut_add(session, GDK_CONTROL_MASK, GDK_KEY_w, NULL, girara_sc_tab_close, normal_mode, 0, NULL);
255  girara_shortcut_add(session, 0, 0, "gt", girara_sc_tab_navigate, normal_mode, GIRARA_NEXT, NULL);
256  girara_shortcut_add(session, 0, 0, "gT", girara_sc_tab_navigate, normal_mode, GIRARA_PREVIOUS, NULL);
257 
258  /* inputbar shortcuts */
259  girara_inputbar_shortcut_add(session, 0, GDK_KEY_Escape, girara_isc_abort, 0, NULL);
260  girara_inputbar_shortcut_add(session, GDK_CONTROL_MASK, GDK_KEY_c, girara_isc_abort, 0, NULL);
261  girara_inputbar_shortcut_add(session, 0, GDK_KEY_Tab, girara_isc_completion, GIRARA_NEXT, NULL);
262  girara_inputbar_shortcut_add(session, GDK_CONTROL_MASK, GDK_KEY_Tab, girara_isc_completion, GIRARA_NEXT_GROUP, NULL);
263  girara_inputbar_shortcut_add(session, 0, GDK_KEY_ISO_Left_Tab, girara_isc_completion, GIRARA_PREVIOUS, NULL);
264  girara_inputbar_shortcut_add(session, GDK_CONTROL_MASK, GDK_KEY_ISO_Left_Tab, girara_isc_completion, GIRARA_PREVIOUS_GROUP, NULL);
266  girara_inputbar_shortcut_add(session, GDK_CONTROL_MASK, GDK_KEY_h, girara_isc_string_manipulation, GIRARA_DELETE_LAST_CHAR, NULL);
268  girara_inputbar_shortcut_add(session, GDK_CONTROL_MASK, GDK_KEY_k, girara_isc_string_manipulation, GIRARA_DELETE_TO_LINE_END, NULL);
269  girara_inputbar_shortcut_add(session, GDK_CONTROL_MASK, GDK_KEY_d, girara_isc_string_manipulation, GIRARA_DELETE_CURR_CHAR, NULL);
270  girara_inputbar_shortcut_add(session, GDK_CONTROL_MASK, GDK_KEY_w, girara_isc_string_manipulation, GIRARA_DELETE_LAST_WORD, NULL);
271  girara_inputbar_shortcut_add(session, GDK_CONTROL_MASK, GDK_KEY_f, girara_isc_string_manipulation, GIRARA_NEXT_CHAR, NULL);
272  girara_inputbar_shortcut_add(session, GDK_CONTROL_MASK, GDK_KEY_b, girara_isc_string_manipulation, GIRARA_PREVIOUS_CHAR, NULL);
275  girara_inputbar_shortcut_add(session, GDK_CONTROL_MASK, GDK_KEY_a, girara_isc_string_manipulation, GIRARA_GOTO_START, NULL);
276  girara_inputbar_shortcut_add(session, GDK_CONTROL_MASK, GDK_KEY_e, girara_isc_string_manipulation, GIRARA_GOTO_END, NULL);
278  girara_inputbar_shortcut_add(session, 0, GDK_KEY_Down, girara_isc_command_history, GIRARA_NEXT, NULL);
279  girara_inputbar_shortcut_add(session, GDK_CONTROL_MASK, GDK_KEY_p, girara_isc_command_history, GIRARA_PREVIOUS, NULL);
280  girara_inputbar_shortcut_add(session, GDK_CONTROL_MASK, GDK_KEY_n, girara_isc_command_history, GIRARA_NEXT, NULL);
281 
282  /* commands */
283  girara_inputbar_command_add(session, "exec", NULL, girara_cmd_exec, NULL, _("Execute a command"));
284  girara_inputbar_command_add(session, "map", "m", girara_cmd_map, NULL, _("Map a key sequence"));
285  girara_inputbar_command_add(session, "quit", "q", girara_cmd_quit, NULL, _("Quit the program"));
286  girara_inputbar_command_add(session, "set", "s", girara_cmd_set, girara_cc_set, _("Set an option"));
287  girara_inputbar_command_add(session, "unmap", NULL, girara_cmd_unmap, NULL, _("Unmap a key sequence"));
288 
289  /* config handle */
290  girara_config_handle_add(session, "map", girara_cmd_map);
291  girara_config_handle_add(session, "set", girara_cmd_set);
292  girara_config_handle_add(session, "unmap", girara_cmd_unmap);
293 
294  /* shortcut mappings */
295  girara_shortcut_mapping_add(session, "focus_inputbar", girara_sc_focus_inputbar);
298  girara_shortcut_mapping_add(session, "feedkeys", girara_sc_feedkeys);
301 }
302 
303 bool
304 girara_config_handle_add(girara_session_t* session, const char* identifier, girara_command_function_t handle)
305 {
306  g_return_val_if_fail(session != NULL, false);
307  g_return_val_if_fail(identifier != NULL, false);
308 
309  /* search for existing config handle */
310  GIRARA_LIST_FOREACH(session->config.handles, girara_config_handle_t*, iter, data)
311  if (strcmp(data->identifier, identifier) == 0) {
312  data->handle = handle;
314  return true;
315  }
316  GIRARA_LIST_FOREACH_END(session->config.handles, girara_config_handle_t*, iter, data);
317 
318  /* add new config handle */
319  girara_config_handle_t* config_handle = g_slice_new(girara_config_handle_t);
320 
321  config_handle->identifier = g_strdup(identifier);
322  config_handle->handle = handle;
323  girara_list_append(session->config.handles, config_handle);
324 
325  return true;
326 }
327 
328 void
329 girara_config_handle_free(girara_config_handle_t* handle)
330 {
331  if (handle == NULL) {
332  return;
333  }
334 
335  g_free(handle->identifier);
336  g_slice_free(girara_config_handle_t, handle);
337 }
338 
339 static bool
340 config_parse(girara_session_t* session, const char* path)
341 {
342  /* open file */
343  FILE* file = girara_file_open(path, "r");
344 
345  if (file == NULL) {
346  return false;
347  }
348 
349  /* read lines */
350  char* line = NULL;
351  unsigned int line_number = 1;
352  while ((line = girara_file_read_line(file)) != NULL) {
353  /* skip empty lines and comments */
354  if (strlen(line) == 0 || strchr(COMMENT_PREFIX, line[0]) != NULL) {
355  free(line);
356  continue;
357  }
358 
359  gchar** argv = NULL;
360  gint argc = 0;
361 
362  girara_list_t* argument_list = girara_list_new();
363  if (argument_list == NULL) {
364  free(line);
365  fclose(file);
366  return false;
367  }
368 
369  girara_list_set_free_function(argument_list, g_free);
370  if (g_shell_parse_argv(line, &argc, &argv, NULL) != FALSE) {
371  for(int i = 1; i < argc; i++) {
372  char* argument = g_strdup(argv[i]);
373  girara_list_append(argument_list, (void*) argument);
374  }
375  } else {
376  girara_list_free(argument_list);
377  fclose(file);
378  free(line);
379  return false;
380  }
381 
382  /* include gets a special treatment */
383  if (strcmp(argv[0], "include") == 0) {
384  if (argc != 2) {
385  girara_warning("Could not process line %d in '%s': usage: include path.", line_number, path);
386  } else {
387  char* newpath = NULL;
388  if (g_path_is_absolute(argv[1]) == TRUE) {
389  newpath = g_strdup(argv[1]);
390  } else {
391  char* basename = g_path_get_dirname(path);
392  char* tmp = g_build_filename(basename, argv[1], NULL);
393  newpath = girara_fix_path(tmp);
394  g_free(tmp);
395  g_free(basename);
396  }
397 
398  if (strcmp(newpath, path) == 0) {
399  girara_warning("Could not process line %d in '%s': trying to include itself.", line_number, path);
400  } else {
401  girara_debug("Loading config file '%s'.", newpath);
402  if (config_parse(session, newpath) == FALSE) {
403  girara_warning("Could not process line %d in '%s': failed to load '%s'.", line_number, path, newpath);
404  }
405  }
406  g_free(newpath);
407  }
408  } else {
409  /* search for config handle */
410  girara_config_handle_t* handle = NULL;
411  GIRARA_LIST_FOREACH(session->config.handles, girara_config_handle_t*, iter, tmp)
412  handle = tmp;
413  if (strcmp(handle->identifier, argv[0]) == 0) {
414  handle->handle(session, argument_list);
415  break;
416  } else {
417  handle = NULL;
418  }
419  GIRARA_LIST_FOREACH_END(session->config.handles, girara_config_handle_t*, iter, tmp);
420 
421  if (handle == NULL) {
422  girara_warning("Could not process line %d in '%s': Unknown handle '%s'", line_number, path, argv[0]);
423  }
424  }
425 
426  line_number++;
427  girara_list_free(argument_list);
428  g_strfreev(argv);
429  free(line);
430  }
431 
432  fclose(file);
433  return true;
434 }
435 
436 void
437 girara_config_parse(girara_session_t* session, const char* path)
438 {
439  config_parse(session, path);
440 }
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)
Definition: shortcuts.c:18
void girara_config_handle_free(girara_config_handle_t *handle)
Definition: config.c:329
int girara_mode_t
Definition: types.h:69
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)
Definition: settings.c:64
bool girara_sc_abort(girara_session_t *session, girara_argument_t *UNUSED(argument), girara_event_t *UNUSED(event), unsigned int UNUSED(t))
Definition: shortcuts.c:318
girara_setting_type_t
Definition: types.h:139
HIDDEN girara_completion_t * girara_cc_set(girara_session_t *session, const char *input)
Definition: settings.c:197
#define girara_debug(...)
Definition: utils.h:119
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)
Definition: shortcuts.c:399
FILE * girara_file_open(const char *path, const char *mode)
Definition: utils.c:188
#define UNUSED(x)
Definition: internal.h:15
bool girara_sc_tab_navigate(girara_session_t *session, girara_argument_t *argument, girara_event_t *UNUSED(event), unsigned int t)
Definition: shortcuts.c:361
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)
Definition: commands.c:617
Definition: types.h:144
bool girara_sc_focus_inputbar(girara_session_t *session, girara_argument_t *argument, girara_event_t *UNUSED(event), unsigned int UNUSED(t))
Definition: shortcuts.c:284
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)
Definition: commands.c:413
void girara_config_load_default(girara_session_t *session)
Definition: config.c:192
bool girara_isc_completion(girara_session_t *session, girara_argument_t *argument, girara_event_t *UNUSED(event), unsigned int UNUSED(t))
Definition: completion.c:139
void girara_template_set_variable_value(GiraraTemplate *object, const char *name, const char *value)
Definition: template.c:398
Definition: types.h:141
bool girara_config_handle_add(girara_session_t *session, const char *identifier, girara_command_function_t handle)
Definition: config.c:304
bool girara_shortcut_mapping_add(girara_session_t *session, const char *identifier, girara_shortcut_function_t function)
Definition: shortcuts.c:611
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)
Definition: commands.c:525
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))
Definition: shortcuts.c:452
void girara_list_iterator_free(girara_list_iterator_t *iter)
bool girara_cmd_quit(girara_session_t *session, girara_list_t *UNUSED(argument_list))
Definition: commands.c:402
char * girara_file_read_line(FILE *file)
Definition: utils.c:273
bool girara_isc_command_history(girara_session_t *session, girara_argument_t *argument, girara_event_t *UNUSED(event), unsigned int UNUSED(t))
Definition: shortcuts.c:262
char * girara_fix_path(const char *path)
Definition: utils.c:30
#define COMMENT_PREFIX
Definition: config.c:17
bool girara_setting_get(girara_session_t *session, const char *name, void *dest)
Definition: settings.c:140
Definition: types.h:143
bool girara_sc_tab_close(girara_session_t *session, girara_argument_t *UNUSED(argument), girara_event_t *UNUSED(event), unsigned int UNUSED(t))
Definition: shortcuts.c:347
#define girara_warning(...)
Definition: utils.h:129
bool girara_isc_abort(girara_session_t *session, girara_argument_t *UNUSED(argument), girara_event_t *UNUSED(event), unsigned int UNUSED(t))
Definition: shortcuts.c:152
bool(* girara_command_function_t)(girara_session_t *session, girara_list_t *argument_list)
Definition: types.h:100
bool girara_sc_tab_navigate_next(girara_session_t *session, girara_argument_t *argument, girara_event_t *event, unsigned int t)
Definition: shortcuts.c:390
bool girara_cmd_unmap(girara_session_t *session, girara_list_t *argument_list)
Definition: commands.c:395
PangoFontDescription * font
Definition: session.h:302
bool girara_setting_set(girara_session_t *session, const char *name, void *value)
Definition: settings.c:95
#define GIRARA_UNIGNORE
Definition: macros.h:68
bool girara_inputbar_shortcut_add(girara_session_t *session, guint modifier, guint key, girara_shortcut_function_t function, int argument_n, void *argument_data)
Definition: shortcuts.c:98
#define GIRARA_IGNORE_DEPRECATED
Definition: macros.h:62
void girara_config_parse(girara_session_t *session, const char *path)
Definition: config.c:437
bool girara_sc_quit(girara_session_t *session, girara_argument_t *UNUSED(argument), girara_event_t *UNUSED(event), unsigned int UNUSED(t))
Definition: shortcuts.c:334
bool girara_cmd_map(girara_session_t *session, girara_list_t *argument_list)
Definition: commands.c:389
#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))
Definition: shortcuts.c:184