summaryrefslogtreecommitdiff
path: root/src/gtktsm/gtktsm-app.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/gtktsm/gtktsm-app.c')
-rw-r--r--src/gtktsm/gtktsm-app.c200
1 files changed, 200 insertions, 0 deletions
diff --git a/src/gtktsm/gtktsm-app.c b/src/gtktsm/gtktsm-app.c
new file mode 100644
index 0000000..bfb01d5
--- /dev/null
+++ b/src/gtktsm/gtktsm-app.c
@@ -0,0 +1,200 @@
+/*
+ * GtkTsm - Terminal Emulator
+ *
+ * Copyright (c) 2011-2014 David Herrmann <dh.herrmann@gmail.com>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files
+ * (the "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sublicense, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#include <gtk/gtk.h>
+#include <stdlib.h>
+#include <string.h>
+#include "gtktsm-app.h"
+#include "gtktsm-win.h"
+#include "shl-macro.h"
+
+struct _GtkTsmApp {
+ GtkApplication parent;
+};
+
+struct _GtkTsmAppClass {
+ GtkApplicationClass parent_class;
+};
+
+G_DEFINE_TYPE(GtkTsmApp, gtktsm_app, GTK_TYPE_APPLICATION);
+
+static gboolean arg_version;
+
+static GOptionEntry app_options[] = {
+ { "version", 0, 0, G_OPTION_ARG_NONE, &arg_version, "Show version information and exit", NULL },
+ { "font", 0, 0, G_OPTION_ARG_STRING, NULL, "Terminal font", "FONT" },
+ { "sb-size", 0, 0, G_OPTION_ARG_INT, NULL, "Scroll-back buffer size in lines", "COUNT" },
+ { "anti-aliasing", 0, 0, G_OPTION_ARG_STRING, NULL, "Anti-aliasing mode for font rendering", "{none,gray,subpixel,default}" },
+ { "subpixel-order", 0, 0, G_OPTION_ARG_STRING, NULL, "Subpixel order for font rendering", "{rgb,bgr,vrgb,vbgr,default}" },
+ { "show-dirty", 0, 0, G_OPTION_ARG_NONE, NULL, "Mark dirty cells during redraw", NULL },
+ { "debug", 0, 0, G_OPTION_ARG_NONE, NULL, "Enable extensive live-debugging", NULL },
+ { NULL }
+};
+
+static gint app_handle_local_options(GApplication *gapp,
+ GVariantDict *opts)
+{
+ if (arg_version) {
+ g_print("GtkTsm\n");
+ return 0;
+ }
+
+ return -1;
+}
+
+static gint app_command_line(GApplication *gapp,
+ GApplicationCommandLine *cmd)
+{
+ GtkTsmApp *app = GTKTSM_APP(gapp);
+ GtkTsmWin *win;
+ GtkTsmTerminal *term;
+ GVariantDict *dict;
+ const gchar *sval;
+ GVariant *val;
+ int r;
+
+ win = gtktsm_win_new(app);
+ term = gtktsm_win_get_terminal(win);
+ dict = g_application_command_line_get_options_dict(cmd);
+
+ val = g_variant_dict_lookup_value(dict,
+ "font",
+ G_VARIANT_TYPE_STRING);
+ if (val)
+ g_object_set(G_OBJECT(term),
+ "font", g_variant_get_string(val, NULL),
+ NULL);
+
+ val = g_variant_dict_lookup_value(dict,
+ "sb-size",
+ G_VARIANT_TYPE_INT32);
+ if (val)
+ g_object_set(G_OBJECT(term),
+ "sb-size", shl_max(g_variant_get_int32(val), 0),
+ NULL);
+
+ val = g_variant_dict_lookup_value(dict,
+ "anti-aliasing",
+ G_VARIANT_TYPE_STRING);
+ if (val) {
+ sval = g_variant_get_string(val, NULL);
+ if (strcmp(sval, "none") &&
+ strcmp(sval, "gray") &&
+ strcmp(sval, "subpixel") &&
+ strcmp(sval, "default")) {
+ g_application_command_line_printerr(cmd,
+ "invalid anti-aliasing argument: %s\n",
+ sval);
+ r = 1;
+ goto error;
+ }
+
+ g_object_set(G_OBJECT(term),
+ "anti-aliasing", sval,
+ NULL);
+ }
+
+ val = g_variant_dict_lookup_value(dict,
+ "subpixel-order",
+ G_VARIANT_TYPE_STRING);
+ if (val) {
+ sval = g_variant_get_string(val, NULL);
+ if (strcmp(sval, "rgb") &&
+ strcmp(sval, "bgr") &&
+ strcmp(sval, "vrgb") &&
+ strcmp(sval, "vbgr") &&
+ strcmp(sval, "default")) {
+ g_application_command_line_printerr(cmd,
+ "invalid subpixel-order argument: %s\n",
+ sval);
+ r = 1;
+ goto error;
+ }
+
+ g_object_set(G_OBJECT(term),
+ "subpixel-order", sval,
+ NULL);
+ }
+
+ val = g_variant_dict_lookup_value(dict,
+ "show-dirty",
+ G_VARIANT_TYPE_BOOLEAN);
+ if (val)
+ g_object_set(G_OBJECT(term),
+ "show-dirty", g_variant_get_boolean(val),
+ NULL);
+
+ val = g_variant_dict_lookup_value(dict,
+ "debug",
+ G_VARIANT_TYPE_BOOLEAN);
+ if (val)
+ g_object_set(G_OBJECT(term),
+ "debug", g_variant_get_boolean(val),
+ NULL);
+
+ gtktsm_win_run(win);
+ gtk_window_present(GTK_WINDOW(win));
+
+ return 0;
+
+error:
+ gtk_widget_destroy(GTK_WIDGET(win));
+ return r;
+}
+
+static void app_activate(GApplication *gapp)
+{
+ GtkTsmApp *app = GTKTSM_APP(gapp);
+ GtkTsmWin *win;
+
+ win = gtktsm_win_new(app);
+ gtktsm_win_run(win);
+ gtk_window_present(GTK_WINDOW(win));
+}
+
+static void gtktsm_app_init(GtkTsmApp *app)
+{
+ g_application_add_main_option_entries(G_APPLICATION(app),
+ app_options);
+}
+
+static void gtktsm_app_class_init(GtkTsmAppClass *klass)
+{
+ GApplicationClass *gapp_klass;
+
+ gapp_klass = G_APPLICATION_CLASS(klass);
+ gapp_klass->handle_local_options = app_handle_local_options;
+ gapp_klass->command_line = app_command_line;
+ gapp_klass->activate = app_activate;
+}
+
+GtkTsmApp *gtktsm_app_new(void)
+{
+ return g_object_new(GTKTSM_APP_TYPE,
+ "application-id", "org.freedesktop.libtsm.gtktsm",
+ "flags", G_APPLICATION_SEND_ENVIRONMENT |
+ G_APPLICATION_HANDLES_COMMAND_LINE,
+ NULL);
+}