[Controller] Add initial-windows property
[tilda-gobject.git] / tilda-terminal.c
index 16ac539..2904249 100644 (file)
@@ -8,30 +8,6 @@
 #define DINGUS1 "(((news|telnet|nttp|file|http|ftp|https)://)|(www|ftp)[-A-Za-z0-9]*\\.)[-A-Za-z0-9\\.]+(:[0-9]*)?"
 #define DINGUS2 "(((news|telnet|nttp|file|http|ftp|https)://)|(www|ftp)[-A-Za-z0-9]*\\.)[-A-Za-z0-9\\.]+(:[0-9]*)?/[-A-Za-z0-9_\\$\\.\\+\\!\\*\\(\\),;:@&=\\?/~\\#\\%]*[^]'\\.}>\\) ,\\\"]"
 
-typedef enum
-{
-       HOLD_OPEN,
-       RESTART_COMMAND,
-       EXIT,
-} TildaExitActions;
-
-typedef enum
-{
-       NOT_DISPLAYED,
-       AFTER_INITIAL,
-       BEFORE_INITIAL,
-       REPLACE_INITIAL,
-} TildaDynamicTitleActions;
-
-typedef enum
-{
-       /* NOT_DISPLAYED */
-       LEFT = 1,
-       RIGHT,
-} TildaScrollbarPositions;
-
-
-
 static void
 tilda_terminal_dbus_register_object (TildaTerminal *tt)
 {
@@ -165,16 +141,17 @@ tilda_terminal_child_exited_cb (GtkWidget *widget, gpointer data)
         * is closed. Take the appropriate action */
        switch (self->exit_action)
        {
-               case EXIT:
+               case TILDA_CHILD_EXIT_ACTION_EXIT:
                        tilda_window_remove_terminal (TILDA_WINDOW(self->parent_window), self->number);
                        break;
-               case RESTART_COMMAND:
+               case TILDA_CHILD_EXIT_ACTION_RESTART:
                        vte_terminal_feed (VTE_TERMINAL(self->vte_term), "\r\n\r\n", 4);
                        tilda_terminal_start_shell (self);
                        break;
-               case HOLD_OPEN:
+               case TILDA_CHILD_EXIT_ACTION_HOLD_OPEN:
                        break;
                default:
+                       g_warning ("Bad value in self->exit_action\n");
                        break;
        }
 }
@@ -193,41 +170,32 @@ tilda_terminal_window_title_changed_cb (GtkWidget *widget, gpointer data)
        TildaTerminal *self = TILDA_TERMINAL(data);
        TildaWindow *parent_window = TILDA_WINDOW(self->parent_window);
        GtkWidget *label;
-       const gchar *vte_title;
-       gchar *new_title;
-
-       label = gtk_notebook_get_tab_label (GTK_NOTEBOOK(parent_window->notebook), self->hbox);
+       const gchar *vte_title = NULL;
+       gchar *new_title = NULL;
 
-       /* If we aren't using a dynamic title -- NOT_DISPLAYED -- then just
-        * set it to the static title and exit */
-       if (!self->dynamic_title)
-       {
-               gtk_label_set_text (GTK_LABEL(label), self->title);
-               return;
-       }
-
-       /* Get the title from VTE */
        vte_title = vte_terminal_get_window_title (VTE_TERMINAL (widget));
+       label = gtk_notebook_get_tab_label (GTK_NOTEBOOK(parent_window->notebook), self->hbox);
 
