config.h (4370B)
1 /* 2 * Copyright (c) 2022-2024 lumidify <nobody@lumidify.org> 3 * 4 * Permission to use, copy, modify, and/or distribute this software for any 5 * purpose with or without fee is hereby granted, provided that the above 6 * copyright notice and this permission notice appear in all copies. 7 * 8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 15 */ 16 17 #ifndef LTK_CONFIG_H 18 #define LTK_CONFIG_H 19 20 #include <stddef.h> 21 22 #include "array.h" 23 #include "color.h" 24 #include "widget.h" 25 #include "graphics.h" 26 #include "eventdefs.h" 27 28 typedef enum{ 29 LTK_KEY_BINDING_NOFLAGS = 0, 30 LTK_KEY_BINDING_RUN_ALWAYS = 1, 31 } ltk_key_binding_flags; 32 33 typedef struct { 34 char *text; 35 char *rawtext; 36 ltk_keysym sym; 37 ltk_mod_type mods; 38 ltk_key_binding_flags flags; 39 } ltk_keypress_binding; 40 41 typedef struct { 42 ltk_keysym sym; 43 ltk_mod_type mods; 44 ltk_key_binding_flags flags; 45 } ltk_keyrelease_binding; 46 47 typedef struct{ 48 char *from; 49 char *to; 50 } ltk_keytext_mapping; 51 52 typedef struct { 53 char *lang; 54 ltk_keytext_mapping *mappings; 55 size_t mappings_alloc, mappings_len; 56 } ltk_language_mapping; 57 58 struct ltk_cmd_piece { 59 char *text; 60 enum { 61 LTK_CMD_TEXT, 62 LTK_CMD_INPUT_FILE, 63 LTK_CMD_OUTPUT_FILE, 64 LTK_CMD_INOUT_FILE, 65 } type; 66 }; 67 68 LTK_ARRAY_INIT_STRUCT_DECL(cmdpiece, struct ltk_cmd_piece) 69 LTK_ARRAY_INIT_STRUCT_DECL(cmd, ltk_array(cmdpiece) *) 70 71 typedef struct { 72 ltk_array(cmd) *line_editor; 73 ltk_array(cmd) *option_chooser; 74 double dpi_scale; 75 double fixed_dpi; 76 int mixed_dpi; 77 int explicit_focus; 78 int all_activatable; 79 } ltk_general_config; 80 81 typedef int (*ltk_keybinding_func)(ltk_widget *, ltk_key_event *); 82 83 typedef struct { 84 char *text; 85 ltk_keybinding_func func; 86 } ltk_keybinding_cb; 87 88 typedef struct { 89 ltk_keypress_binding b; 90 ltk_keybinding_cb cb; 91 } ltk_keypress_cfg; 92 93 typedef struct { 94 ltk_keyrelease_binding b; 95 ltk_keybinding_cb cb; 96 } ltk_keyrelease_cfg; 97 98 typedef enum { 99 THEME_STRING, 100 THEME_COLOR, 101 THEME_INT, 102 THEME_UINT, 103 THEME_BOOL, 104 THEME_BORDERSIDES, 105 THEME_SIZE, 106 THEME_DOUBLE, 107 THEME_CMD, 108 } ltk_theme_datatype; 109 110 typedef struct { 111 char *key; 112 ltk_theme_datatype type; 113 /* Note: Bool and int are both integers, but they are 114 separate just to make it a bit clearer */ 115 union { 116 char **str; 117 ltk_color **color; 118 int *i; 119 unsigned int *u; 120 int *b; 121 ltk_border_sides *border; 122 ltk_size *size; 123 double *d; 124 ltk_array(cmd) **cmd; 125 } ptr; 126 /* Note: The default color is also given as a string 127 because it has to be allocated first (it is only a 128 different entry in the union in order to make it 129 a bit clearer) */ 130 union { 131 char *str; 132 char *color; 133 int i; 134 unsigned int u; 135 int b; 136 ltk_border_sides border; 137 ltk_size size; 138 double d; 139 char *cmd; 140 } defaultval; 141 /* FIXME: min/max doesn't make too much sense for sizes since they 142 can use different units, but that shouldn't matter for now because 143 min/max is only used as a sanity check to avoid extreme sizes or 144 negative sizes where that isn't allowed */ 145 /* only for integers, doubles, or sizes */ 146 /* doubles are weird at the moment since only two decimal places are 147 allowed. The min/max for doubles is the min/max given here, divided 148 by 100, i.e. to allow the range 1.0-10.0, min must be 100 and max 149 must be 1000. */ 150 long long min, max; 151 int initialized; 152 } ltk_theme_parseinfo; 153 154 LTK_ARRAY_INIT_DECL(keypress, ltk_keypress_cfg) 155 LTK_ARRAY_INIT_DECL(keyrelease, ltk_keyrelease_cfg) 156 157 void ltk_config_cleanup(ltk_renderdata *renderdata); 158 ltk_general_config *ltk_config_get_general(void); 159 int ltk_config_get_language_index(char *lang, size_t *idx_ret); 160 ltk_language_mapping *ltk_config_get_language_mapping(size_t idx); 161 int ltk_config_parsefile(ltk_renderdata *renderdata, const char *filename, char **errstr); 162 int ltk_config_load_default(ltk_renderdata *renderdata, char **errstr); 163 164 void ltk_keypress_bindings_destroy(ltk_array(keypress) *arr); 165 void ltk_keyrelease_bindings_destroy(ltk_array(keyrelease) *arr); 166 167 #endif /* LTK_CONFIG_H */