diff options
author | Gerd Hoffmann <kraxel@redhat.com> | 2019-07-05 14:47:57 +0200 |
---|---|---|
committer | Gerd Hoffmann <kraxel@redhat.com> | 2019-07-05 14:47:57 +0200 |
commit | 083f7d7a7d1a98ef1a15fd9ddacd25c9e9130f27 (patch) | |
tree | a7daf12b5c130753fc6e5b3d8e0a652596415c34 | |
parent | 78e6ec12064e4254b9ad4b9ab7f4f270627ed931 (diff) | |
download | gterm-083f7d7a7d1a98ef1a15fd9ddacd25c9e9130f27.tar.gz |
move config bits
-rw-r--r-- | gcfg.c | 78 | ||||
-rw-r--r-- | gcfg.h | 27 | ||||
-rw-r--r-- | gterm.c | 142 | ||||
-rw-r--r-- | meson.build | 2 |
4 files changed, 135 insertions, 114 deletions
@@ -0,0 +1,78 @@ +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <string.h> +#include <stdint.h> +#include <stdbool.h> + +#include "gcfg.h" + +const gcfg_opt *gcfg_opt_find(const gcfg_opt *opts, int nopts, + char *arg) +{ + const gcfg_opt *opt = NULL; + int i; + + if (arg[0] != '-' && arg[0] != '+') + return NULL; + for (i = 0; i < nopts; i++) { + if (strcmp(opts[i].opt, arg + 1) == 0) { + opt = opts + i; + break; + } + } + if (!opt) + return NULL; + if (arg[0] == '+' && !opt->is_bool) + return NULL; + return opt; +} + +void gcfg_set(GKeyFile *cfg, char *key, char *value) +{ + g_key_file_set_string(cfg, GCFG_GROUP_CMDLINE, key, value); +} + +char *gcfg_get(GKeyFile *cfg, const char *key) +{ + char *profile; + char *value; + + profile = g_key_file_get_string(cfg, GCFG_GROUP_CMDLINE, + GCFG_KEY_PROFILE, NULL); + + value = g_key_file_get_string(cfg, GCFG_GROUP_CMDLINE, key, NULL); + if (value) + return value; + + if (profile) { + value = g_key_file_get_string(cfg, profile, key, NULL); + if (value) + return value; + } + + value = g_key_file_get_string(cfg, GCFG_GROUP_DEFAULT, key, NULL); + if (value) + return value; + + return NULL; +} + +gcfg_bool gcfg_get_bool(GKeyFile *cfg, const char *key) +{ + char *value; + + value = gcfg_get(cfg, key); + if (!value) + return GCFG_BOOL_UNSET; + + if (strcasecmp(value, "true") == 0 || + strcasecmp(value, "on") == 0) + return GCFG_BOOL_TRUE; + + if (strcasecmp(value, "false") == 0 || + strcasecmp(value, "off") == 0) + return GCFG_BOOL_FALSE; + + return GCFG_BOOL_UNSET; +} @@ -0,0 +1,27 @@ +#include <glib.h> + +#define ARRAY_SIZE(_x) (sizeof(_x)/sizeof(_x[0])) + +#define GCFG_GROUP_DEFAULT "default" +#define GCFG_GROUP_CMDLINE "_cmdline_" +#define GCFG_KEY_PROFILE "profile" + +/* ------------------------------------------------------------------------ */ + +typedef struct gcfg_opt { + char *opt; + char *key; + bool is_bool; +} gcfg_opt; + +typedef enum gcfg_bool { + GCFG_BOOL_UNSET = -1, + GCFG_BOOL_FALSE = 0, + GCFG_BOOL_TRUE = 1, +} gcfg_bool; + +const gcfg_opt *gcfg_opt_find(const gcfg_opt *opts, int nopts, + char *arg); +void gcfg_set(GKeyFile *cfg, char *key, char *value); +char *gcfg_get(GKeyFile *cfg, const char *key); +gcfg_bool gcfg_get_bool(GKeyFile *cfg, const char *key); @@ -11,13 +11,11 @@ #include <gtk/gtk.h> #include <vte/vte.h> -#define ARRAY_SIZE(_x) (sizeof(_x)/sizeof(_x[0])) +#include "gcfg.h" /* ------------------------------------------------------------------------ */ #define GTERM_CFG_FILENAME ".config/gterm.conf" -#define GTERM_CFG_GROUP_DEFAULT "default" -#define GTERM_CFG_GROUP_CMDLINE "_cmdline_" #define GTERM_CFG_KEY_FONT_FACE "faceName" #define GTERM_CFG_KEY_FONT_SIZE "faceSize" @@ -33,24 +31,11 @@ #define GTERM_CFG_KEY_CURSOR_COLOR "cursorColor" #define GTERM_CFG_KEY_FOREGROUND "foreground" #define GTERM_CFG_KEY_BACKGROUND "background" -#define GTERM_CFG_KEY_PROFILE "profile" #define GTERM_CFG_KEY_FULLSCREEN "fullscreen" #define GTERM_CFG_KEY_VISUAL_BELL "visualBell" #define GTERM_CFG_KEY_SCROLLBACK_LINES "saveLines" -typedef struct gterm_opt { - char *opt; - char *key; - bool is_bool; -} gterm_opt; - -typedef enum gterm_bool { - GTERM_BOOL_UNSET = -1, - GTERM_BOOL_FALSE = 0, - GTERM_BOOL_TRUE = 1, -} gterm_bool; - -static const gterm_opt gterm_opts[] = { +static const gcfg_opt gterm_opts[] = { { .opt = "fa", .key = GTERM_CFG_KEY_FONT_FACE }, { .opt = "fs", .key = GTERM_CFG_KEY_FONT_SIZE }, { .opt = "geometry", .key = GTERM_CFG_KEY_GEOMETRY }, @@ -59,8 +44,8 @@ static const gterm_opt gterm_opts[] = { { .opt = "cr", .key = GTERM_CFG_KEY_CURSOR_COLOR }, { .opt = "fg", .key = GTERM_CFG_KEY_FOREGROUND }, { .opt = "bg", .key = GTERM_CFG_KEY_BACKGROUND }, - { .opt = "name", .key = GTERM_CFG_KEY_PROFILE }, - { .opt = "class", .key = GTERM_CFG_KEY_PROFILE }, + { .opt = "name", .key = GCFG_KEY_PROFILE }, + { .opt = "class", .key = GCFG_KEY_PROFILE }, { .opt = "sl", .key = GTERM_CFG_KEY_SCROLLBACK_LINES }, { .opt = "bc", .key = GTERM_CFG_KEY_CURSOR_BLINK, .is_bool = true }, @@ -68,75 +53,6 @@ static const gterm_opt gterm_opts[] = { { .opt = "vb", .key = GTERM_CFG_KEY_VISUAL_BELL, .is_bool = true }, }; -static const gterm_opt *gterm_opt_find(char *arg) -{ - const gterm_opt *opt = NULL; - int i; - - if (arg[0] != '-' && arg[0] != '+') - return NULL; - for (i = 0; i < ARRAY_SIZE(gterm_opts); i++) { - if (strcmp(gterm_opts[i].opt, arg + 1) == 0) { - opt = gterm_opts + i; - break; - } - } - if (!opt) - return NULL; - if (arg[0] == '+' && !opt->is_bool) - return NULL; - return opt; -} - -static void gterm_cfg_set(GKeyFile *cfg, char *key, char *value) -{ - g_key_file_set_string(cfg, GTERM_CFG_GROUP_CMDLINE, key, value); -} - -static char *gterm_cfg_get(GKeyFile *cfg, const char *key) -{ - char *profile; - char *value; - - profile = g_key_file_get_string(cfg, GTERM_CFG_GROUP_CMDLINE, - GTERM_CFG_KEY_PROFILE, NULL); - - value = g_key_file_get_string(cfg, GTERM_CFG_GROUP_CMDLINE, key, NULL); - if (value) - return value; - - if (profile) { - value = g_key_file_get_string(cfg, profile, key, NULL); - if (value) - return value; - } - - value = g_key_file_get_string(cfg, GTERM_CFG_GROUP_DEFAULT, key, NULL); - if (value) - return value; - - return NULL; -} - -static gterm_bool gterm_cfg_get_bool(GKeyFile *cfg, const char *key) -{ - char *value; - - value = gterm_cfg_get(cfg, key); - if (!value) - return GTERM_BOOL_UNSET; - - if (strcasecmp(value, "true") == 0 || - strcasecmp(value, "on") == 0) - return GTERM_BOOL_TRUE; - - if (strcasecmp(value, "false") == 0 || - strcasecmp(value, "off") == 0) - return GTERM_BOOL_FALSE; - - return GTERM_BOOL_UNSET; -} - /* ------------------------------------------------------------------------ */ typedef struct gterm { @@ -270,13 +186,13 @@ static void gterm_vte_configure(gterm *gt) char *fontname; char *fontsize; char *str; - gterm_bool b; + gcfg_bool b; gboolean state; GdkRGBA color; unsigned int cols, rows; - fontname = gterm_cfg_get(gt->cfg, GTERM_CFG_KEY_FONT_FACE); - fontsize = gterm_cfg_get(gt->cfg, GTERM_CFG_KEY_FONT_SIZE); + fontname = gcfg_get(gt->cfg, GTERM_CFG_KEY_FONT_FACE); + fontsize = gcfg_get(gt->cfg, GTERM_CFG_KEY_FONT_SIZE); if (fontname && fontsize) { fontdesc = g_strdup_printf("%s %s", fontname, fontsize); } else if (fontname) { @@ -293,24 +209,24 @@ static void gterm_vte_configure(gterm *gt) g_free(fontdesc); } - str = gterm_cfg_get(gt->cfg, GTERM_CFG_KEY_GEOMETRY); + str = gcfg_get(gt->cfg, GTERM_CFG_KEY_GEOMETRY); if (str && sscanf(str, "%dx%d", &cols, &rows) == 2) { vte_terminal_set_size(VTE_TERMINAL(gt->terminal), cols, rows); } - b = gterm_cfg_get_bool(gt->cfg, GTERM_CFG_KEY_CURSOR_BLINK); - if (b == GTERM_BOOL_TRUE) { + b = gcfg_get_bool(gt->cfg, GTERM_CFG_KEY_CURSOR_BLINK); + if (b == GCFG_BOOL_TRUE) { vte_terminal_set_cursor_blink_mode(VTE_TERMINAL(gt->terminal), VTE_CURSOR_BLINK_ON); - } else if (b == GTERM_BOOL_FALSE) { + } else if (b == GCFG_BOOL_FALSE) { vte_terminal_set_cursor_blink_mode(VTE_TERMINAL(gt->terminal), VTE_CURSOR_BLINK_OFF); } - b = gterm_cfg_get_bool(gt->cfg, GTERM_CFG_KEY_VISUAL_BELL); - if (b == GTERM_BOOL_TRUE) { + b = gcfg_get_bool(gt->cfg, GTERM_CFG_KEY_VISUAL_BELL); + if (b == GCFG_BOOL_TRUE) { state = false; - } else if (b == GTERM_BOOL_FALSE) { + } else if (b == GCFG_BOOL_FALSE) { state = true; } else { state = vte_terminal_get_audible_bell(VTE_TERMINAL(gt->terminal)); @@ -318,22 +234,22 @@ static void gterm_vte_configure(gterm *gt) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gt->bell), state); vte_terminal_set_audible_bell(VTE_TERMINAL(gt->terminal), state); - str = gterm_cfg_get(gt->cfg, GTERM_CFG_KEY_CURSOR_COLOR); + str = gcfg_get(gt->cfg, GTERM_CFG_KEY_CURSOR_COLOR); if (str) { gdk_rgba_parse(&color, str); vte_terminal_set_color_cursor(VTE_TERMINAL(gt->terminal), &color); } - str = gterm_cfg_get(gt->cfg, GTERM_CFG_KEY_FOREGROUND); + str = gcfg_get(gt->cfg, GTERM_CFG_KEY_FOREGROUND); if (str) { gdk_rgba_parse(&color, str); vte_terminal_set_color_foreground(VTE_TERMINAL(gt->terminal), &color); } - str = gterm_cfg_get(gt->cfg, GTERM_CFG_KEY_BACKGROUND); + str = gcfg_get(gt->cfg, GTERM_CFG_KEY_BACKGROUND); if (str) { gdk_rgba_parse(&color, str); vte_terminal_set_color_background(VTE_TERMINAL(gt->terminal), &color); } - str = gterm_cfg_get(gt->cfg, GTERM_CFG_KEY_SCROLLBACK_LINES); + str = gcfg_get(gt->cfg, GTERM_CFG_KEY_SCROLLBACK_LINES); if (str) { vte_terminal_set_scrollback_lines(VTE_TERMINAL(gt->terminal), atoi(str)); @@ -449,11 +365,11 @@ static void gterm_fill_menu(gterm *gt) item = gtk_separator_menu_item_new(); gtk_container_add(GTK_CONTAINER(gt->popup), item); - fontname = gterm_cfg_get(gt->cfg, GTERM_CFG_KEY_FONT_FACE); + fontname = gcfg_get(gt->cfg, GTERM_CFG_KEY_FONT_FACE); if (!fontname) fontname = "monospace"; for (i = 0; i < ARRAY_SIZE(sizes); i++) { - fontsize = gterm_cfg_get(gt->cfg, sizes[i]); + fontsize = gcfg_get(gt->cfg, sizes[i]); if (!fontsize) continue; fontdesc = g_strdup_printf("%s %s", fontname, fontsize); @@ -485,16 +401,16 @@ static void gterm_window_destroy(GtkWidget *widget, gpointer data) static void gterm_window_configure(gterm *gt) { - gterm_bool b; + gcfg_bool b; char *str; - str = gterm_cfg_get(gt->cfg, GTERM_CFG_KEY_TITLE); + str = gcfg_get(gt->cfg, GTERM_CFG_KEY_TITLE); if (str) { gtk_window_set_title(GTK_WINDOW(gt->window), str); } - b = gterm_cfg_get_bool(gt->cfg, GTERM_CFG_KEY_FULLSCREEN); - if (b == GTERM_BOOL_TRUE) { + b = gcfg_get_bool(gt->cfg, GTERM_CFG_KEY_FULLSCREEN); + if (b == GCFG_BOOL_TRUE) { gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gt->fullscreen), true); } } @@ -534,7 +450,7 @@ int main(int argc, char *argv[]) char *filename; GKeyFile *cfg; gterm *gt; - const gterm_opt *opt; + const gcfg_opt *opt; int i, eopt = 0; gtk_init(&argc, &argv); @@ -549,23 +465,23 @@ int main(int argc, char *argv[]) eopt = i + 1; break; } - opt = gterm_opt_find(argv[i]); + opt = gcfg_opt_find(gterm_opts, ARRAY_SIZE(gterm_opts), argv[i]); if (!opt) { fprintf(stderr, "unknown option: %s\n", argv[i]); exit(1); } if (opt->is_bool) { if (argv[i][0] == '-') - gterm_cfg_set(cfg, opt->key, "true"); + gcfg_set(cfg, opt->key, "true"); else - gterm_cfg_set(cfg, opt->key, "false"); + gcfg_set(cfg, opt->key, "false"); i++; } else { if (i + 1 == argc) { fprintf(stderr, "missing argument for: %s\n", argv[i]); exit(1); } - gterm_cfg_set(cfg, opt->key, argv[i+1]); + gcfg_set(cfg, opt->key, argv[i+1]); i += 2; } } diff --git a/meson.build b/meson.build index ec8396f..d4ee139 100644 --- a/meson.build +++ b/meson.build @@ -9,7 +9,7 @@ gtk_dep = dependency('gtk+-3.0', method: 'pkg-config') vte_dep = dependency('vte-2.91', method: 'pkg-config') executable('gterm', - sources : [ 'gterm.c' ], + sources : [ 'gterm.c', 'gcfg.c' ], dependencies : [ gtk_dep, vte_dep ], install : true) install_man('gterm.1') |