-       /* Take the appropriate action */
        switch (self->dynamic_title)
        {
-               case REPLACE_INITIAL:
-                       new_title = g_strdup (vte_title);
+               case TILDA_DYNAMIC_TITLE_DISABLED:
+                       new_title = g_strdup (self->title);
+                       break;
+
+               case TILDA_DYNAMIC_TITLE_AFTER_INITIAL:
+                       new_title = g_strdup_printf ("%s - %s", self->title, vte_title);
                        break;
 
-               case BEFORE_INITIAL:
+               case TILDA_DYNAMIC_TITLE_BEFORE_INITIAL:
                        new_title = g_strdup_printf ("%s - %s", vte_title, self->title);
                        break;
 
-               case AFTER_INITIAL:
-                       new_title = g_strdup_printf ("%s - %s", self->title, vte_title);
+               case TILDA_DYNAMIC_TITLE_REPLACE_INITIAL:
+                       new_title = g_strdup (self->title);
                        break;
 
                default:
-                       debug_printf ("ERROR: Bad value of self->dynamic_title\n");
-               case NOT_DISPLAYED:
-                       new_title = g_strdup(self->title);
+                       g_warning ("Bad value in self->dynamic-title\n");
                        break;
        }
 
@@ -352,210 +320,26 @@ tilda_terminal_set_scrollbar_position (TildaTerminal *self)
 
        switch (self->scrollbar_position)
        {
-               case RIGHT:
+               case TILDA_SCROLLBAR_RIGHT:
                        gtk_box_reorder_child (GTK_BOX(self->hbox), self->scrollbar, 0);
                        gtk_widget_show (self->scrollbar);
                        break;
 
-               case LEFT:
+               case TILDA_SCROLLBAR_LEFT:
                        gtk_box_reorder_child (GTK_BOX(self->hbox), self->scrollbar, 1);
                        gtk_widget_show (self->scrollbar);
                        break;
 
-               default:
-                       debug_printf ("ERROR: Bad scrollbar position\n");
-               case NOT_DISPLAYED:
+               case TILDA_SCROLLBAR_DISABLED:
                        gtk_widget_hide (self->scrollbar);
                        break;
-       }
-}
-
-/*******************************************************************************
- * All configuration subsystem code is below
- ******************************************************************************/
 
