aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGerd Hoffmann <kraxel@redhat.com>2019-07-05 14:47:57 +0200
committerGerd Hoffmann <kraxel@redhat.com>2019-07-05 14:47:57 +0200
commit083f7d7a7d1a98ef1a15fd9ddacd25c9e9130f27 (patch)
treea7daf12b5c130753fc6e5b3d8e0a652596415c34
parent78e6ec12064e4254b9ad4b9ab7f4f270627ed931 (diff)
downloadgterm-083f7d7a7d1a98ef1a15fd9ddacd25c9e9130f27.tar.gz
move config bits
-rw-r--r--gcfg.c78
-rw-r--r--gcfg.h27
-rw-r--r--gterm.c142
-rw-r--r--meson.build2
4 files changed, 135 insertions, 114 deletions
diff --git a/gcfg.c b/gcfg.c
new file mode 100644
index 0000000..90148e4
--- /dev/null
+++ b/gcfg.c
@@ -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;
+}
diff --git a/gcfg.h b/gcfg.h
new file mode 100644
index 0000000..4acfb15
--- /dev/null
+++ b/gcfg.h
@@ -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);
diff --git a/gterm.c b/gterm.c
index 2ef3f23..94f3038 100644
--- a/gterm.c
+++ b/gterm.c
@@ -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')