aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGerd Hoffmann <kraxel@redhat.com>2019-05-23 09:52:43 +0200
committerGerd Hoffmann <kraxel@redhat.com>2019-05-23 09:52:43 +0200
commitaed0a6abfe638ea132cf340a8d6cf300f0b44eea (patch)
treec9ff77c03e309e6e7237ce7ad8f791af9695eb42
parentbabcc9ea1373677401c01d16c174ea4a7593d5d8 (diff)
downloadgterm-aed0a6abfe638ea132cf340a8d6cf300f0b44eea.tar.gz
config helpers, added args: -e, -fa, -fs
-rw-r--r--gterm.c140
1 files changed, 137 insertions, 3 deletions
diff --git a/gterm.c b/gterm.c
index bcd0c88..3c0eb1e 100644
--- a/gterm.c
+++ b/gterm.c
@@ -1,6 +1,8 @@
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
+#include <stdint.h>
+#include <stdbool.h>
#include <pwd.h>
#include <sys/types.h>
@@ -8,9 +10,74 @@
#include <gtk/gtk.h>
#include <vte/vte.h>
+#define ARRAY_SIZE(_x) (sizeof(_x)/sizeof(_x[0]))
+
+/* ------------------------------------------------------------------------ */
+
+#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"
+
+typedef struct gterm_opt {
+ char *opt;
+ char *key;
+ bool is_bool;
+} gterm_opt;
+
+static const gterm_opt gterm_opts[] = {
+ { .opt = "fa", .key = GTERM_CFG_KEY_FONT_FACE },
+ { .opt = "fs", .key = GTERM_CFG_KEY_FONT_SIZE },
+};
+
+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, char *key)
+{
+ char *value;
+
+ value = g_key_file_get_string(cfg, GTERM_CFG_GROUP_CMDLINE, 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;
+}
+
+/* ------------------------------------------------------------------------ */
+
typedef struct gterm {
GtkWidget *window;
GtkWidget *terminal;
+ GKeyFile *cfg;
GPid pid;
gint exit_code;
} gterm;
@@ -70,15 +137,42 @@ static void gterm_vte_child_exited(VteTerminal *vteterminal,
gtk_main_quit();
}
+static void gterm_vte_configure(gterm *gt)
+{
+ char *fontdesc;
+ char *fontname;
+ char *fontsize;
+
+ fontname = gterm_cfg_get(gt->cfg, GTERM_CFG_KEY_FONT_FACE);
+ fontsize = gterm_cfg_get(gt->cfg, GTERM_CFG_KEY_FONT_SIZE);
+ if (fontname && fontsize) {
+ fontdesc = g_strdup_printf("%s %s", fontname, fontsize);
+ } else if (fontname) {
+ fontdesc = g_strdup_printf("%s", fontname);
+ } else if (fontsize) {
+ fontdesc = g_strdup_printf("%s", fontsize);
+ } else {
+ fontdesc = NULL;
+ }
+ if (fontdesc) {
+ PangoFontDescription *font;
+ font = pango_font_description_from_string(fontdesc);
+ vte_terminal_set_font(VTE_TERMINAL(gt->terminal), font);
+ g_free(fontdesc);
+ }
+}
+
static void gterm_window_destroy(GtkWidget *widget, gpointer data)
{
gtk_main_quit();
}
-static gterm *gterm_new(void)
+static gterm *gterm_new(GKeyFile *cfg)
{
gterm *gt = g_new0(gterm, 1);
+ gt->cfg = cfg;
+
gt->window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
g_signal_connect(G_OBJECT(gt->window), "destroy",
G_CALLBACK(gterm_window_destroy), gt);
@@ -86,6 +180,7 @@ static gterm *gterm_new(void)
gt->terminal = vte_terminal_new();
g_signal_connect(G_OBJECT(gt->terminal), "child-exited",
G_CALLBACK(gterm_vte_child_exited), gt);
+ gterm_vte_configure(gt);
gtk_container_add(GTK_CONTAINER(gt->window), gt->terminal);
gtk_widget_show_all(gt->window);
@@ -94,12 +189,51 @@ static gterm *gterm_new(void)
int main(int argc, char *argv[])
{
+ char *filename;
+ GKeyFile *cfg;
gterm *gt;
+ const gterm_opt *opt;
+ int i, eopt = 0;
gtk_init(&argc, &argv);
- gt = gterm_new();
- gterm_spawn_shell(gt);
+ cfg = g_key_file_new();
+ filename = g_strdup_printf("%s/%s", getenv("HOME"), GTERM_CFG_FILENAME);
+ g_key_file_load_from_file(cfg, filename, G_KEY_FILE_NONE, NULL);
+ g_free(filename);
+
+ for (i = 1; i < argc;) {
+ if (strcmp(argv[i], "-e") == 0) {
+ eopt = i + 1;
+ break;
+ }
+ opt = gterm_opt_find(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");
+ else
+ gterm_cfg_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]);
+ i += 2;
+ }
+ }
+
+ gt = gterm_new(cfg);
+ if (eopt) {
+ gterm_spawn(gt, argv + eopt);
+ } else {
+ gterm_spawn_shell(gt);
+ }
gtk_main();
return gt->exit_code;