-/**
- * Lookup a setting in the config file for this TildaTerminal.
- *
- * The returned string MUST be g_strdup()'d if you want to actually use
- * it as a value. It is owned by the config system. You MUST NOT g_free() it.
- */
-static gchar *
-tilda_terminal_lookup_from_config (TildaTerminal *self, const gchar key[])
-{
-       debug_enter  ();
-       debug_assert (TILDA_IS_TERMINAL(self));
-       debug_assert (key != NULL);
-
-       GError *error = NULL;
-       gchar *group_name;
-       gpointer value;
-
-       /* Do the bottom-most lookup */
-       group_name = g_strdup_printf ("Window%d/Terminal%d",
-                                                                 TILDA_WINDOW(self->parent_window)->number,
-                                                                 self->number);
-       value = g_key_file_get_string (config_userprefs, group_name, key, &error);
-       g_free (group_name);
-
-       if (!error)
-               return value;
-       else
-               g_clear_error (&error);
-
-       /* Do the next highest lookup */
-       group_name = g_strdup_printf ("Window%d",
-                                                                 TILDA_WINDOW(self->parent_window)->number);
-       value = g_key_file_get_string (config_userprefs, group_name, key, &error);
-       g_free (group_name);
-
-       if (!error)
-               return value;
-       else
-               g_clear_error (&error);
-
-       /* Do the global lookup */
-       value = g_key_file_get_string (config_userprefs, "Global", key, &error);
-
-       if (!error)
-               return value;
-       else
-               g_clear_error (&error);
-
-       /* Look in the defaults */
-       if (!g_hash_table_lookup_extended (config_defaults, key, NULL, &value))
-       {
-               /* If this happened, the developers forgot to set the default for
-                * a key they added. Please email them. */
-               g_critical ("Error: unable to find the default for key=%s\n", key);
-               exit (1);
-       }
-
-       /* Return the default key */
-       return value;
-}
-
-/**
- * Set one of TildaTerminal's integer properties from the config file or defaults.
- */
-static void
-tilda_terminal_config_int_property (TildaTerminal *self, const gchar *property)
-{
-       debug_enter  ();
-       debug_assert (TILDA_IS_TERMINAL(self));
-       debug_assert (property != NULL);
-
-       gint config_value;
-       gchar *config_value_raw;
-
-       config_value_raw = tilda_terminal_lookup_from_config (self, property);
-       config_value = atoi (config_value_raw);
-       g_object_set (G_OBJECT(self), property, config_value, NULL);
-}
-
-static void
-tilda_terminal_config_enum_property (TildaTerminal *self, const gchar *property)
-{
-       debug_enter  ();
-       debug_assert (TILDA_IS_TERMINAL(self));
-       debug_assert (property != NULL);
-
-       gint config_value;
-       gchar *config_value_raw;
-
-       /* Copy, then strip spaces off of the string from the config */
-       config_value_raw = g_strstrip (g_strdup (tilda_terminal_lookup_from_config (self, property)));
-
-begin_parsing:
-
-       /* Just try all of the possible enums */
-       if (g_ascii_strcasecmp (config_value_raw, "LEFT") == 0)
-               config_value = LEFT;
-       else if (g_ascii_strcasecmp (config_value_raw, "RIGHT") == 0)
-               config_value = RIGHT;
-       else if (g_ascii_strcasecmp (config_value_raw, "HOLD-OPEN") == 0)
-               config_value = HOLD_OPEN;
-       else if (g_ascii_strcasecmp (config_value_raw, "RESTART-COMMAND") == 0)
-               config_value = RESTART_COMMAND;
-       else if (g_ascii_strcasecmp (config_value_raw, "EXIT") == 0)
-               config_value = EXIT;
-       else if (g_ascii_strcasecmp (config_value_raw, "VTE-ERASE-AUTO") == 0)
-               config_value = VTE_ERASE_AUTO;
-       else if (g_ascii_strcasecmp (config_value_raw, "VTE-ERASE-ASCII-BACKSPACE") == 0)
-               config_value = VTE_ERASE_ASCII_BACKSPACE;
-       else if (g_ascii_strcasecmp (config_value_raw, "VTE-ERASE-ASCII-DELETE") == 0)
-               config_value = VTE_ERASE_ASCII_DELETE;
-       else if (g_ascii_strcasecmp (config_value_raw, "VTE-ERASE-DELETE-SEQUENCE") == 0)
-               config_value = VTE_ERASE_DELETE_SEQUENCE;
-       else if (g_ascii_strcasecmp (config_value_raw, "NOT-DISPLAYED") == 0)
-               config_value = NOT_DISPLAYED;
-       else if (g_ascii_strcasecmp (config_value_raw, "AFTER-INITIAL") == 0)
-               config_value = AFTER_INITIAL;
-       else if (g_ascii_strcasecmp (config_value_raw, "BEFORE-INITIAL") == 0)
-               config_value = BEFORE_INITIAL;
-       else if (g_ascii_strcasecmp (config_value_raw, "REPLACE-INITIAL") == 0)
-               config_value = REPLACE_INITIAL;
-       else
-       {
-               g_critical ("Unable to parse: '%s' as an enum\n", config_value_raw);
-
-               /* Use the default -- which I sure hope is valid (famous last words) */
-               config_value_raw = g_hash_table_lookup (config_defaults, property);
-               goto begin_parsing;
-       }
-
-       /* Free the value from the config system */
-       g_free (config_value_raw);
-
-       g_object_set (G_OBJECT(self), property, config_value, NULL);
-}
-
-static void
-tilda_terminal_config_string_property (TildaTerminal *self, const gchar *property)
-{
-       debug_enter  ();
-       debug_assert (TILDA_IS_TERMINAL(self));
-       debug_assert (property != NULL);
-
-       gchar *config_value_raw;
-
-       config_value_raw = tilda_terminal_lookup_from_config (self, property);
-
-       /* The property system g_strdup()s strings for us! */
-       g_object_set (G_OBJECT(self), property, config_value_raw, NULL);
-}
-
-static void
-tilda_terminal_config_boolean_property (TildaTerminal *self, const gchar *property)
-{
-       debug_enter  ();
-       debug_assert (TILDA_IS_TERMINAL(self));
-       debug_assert (property != NULL);
-
-       gboolean config_value;
-       gchar *config_value_raw;
-
-       config_value_raw = tilda_terminal_lookup_from_config (self, property);
-
-begin_parsing:
-
-       if (g_ascii_strcasecmp (config_value_raw, "true") == 0)
-               config_value = TRUE;
-       else if (g_ascii_strcasecmp (config_value_raw, "false") == 0)
-               config_value = FALSE;
-       else
-       {
-               g_critical ("Unable to parse: '%s' as a boolean\n", config_value_raw);
-
-               /* Use the default -- which I sure hope is valid (famous last words) */
-               config_value_raw = g_hash_table_lookup (config_defaults, property);
-               goto begin_parsing;
+               default:
+                       g_warning ("Bad value in self->scrollbar_position\n");
+                       break;
        }
-
-       g_object_set (G_OBJECT(self), property, config_value, NULL);
 }
 
-
 /*******************************************************************************
  * All GObject stuff is below. You probably don't need to change this...
  ******************************************************************************/
@@ -687,29 +471,29 @@ tilda_terminal_set_property (GObject      *object,
                        break;
 
                case TILDA_TERMINAL_BACKSPACE_BINDING:
-                       self->backspace_binding = g_value_get_int (value);
+                       self->backspace_binding = g_value_get_enum (value);
                        vte_terminal_set_backspace_binding (VTE_TERMINAL(self->vte_term), self->backspace_binding);
                        debug_printf ("terminal backspace key: %d\n", self->backspace_binding);
                        break;
 
                case TILDA_TERMINAL_DELETE_BINDING:
-                       self->delete_binding = g_value_get_int (value);
+                       self->delete_binding = g_value_get_enum (value);
                        vte_terminal_set_delete_binding (VTE_TERMINAL(self->vte_term), self->delete_binding);
                        debug_printf ("terminal delete key: %d\n", self->delete_binding);
                        break;
 
                case TILDA_TERMINAL_DYNAMIC_TITLE:
-                       self->dynamic_title = g_value_get_int (value);
+                       self->dynamic_title = g_value_get_enum (value);
                        debug_printf ("terminal dynamic title: %d\n", self->dynamic_title);
                        break;
 
                case TILDA_TERMINAL_EXIT_ACTION:
-                       self->exit_action = g_value_get_int (value);
+                       self->exit_action = g_value_get_enum (value);
                        debug_printf ("terminal exit action: %d\n", self->exit_action);
                        break;
 
                case TILDA_TERMINAL_SCROLLBAR_POSITION:
-                       self->scrollbar_position = g_value_get_int (value);
+                       self->scrollbar_position = g_value_get_enum (value);
                        tilda_terminal_set_scrollbar_position (self);
                        debug_printf ("terminal scrollbar position: %d\n", self->scrollbar_position);
                        break;
@@ -834,23 +618,23 @@ tilda_terminal_get_property (GObject    *object,
                        break;
 
                case TILDA_TERMINAL_BACKSPACE_BINDING:
-                       g_value_set_int (value, self->backspace_binding);
+                       g_value_set_enum (value, self->backspace_binding);
                        break;
 
                case TILDA_TERMINAL_DELETE_BINDING:
-                       g_value_set_int (value, self->delete_binding);
+                       g_value_set_enum (value, self->delete_binding);
                        break;
 
                case TILDA_TERMINAL_DYNAMIC_TITLE:
-                       g_value_set_int (value, self->dynamic_title);
+                       g_value_set_enum (value, self->dynamic_title);
                        break;
 
                case TILDA_TERMINAL_EXIT_ACTION:
-                       g_value_set_int (value, self->exit_action);
+                       g_value_set_enum (value, self->exit_action);
                        break;
 
                case TILDA_TERMINAL_SCROLLBAR_POSITION:
-                       g_value_set_int (value, self->scrollbar_position);
+                       g_value_set_enum (value, self->scrollbar_position);
                        break;
 
                case TILDA_TERMINAL_SCROLL_BACKGROUND:
@@ -945,32 +729,32 @@ tilda_terminal_constructor (GType                  type,
                                          G_CALLBACK(tilda_terminal_button_press_cb), self);
 
        /* Setup all of the defaults from the config file */
-       tilda_terminal_config_string_property (self, "background-image");
-       tilda_terminal_config_string_property (self, "shell");
-       tilda_terminal_config_string_property (self, "font");
-       tilda_terminal_config_string_property (self, "title");
-       tilda_terminal_config_string_property (self, "working-directory");
-       tilda_terminal_config_string_property (self, "web-browser");
-
-       tilda_terminal_config_int_property (self, "scrollback-lines");
-       tilda_terminal_config_int_property (self, "transparency-percent");
-
-       tilda_terminal_config_enum_property (self, "backspace-binding");
-       tilda_terminal_config_enum_property (self, "delete-binding");
-       tilda_terminal_config_enum_property (self, "dynamic-title");
-       tilda_terminal_config_enum_property (self, "exit-action");
-       tilda_terminal_config_enum_property (self, "scrollbar-position");
-
-       tilda_terminal_config_boolean_property (self, "scroll-background");
-       tilda_terminal_config_boolean_property (self, "scroll-on-output");
-       tilda_terminal_config_boolean_property (self, "scroll-on-keystroke");
-       tilda_terminal_config_boolean_property (self, "antialiased");
-       tilda_terminal_config_boolean_property (self, "allow-bold-text");
-       tilda_terminal_config_boolean_property (self, "cursor-blinks");
-       tilda_terminal_config_boolean_property (self, "audible-bell");
-       tilda_terminal_config_boolean_property (self, "visible-bell");
-       tilda_terminal_config_boolean_property (self, "double-buffered");
-       tilda_terminal_config_boolean_property (self, "mouse-autohide");
+       tilda_terminal_set_property_from_config (self, "background-image");
+       tilda_terminal_set_property_from_config (self, "shell");
+       tilda_terminal_set_property_from_config (self, "font");
+       tilda_terminal_set_property_from_config (self, "title");
+       tilda_terminal_set_property_from_config (self, "working-directory");
+       tilda_terminal_set_property_from_config (self, "web-browser");
+
+       tilda_terminal_set_property_from_config (self, "scrollback-lines");
+       tilda_terminal_set_property_from_config (self, "transparency-percent");
+
+       tilda_terminal_set_property_from_config (self, "backspace-binding");
+       tilda_terminal_set_property_from_config (self, "delete-binding");
+       tilda_terminal_set_property_from_config (self, "dynamic-title");
+       tilda_terminal_set_property_from_config (self, "exit-action");
+       tilda_terminal_set_property_from_config (self, "scrollbar-position");
+
+       tilda_terminal_set_property_from_config (self, "scroll-background");
+       tilda_terminal_set_property_from_config (self, "scroll-on-output");
+       tilda_terminal_set_property_from_config (self, "scroll-on-keystroke");
+       tilda_terminal_set_property_from_config (self, "antialiased");
+       tilda_terminal_set_property_from_config (self, "allow-bold-text");
+       tilda_terminal_set_property_from_config (self, "cursor-blinks");
+       tilda_terminal_set_property_from_config (self, "audible-bell");
+       tilda_terminal_set_property_from_config (self, "visible-bell");
+       tilda_terminal_set_property_from_config (self, "double-buffered");
+       tilda_terminal_set_property_from_config (self, "mouse-autohide");
 
        /* All right! We're all ready to go, so register with DBus, and lets start! */
        tilda_terminal_dbus_register_object (self);
@@ -1152,61 +936,56 @@ tilda_terminal_class_init (gpointer g_class,
                                                                         TILDA_TERMINAL_TRANSPARENCY_PERCENT,
                                                                         pspec);
 
-       pspec = g_param_spec_int ("backspace-binding",
-                                                         _("Terminal's backspace binding"),
-                                                         NULL,
-                                                         VTE_ERASE_AUTO,
-                                                         VTE_ERASE_DELETE_SEQUENCE,
-                                                         VTE_ERASE_AUTO,
-                                                         G_PARAM_READWRITE);
+       pspec = g_param_spec_enum ("backspace-binding",
+                                                          _("Terminal's backspace binding"),
+                                                          NULL,
+                                                          vte_terminal_erase_binding_get_type(),
+                                                          VTE_ERASE_AUTO,
+                                                          G_PARAM_READWRITE);
 
        g_object_class_install_property (gobject_class,
                                                                         TILDA_TERMINAL_BACKSPACE_BINDING,
                                                                         pspec);
 
-       pspec = g_param_spec_int ("delete-binding",
-                                                         _("Terminal's delete binding"),
-                                                         NULL,
-                                                         VTE_ERASE_AUTO,
-                                                         VTE_ERASE_DELETE_SEQUENCE,
-                                                         VTE_ERASE_AUTO,
-                                                         G_PARAM_READWRITE);
+       pspec = g_param_spec_enum ("delete-binding",
+                                                          _("Terminal's delete binding"),
+                                                          NULL,
+                                                          vte_terminal_erase_binding_get_type(),
+                                                          VTE_ERASE_AUTO,
+                                                          G_PARAM_READWRITE);
 
        g_object_class_install_property (gobject_class,
                                                                         TILDA_TERMINAL_DELETE_BINDING,
                                                                         pspec);
 
-       pspec = g_param_spec_int ("dynamic-title",
-                                                         _("Terminal's dynamic title generation method"),
-                                                         NULL,
-                                                         0,
-                                                         INT_MAX,
-                                                         0,
-                                                         G_PARAM_READWRITE);
+       pspec = g_param_spec_enum ("dynamic-title",
+                                                          _("Terminal's dynamic title generation method"),
+                                                          NULL,
+                                                          tilda_dynamic_title_get_type(),
+                                                          TILDA_DYNAMIC_TITLE_DISABLED,
+                                                          G_PARAM_READWRITE);
 
        g_object_class_install_property (gobject_class,
                                                                         TILDA_TERMINAL_DYNAMIC_TITLE,
                                                                         pspec);
 
-       pspec = g_param_spec_int ("exit-action",
-                                                         _("Terminal's action upon child exit"),
-                                                         NULL,
-                                                         0,
-                                                         INT_MAX,
-                                                         0,
-                                                         G_PARAM_READWRITE);
+       pspec = g_param_spec_enum ("exit-action",
+                                                          _("Terminal's action upon child exit"),
+                                                          NULL,
+                                                          tilda_child_exit_action_get_type(),
+                                                          TILDA_CHILD_EXIT_ACTION_EXIT,
+                                                          G_PARAM_READWRITE);
 
        g_object_class_install_property (gobject_class,
                                                                         TILDA_TERMINAL_EXIT_ACTION,
                                                                         pspec);
 
-       pspec = g_param_spec_int ("scrollbar-position",
-                                                         _("Terminal's scrollbar position"),
-                                                         NULL,
-                                                         0,
-                                                         INT_MAX,
-                                                         0,
-                                                         G_PARAM_READWRITE);
+       pspec = g_param_spec_enum ("scrollbar-position",
+                                                          _("Terminal's scrollbar position"),
+                                                          NULL,
+                                                          tilda_scrollbar_position_get_type(),
+                                                          TILDA_SCROLLBAR_RIGHT,
+                                                          G_PARAM_READWRITE);
 
        g_object_class_install_property (gobject_class,
                                                                         TILDA_TERMINAL_SCROLLBAR_POSITION,