[gnome-terminal/wip/text-objects: 4/4] text-objects: Code style cleanup and minor fixes
- From: Christian Persch <chpe src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-terminal/wip/text-objects: 4/4] text-objects: Code style cleanup and minor fixes
- Date: Sun, 26 May 2019 21:17:22 +0000 (UTC)
commit ba79472eee4140f7c0c4755621c68b7462b5417a
Author: Christian Persch <chpe src gnome org>
Date: Sun May 26 23:12:31 2019 +0200
text-objects: Code style cleanup and minor fixes
src/profile-editor.c | 1 -
src/profile-editor.h | 9 +-
src/profile-text-objects.c | 414 ++++++++++++++++++++++++---------------------
src/profile-text-objects.h | 7 +-
src/terminal-screen.c | 65 ++++---
5 files changed, 257 insertions(+), 239 deletions(-)
---
diff --git a/src/profile-editor.c b/src/profile-editor.c
index 0609559c..b8e70ec2 100644
--- a/src/profile-editor.c
+++ b/src/profile-editor.c
@@ -38,7 +38,6 @@
#include "terminal-libgsystem.h"
#include "profile-text-objects.h"
-
/* Wrapper around g_signal_connect that maintains a list of the
* handlers installed, and can disconnect them all. */
typedef struct {
diff --git a/src/profile-editor.h b/src/profile-editor.h
index ffc07650..9e5c75f8 100644
--- a/src/profile-editor.h
+++ b/src/profile-editor.h
@@ -32,11 +32,10 @@ void profile_prefs_unload (void);
void profile_prefs_load (const char *uuid,
GSettings *profile);
-gulong
-profile_prefs_signal_connect (gpointer instance,
- const gchar *detailed_signal,
- GCallback c_handler,
- gpointer data);
+gulong profile_prefs_signal_connect (gpointer instance,
+ const gchar *detailed_signal,
+ GCallback c_handler,
+ gpointer data);
G_END_DECLS
diff --git a/src/profile-text-objects.c b/src/profile-text-objects.c
index cdb9cee3..6631110d 100644
--- a/src/profile-text-objects.c
+++ b/src/profile-text-objects.c
@@ -17,6 +17,11 @@
#include "config.h"
+#include <errno.h>
+
+#include <glib.h>
+#include <glib/gi18n.h>
+
#include "terminal-debug.h"
#include "terminal-libgsystem.h"
#include "terminal-pcre2.h"
@@ -24,9 +29,6 @@
#include "profile-editor.h"
#include "profile-text-objects.h"
-#include <glib/gi18n.h>
-
-
enum {
TEXT_OBJ_NAME = 0,
TEXT_OBJ_MATCH,
@@ -37,11 +39,10 @@ enum {
/* setup the the profile editor's text-object tab */
void
-profile_text_objects_editor_init(void)
+profile_text_objects_editor_init (void)
{
GtkBuilder *builder = the_pref_data->builder;
- GtkTreeView *tree_view =
- (GtkTreeView *) gtk_builder_get_object (builder, "text-object-list");
+ GtkTreeView *tree_view = (GtkTreeView *) gtk_builder_get_object (builder, "text-object-list");
/* setup tree */
GtkTreeSelection *select = gtk_tree_view_get_selection (tree_view);
gtk_tree_selection_set_mode (select, GTK_SELECTION_SINGLE);
@@ -51,48 +52,60 @@ profile_text_objects_editor_init(void)
GtkTreeViewColumn *column;
renderer = gtk_cell_renderer_text_new ();
- column = gtk_tree_view_column_new_with_attributes (
- _("Name"), renderer, "text", TEXT_OBJ_NAME, NULL);
+ column = gtk_tree_view_column_new_with_attributes (_("Name"),
+ renderer,
+ "text", TEXT_OBJ_NAME,
+ NULL);
gtk_tree_view_append_column (tree_view, column);
renderer = gtk_cell_renderer_text_new ();
- column = gtk_tree_view_column_new_with_attributes (
- _("Regex Match"), renderer, "text", TEXT_OBJ_MATCH, NULL);
+ column = gtk_tree_view_column_new_with_attributes (_("Regex Match"),
+ renderer,
+ "text", TEXT_OBJ_MATCH,
+ NULL);
gtk_tree_view_append_column (tree_view, column);
renderer = gtk_cell_renderer_text_new ();
- column = gtk_tree_view_column_new_with_attributes (
- _("URL Template"), renderer, "text", TEXT_OBJ_REWRITE, NULL);
+ column = gtk_tree_view_column_new_with_attributes (_("URL Template"),
+ renderer,
+ "text", TEXT_OBJ_REWRITE,
+ NULL);
gtk_tree_view_append_column (tree_view, column);
renderer = gtk_cell_renderer_text_new ();
- column = gtk_tree_view_column_new_with_attributes (
- _("Rank"), renderer, "text", TEXT_OBJ_PRIO, NULL);
+ column = gtk_tree_view_column_new_with_attributes (_("Rank"),
+ renderer,
+ "text", TEXT_OBJ_PRIO,
+ NULL);
gtk_tree_view_append_column (tree_view, column);
}
static void
-profile_save_text_objects(GSettings *profile, GtkListStore *store) {
+profile_save_text_objects (GSettings *profile,
+ GtkTreeModel *store)
+{
/* setup gvariant dict */
GVariantBuilder txt_objs;
g_variant_builder_init (&txt_objs, G_VARIANT_TYPE ("a{s(ssi)}"));
GtkTreeIter list_iter;
/* iterate over the store and write values into variant */
- gboolean more_rows =
- gtk_tree_model_get_iter_first ((GtkTreeModel *) store, &list_iter);
+ gboolean more_rows = gtk_tree_model_get_iter_first (store, &list_iter);
while (more_rows) {
- gs_free gchar *name, *match, *rewrite;
- gint prio;
- gtk_tree_model_get ((GtkTreeModel *) store, &list_iter,
- TEXT_OBJ_NAME, &name,
- TEXT_OBJ_MATCH, &match,
- TEXT_OBJ_REWRITE, &rewrite,
- TEXT_OBJ_PRIO, &prio,
- -1);
+ gs_free char *name;
+ gs_free char *match;
+ gs_free char *rewrite;
+ int prio;
+
+ gtk_tree_model_get (store, &list_iter,
+ TEXT_OBJ_NAME, &name,
+ TEXT_OBJ_MATCH, &match,
+ TEXT_OBJ_REWRITE, &rewrite,
+ TEXT_OBJ_PRIO, &prio,
+ -1);
/* encode text-object into variant dict */
g_variant_builder_add (&txt_objs, "{s(ssi)}", name, match, rewrite, prio);
- more_rows = gtk_tree_model_iter_next ((GtkTreeModel *) store, &list_iter);
+ more_rows = gtk_tree_model_iter_next (store, &list_iter);
}
GVariant *text_objects = g_variant_builder_end (&txt_objs);
@@ -101,16 +114,16 @@ profile_save_text_objects(GSettings *profile, GtkListStore *store) {
/* callback triggered for opening the dialog to edit/add a text-object */
static void
-edit_text_object_cb (GtkWidget *button, gpointer user_data)
+edit_text_object_cb (GtkWidget *button,
+ gpointer user_data)
{
GtkBuilder *builder = the_pref_data->builder;
- GtkPopover *txtobj_dialog =
- (GtkPopover *) gtk_builder_get_object (builder, "txt-obj-dialog");
+ GtkPopover *txtobj_dialog = (GtkPopover *) gtk_builder_get_object (builder, "txt-obj-dialog");
gtk_popover_set_relative_to (txtobj_dialog, button);
gtk_popover_set_position (txtobj_dialog, GTK_POS_BOTTOM);
gtk_popover_set_default_widget (txtobj_dialog,
- GTK_WIDGET (gtk_builder_get_object (builder, "txt-obj-edit-save")));
+ GTK_WIDGET (gtk_builder_get_object (builder, "txt-obj-edit-save")));
#if GTK_CHECK_VERSION (3, 22, 0)
gtk_popover_popup (txtobj_dialog);
@@ -121,29 +134,29 @@ edit_text_object_cb (GtkWidget *button, gpointer user_data)
/* callback for removing a text-object in the profile editor */
static void
-remove_text_object_cb (GtkWidget *button, GSettings *profile)
+remove_text_object_cb (GtkWidget *button,
+ GSettings *profile)
{
GtkBuilder *builder = the_pref_data->builder;
- GtkTreeView *tree_view =
- (GtkTreeView *) gtk_builder_get_object (builder, "text-object-list");
+ GtkTreeView *tree_view = (GtkTreeView *) gtk_builder_get_object (builder, "text-object-list");
GtkTreeSelection *selection = gtk_tree_view_get_selection (tree_view);
GtkTreeIter list_iter;
- GtkListStore *store;
+ GtkTreeModel *store;
/* check if there's an item selected */
- if (gtk_tree_selection_get_selected (selection, (GtkTreeModel **) &store, &list_iter)) {
- gtk_list_store_remove (store, &list_iter);
+ if (gtk_tree_selection_get_selected (selection, &store, &list_iter)) {
+ gtk_list_store_remove (GTK_LIST_STORE (store), &list_iter);
profile_save_text_objects (profile, store);
}
}
/* callback to hide the text-object editor dialog */
static void
-edit_text_object_hide_cb (GtkButton *button, gpointer user_data)
+edit_text_object_hide_cb (GtkButton *button,
+ gpointer user_data)
{
GtkBuilder *builder = the_pref_data->builder;
- GtkPopover *txtobj_dialog =
- (GtkPopover *) gtk_builder_get_object (builder, "txt-obj-dialog");
+ GtkPopover *txtobj_dialog = (GtkPopover *) gtk_builder_get_object (builder, "txt-obj-dialog");
#if GTK_CHECK_VERSION (3, 22, 0)
gtk_popover_popdown (txtobj_dialog);
@@ -155,55 +168,64 @@ edit_text_object_hide_cb (GtkButton *button, gpointer user_data)
/* search the profile's text-objects by rule-name to check if we're
* adding a new text-object or we're replacing an existing one */
static gboolean
-check_existing_text_object (
- GtkTreeModel *store, GtkTreeIter *list_iter, const gchar *rule_name)
+check_existing_text_object (GtkTreeModel *store,
+ GtkTreeIter *list_iter,
+ const gchar *rule_name)
{
gboolean more_rows = gtk_tree_model_get_iter_first (store, list_iter);
while (more_rows) {
- gs_free gchar *_name;
+ gs_free char *_name;
gtk_tree_model_get (store, list_iter, TEXT_OBJ_NAME, &_name, -1);
+
if (g_strcmp0 (rule_name, _name) == 0) {
return TRUE;
}
- more_rows = gtk_tree_model_iter_next ((GtkTreeModel *) store, list_iter);
+
+ more_rows = gtk_tree_model_iter_next (store, list_iter);
}
+
return FALSE;
}
/* callback for saving contents to text-object editor dialog */
static void
-edit_text_object_save_cb (GtkButton *button, GSettings *profile)
+edit_text_object_save_cb (GtkButton *button,
+ GSettings *profile)
{
GtkBuilder *builder = the_pref_data->builder;
/* get contents of the dialog text fields */
- const char *name = gtk_entry_get_text (
- GTK_ENTRY (gtk_builder_get_object (builder, "txt-obj-name")));
- const char *match = gtk_entry_get_text (
- GTK_ENTRY (gtk_builder_get_object (builder, "txt-obj-match")));
- const char *rewrite = gtk_entry_get_text (
- GTK_ENTRY (gtk_builder_get_object (builder, "txt-obj-rewrite")));
- const char *sprio = gtk_entry_get_text (
- GTK_ENTRY (gtk_builder_get_object (builder, "txt-obj-prio")));
- gint64 prio = g_ascii_strtoll (sprio, NULL, 10);
+ const char *name = gtk_entry_get_text (GTK_ENTRY (gtk_builder_get_object (builder, "txt-obj-name")));
+ const char *match = gtk_entry_get_text (GTK_ENTRY (gtk_builder_get_object (builder, "txt-obj-match")));
+ const char *rewrite = gtk_entry_get_text (GTK_ENTRY (gtk_builder_get_object (builder, "txt-obj-rewrite")));
+ const char *sprio = gtk_entry_get_text (GTK_ENTRY (gtk_builder_get_object (builder, "txt-obj-prio")));
+
+ errno = 0;
+ char *end;
+ int prio;
+ gint64 v = g_ascii_strtoll (sprio, &end, 10);
+ if (errno || end == sprio || v < 0 || v > G_MAXINT)
+ /* parse error, assume prio=0 */
+ prio = 0;
+ else
+ prio = v;
GtkTreeIter list_iter;
- GtkTreeView *tree_view =
- (GtkTreeView *) gtk_builder_get_object (builder, "text-object-list");
- GtkListStore *store = (GtkListStore *) gtk_tree_view_get_model(tree_view);
+ GtkTreeView *tree_view = (GtkTreeView *) gtk_builder_get_object (builder, "text-object-list");
+ GtkTreeModel *store = gtk_tree_view_get_model (tree_view);
/* if no existing rule found we'll append a new one */
- if (!check_existing_text_object ((GtkTreeModel *) store, &list_iter, name)) {
- gtk_list_store_append (store, &list_iter);
+ if (!check_existing_text_object (store, &list_iter, name)) {
+ gtk_list_store_append (GTK_LIST_STORE (store), &list_iter);
}
/* update/add the text-object */
- gtk_list_store_set (store, &list_iter,
- TEXT_OBJ_NAME, name,
- TEXT_OBJ_MATCH, match,
- TEXT_OBJ_REWRITE, rewrite,
- TEXT_OBJ_PRIO, prio,
- -1);
+ gtk_list_store_set (GTK_LIST_STORE (store), &list_iter,
+ TEXT_OBJ_NAME, name,
+ TEXT_OBJ_MATCH, match,
+ TEXT_OBJ_REWRITE, rewrite,
+ TEXT_OBJ_PRIO, prio,
+ -1);
profile_save_text_objects (profile, store);
/* Hide the popover */
@@ -212,195 +234,197 @@ edit_text_object_save_cb (GtkButton *button, GSettings *profile)
/* callback to pre-populate text-object edition dialog with current selection */
static void
-selection_text_object_change_cb (GtkTreeSelection *selection, gpointer user_data)
+selection_text_object_change_cb (GtkTreeSelection *selection,
+ gpointer user_data)
{
GtkBuilder *builder = the_pref_data->builder;
- GtkTreeIter list_iter;
- GtkListStore *store;
+
/* get active selection */
- gboolean selected = gtk_tree_selection_get_selected (
- selection, (GtkTreeModel **) &store, &list_iter);
+ GtkTreeModel *store;
+ GtkTreeIter list_iter;
+ gboolean selected = gtk_tree_selection_get_selected (selection, &store, &list_iter);
/* disable the 'Remove' button if there's no active selection */
- gtk_widget_set_sensitive (
- GTK_WIDGET (gtk_builder_get_object (builder, "txt-obj-remove-button")), selected);
+ gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (builder, "txt-obj-remove-button")),
+ selected);
/* copy selected values into edit dialog for later use */
if (selected) {
- gs_free gchar *name, *match, *rewrite, *sprio;
- gint prio;
- gtk_tree_model_get ((GtkTreeModel *) store, &list_iter,
- TEXT_OBJ_NAME, &name,
- TEXT_OBJ_MATCH, &match,
- TEXT_OBJ_REWRITE, &rewrite,
- TEXT_OBJ_PRIO, &prio,
- -1);
- sprio = g_strdup_printf("%d", prio);
- gtk_entry_set_text (
- GTK_ENTRY (gtk_builder_get_object (builder, "txt-obj-name")), name);
- gtk_entry_set_text (
- GTK_ENTRY (gtk_builder_get_object (builder, "txt-obj-match")), match);
- gtk_entry_set_text (
- GTK_ENTRY (gtk_builder_get_object (builder, "txt-obj-rewrite")), rewrite);
- gtk_entry_set_text (
- GTK_ENTRY (gtk_builder_get_object (builder, "txt-obj-prio")), sprio);
- gtk_button_set_label (
- GTK_BUTTON (gtk_builder_get_object (builder, "txt-obj-edit-button")), "Edit");
+ gs_free char *name;
+ gs_free char *match;
+ gs_free char *rewrite;
+ gs_free char *sprio;
+ int prio;
+
+ gtk_tree_model_get (store, &list_iter,
+ TEXT_OBJ_NAME, &name,
+ TEXT_OBJ_MATCH, &match,
+ TEXT_OBJ_REWRITE, &rewrite,
+ TEXT_OBJ_PRIO, &prio,
+ -1);
+
+ sprio = g_strdup_printf ("%Id", prio);
+ gtk_entry_set_text (GTK_ENTRY (gtk_builder_get_object (builder, "txt-obj-name")), name);
+ gtk_entry_set_text (GTK_ENTRY (gtk_builder_get_object (builder, "txt-obj-match")), match);
+ gtk_entry_set_text (GTK_ENTRY (gtk_builder_get_object (builder, "txt-obj-rewrite")), rewrite);
+ gtk_entry_set_text (GTK_ENTRY (gtk_builder_get_object (builder, "txt-obj-prio")), sprio);
+ gtk_button_set_label (GTK_BUTTON (gtk_builder_get_object (builder, "txt-obj-edit-button")), "Edit");
} else {
- gtk_button_set_label (
- GTK_BUTTON (gtk_builder_get_object (builder, "txt-obj-edit-button")), "New");
+ gtk_button_set_label (GTK_BUTTON (gtk_builder_get_object (builder, "txt-obj-edit-button")), "New");
}
}
static void
-validate_text_object_cb (GtkEntry *entry, gpointer user_data)
+validate_text_object_cb (GtkEntry *entry,
+ gpointer user_data)
{
GtkBuilder *builder = the_pref_data->builder;
gboolean valid = TRUE;
GtkButton *save = GTK_BUTTON (gtk_builder_get_object (builder, "txt-obj-edit-save"));
/* check that all fields have some text */
- const gchar *text = gtk_entry_get_text (entry);
+ const char *text = gtk_entry_get_text (entry);
valid &= (strlen(text) > 0);
/* Check that Priority/Rank is an integer */
- GtkEntry *prio = GTK_ENTRY (gtk_builder_get_object (builder, "txt-obj-prio"));
- if (entry == prio) {
- gchar *end_ptr = NULL;
- g_ascii_strtoll (text, &end_ptr, 10);
- /* check that end_ptr actually advanced */
- valid &= (end_ptr == text + strlen(text));
+ GtkEntry *prio_entry = GTK_ENTRY (gtk_builder_get_object (builder, "txt-obj-prio"));
+ if (entry == prio_entry) {
+ errno = 0;
+ char *end_ptr = NULL;
+ gint64 v = g_ascii_strtoll (text, &end_ptr, 10);
+ if (errno || end_ptr == text || v < 0 || v > G_MAXINT)
+ valid = FALSE;
}
/* Check that the 'match' field contains a valid regex */
- GtkEntry *regex = GTK_ENTRY (gtk_builder_get_object (builder, "txt-obj-match"));
- if (entry == regex) {
- VteRegex *ok = vte_regex_new_for_match (
- text, -1, PCRE2_UTF | PCRE2_NO_UTF_CHECK | PCRE2_MULTILINE, NULL);
- valid &= (ok != NULL);
- if (ok) {
- vte_regex_unref (ok);
- }
+ GtkEntry *regex_entry = GTK_ENTRY (gtk_builder_get_object (builder, "txt-obj-match"));
+ if (entry == regex_entry) {
+ VteRegex *regex = vte_regex_new_for_match (text, -1,
+ PCRE2_UTF | PCRE2_NO_UTF_CHECK | PCRE2_MULTILINE,
+ NULL);
+ if (regex)
+ vte_regex_unref (regex);
+ else
+ valid = FALSE;
}
/* Adjust the label on the Save button depending if replacing or adding new item */
- GtkEntry *rule = GTK_ENTRY (gtk_builder_get_object (builder, "txt-obj-name"));
- if (entry == rule) {
+ GtkEntry *rule_entry = GTK_ENTRY (gtk_builder_get_object (builder, "txt-obj-name"));
+ if (entry == rule_entry) {
GtkTreeIter list_iter;
- GtkTreeModel *store = gtk_tree_view_get_model(
- (GtkTreeView *) gtk_builder_get_object (builder, "text-object-list"));
- const gchar *label = check_existing_text_object (store, &list_iter, text)
- ? "Replace" : "Create";
+ GtkTreeModel *store = gtk_tree_view_get_model ((GtkTreeView *) gtk_builder_get_object (builder,
"text-object-list"));
+ const char *label = check_existing_text_object (store, &list_iter, text) ? "Replace" : "Create";
gtk_button_set_label (GTK_BUTTON (save), label);
}
/* react to input being valid: set warning icon and toggle Save button */
- gtk_entry_set_icon_from_icon_name (
- entry,
- GTK_ENTRY_ICON_PRIMARY, valid ? NULL : "dialog-warning");
- gtk_widget_set_sensitive ((GtkWidget *) save, valid);
-
+ gtk_entry_set_icon_from_icon_name (entry,
+ GTK_ENTRY_ICON_SECONDARY,
+ valid ? NULL : "dialog-warning");
+ gtk_widget_set_sensitive (GTK_WIDGET (save), valid);
}
/* bind the text-object GUI elements to callbacks */
static void
-profile_text_objects_bind(GSettings *profile)
+profile_text_objects_bind (GSettings *profile)
{
GtkBuilder *builder = the_pref_data->builder;
- profile_prefs_signal_connect (
- gtk_builder_get_object (builder, "txt-obj-remove-button"),
- "clicked", G_CALLBACK (remove_text_object_cb), profile);
- profile_prefs_signal_connect (
- gtk_builder_get_object (builder, "txt-obj-edit-button"),
- "clicked", G_CALLBACK (edit_text_object_cb), NULL);
+ profile_prefs_signal_connect (gtk_builder_get_object (builder, "txt-obj-remove-button"),
+ "clicked", G_CALLBACK (remove_text_object_cb), profile);
- profile_prefs_signal_connect (
- gtk_builder_get_object (builder, "txt-obj-edit-cancel"),
- "clicked", G_CALLBACK (edit_text_object_hide_cb), NULL);
+ profile_prefs_signal_connect (gtk_builder_get_object (builder, "txt-obj-edit-button"),
+ "clicked", G_CALLBACK (edit_text_object_cb), NULL);
- profile_prefs_signal_connect (
- gtk_builder_get_object (builder, "txt-obj-edit-save"),
- "clicked", G_CALLBACK (edit_text_object_save_cb), profile);
+ profile_prefs_signal_connect (gtk_builder_get_object (builder, "txt-obj-edit-cancel"),
+ "clicked", G_CALLBACK (edit_text_object_hide_cb), NULL);
+
+ profile_prefs_signal_connect (gtk_builder_get_object (builder, "txt-obj-edit-save"),
+ "clicked", G_CALLBACK (edit_text_object_save_cb), profile);
guint i;
- const gchar *fields[] = {
- "txt-obj-name", "txt-obj-match", "txt-obj-rewrite", "txt-obj-prio",
+ const char *fields[] = {
+ "txt-obj-name",
+ "txt-obj-match",
+ "txt-obj-rewrite",
+ "txt-obj-prio",
};
for (i = 0; i < G_N_ELEMENTS (fields); i++) {
- profile_prefs_signal_connect (
- (GtkEntry *) gtk_builder_get_object (builder, fields[i]),
- "changed", G_CALLBACK (validate_text_object_cb), NULL);
+ profile_prefs_signal_connect ((GtkEntry *) gtk_builder_get_object (builder, fields[i]),
+ "changed", G_CALLBACK (validate_text_object_cb), NULL);
}
/* disable edit buttons if we can't write settings */
if (g_settings_is_writable (profile, "text-objects")) {
/* react to selection changes in the text-object list */
- GtkTreeSelection *selection = gtk_tree_view_get_selection (
- (GtkTreeView *) gtk_builder_get_object (builder, "text-object-list"));
- profile_prefs_signal_connect (
- selection,
- "changed", G_CALLBACK (selection_text_object_change_cb), NULL);
+ GtkTreeSelection *selection = gtk_tree_view_get_selection ((GtkTreeView *) gtk_builder_get_object
(builder, "text-object-list"));
+ profile_prefs_signal_connect (selection,
+ "changed", G_CALLBACK (selection_text_object_change_cb), NULL);
} else {
- gtk_widget_set_sensitive (
- GTK_WIDGET (gtk_builder_get_object (builder, "txt-obj-remove-button")), FALSE);
- gtk_widget_set_sensitive (
- GTK_WIDGET (gtk_builder_get_object (builder, "txt-obj-edit-button")), FALSE);
+ gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (builder, "txt-obj-remove-button")), FALSE);
+ gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (builder, "txt-obj-edit-button")), FALSE);
}
}
void
-profile_text_objects_editor_load(GSettings *profile)
+profile_text_objects_editor_load (GSettings *profile)
{
+ GtkBuilder *builder = the_pref_data->builder;
+
/* Create the model */
- GtkListStore *store = gtk_list_store_new (
- TEXT_OBJ_N_COLS, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INT);
+ gs_unref_object GtkListStore *store = gtk_list_store_new (TEXT_OBJ_N_COLS,
+ G_TYPE_STRING,
+ G_TYPE_STRING,
+ G_TYPE_STRING,
+ G_TYPE_INT);
/* Load text-objects config from profile gsettings */
- gs_unref_variant GVariant *text_objects =
- g_settings_get_value(profile, "text-objects");
+ gs_unref_variant GVariant *text_objects = g_settings_get_value (profile, "text-objects");
GVariantIter viter;
- const gchar *name, *match, *rewrite;
- gint prio;
+ const char *name, *match, *rewrite;
+ int prio;
/* populate the text-object table */
g_variant_iter_init (&viter, text_objects);
while (g_variant_iter_next (&viter, "{&s(&s&si)}", &name, &match, &rewrite, &prio)) {
GtkTreeIter list_iter;
+
gtk_list_store_append (store, &list_iter);
gtk_list_store_set (store, &list_iter,
- TEXT_OBJ_NAME, name,
- TEXT_OBJ_MATCH, match,
- TEXT_OBJ_REWRITE, rewrite,
- TEXT_OBJ_PRIO, prio,
- -1);
+ TEXT_OBJ_NAME, name,
+ TEXT_OBJ_MATCH, match,
+ TEXT_OBJ_REWRITE, rewrite,
+ TEXT_OBJ_PRIO, prio,
+ -1);
}
/* link the data to the view */
- GtkBuilder *builder = the_pref_data->builder;
- GtkTreeView *tree_view =
- (GtkTreeView *) gtk_builder_get_object (builder, "text-object-list");
- gtk_tree_view_set_model (tree_view, GTK_TREE_MODEL(store));
+ GtkTreeView *tree_view = (GtkTreeView *) gtk_builder_get_object (builder, "text-object-list");
+ gtk_tree_view_set_model (tree_view, GTK_TREE_MODEL (store));
/* bind buttons and actions */
profile_text_objects_bind (profile);
}
-static gint
-_handler_prio_compare(const UrlHandler *a, const UrlHandler *b) {
+static int
+_handler_prio_compare (const UrlHandler *a,
+ const UrlHandler *b) {
/* Higher priority objects first */
return (a->prio < b->prio) ? 1 : ((a->prio > b->prio) ? -1 : 0);
}
static void
-_free_url_handler(UrlHandler *uh) {
- if (uh) {
- g_free(uh->name);
- g_free(uh->match);
- g_free(uh->rewrite);
- g_free(uh);
- }
+_free_url_handler(UrlHandler *uh)
+{
+ if (uh == NULL)
+ return;
+
+ g_free(uh->name);
+ g_free(uh->match);
+ g_free(uh->rewrite);
+
+ g_free(uh);
}
void profile_text_objects_free (GSList *handlers) {
@@ -418,49 +442,51 @@ profile_text_objects_load (GSettings *profile)
GError *error = NULL;
GSList *handlers = NULL;
GVariantIter viter;
- gchar *name, *match, *rewrite;
- gint prio;
+ char *name, *match, *rewrite;
+ int prio;
/* Load text-objects config from profile gsettings */
- gs_unref_variant GVariant *text_objects =
- g_settings_get_value(profile, "text-objects");
+ gs_unref_variant GVariant *text_objects = g_settings_get_value (profile, "text-objects");
+
/* populate the text-object table */
g_variant_iter_init (&viter, text_objects);
while (g_variant_iter_next (&viter, "{s(ssi)}", &name, &match, &rewrite, &prio)) {
UrlHandler *uh = g_new0(UrlHandler, 1);
- /* adopted: uh members take ownership of strings */
- uh->name = name;
- uh->match = match;
- uh->rewrite = rewrite;
+
+ uh->name = name; /* adopts */
+ uh->match = match; /* adopts */
+ uh->rewrite = rewrite; /* adopts */
uh->prio = prio;
+
uh->regex = vte_regex_new_for_match (uh->match, -1,
- PCRE2_UTF | PCRE2_NO_UTF_CHECK |
- PCRE2_MULTILINE, &error);
+ PCRE2_UTF | PCRE2_NO_UTF_CHECK | PCRE2_MULTILINE,
+ &error);
if (error != NULL) {
- _terminal_debug_print (
- TERMINAL_DEBUG_TEXT_OBJECTS,
- "Text-Objects: error compiling regex [%s]\n", name);
- g_clear_error(&error);
+ _terminal_debug_print (TERMINAL_DEBUG_TEXT_OBJECTS,
+ "Text-Objects: error compiling regex [%s]: %s\n", name,
+ error->message);
+ g_clear_error (&error);
_free_url_handler(uh);
continue;
}
+
if (!vte_regex_jit (uh->regex, PCRE2_JIT_COMPLETE, &error) ||
!vte_regex_jit (uh->regex, PCRE2_JIT_PARTIAL_SOFT, &error)) {
- _terminal_debug_print (
- TERMINAL_DEBUG_TEXT_OBJECTS,
- "Text-Objects: failed to JIT regex for [%s]: '%s' %s\n",
- name, (char*)uh->match, error->message);
+ _terminal_debug_print (TERMINAL_DEBUG_TEXT_OBJECTS,
+ "Text-Objects: failed to JIT regex for [%s]: '%s' %s\n",
+ name, uh->match, error->message);
g_clear_error (&error);
_free_url_handler(uh);
continue;
}
- _terminal_debug_print (
- TERMINAL_DEBUG_TEXT_OBJECTS,
- "Text-Objects: loaded [%s]: %s -> %s\n", name, uh->match, uh->rewrite);
+
+ _terminal_debug_print (TERMINAL_DEBUG_TEXT_OBJECTS,
+ "Text-Objects: loaded [%s]: %s -> %s\n",
+ name, uh->match, uh->rewrite);
+
/* when vte checks for matches (vte_terminal_match_check_event)
* they're returned in order of calling vte_terminal_match_add_regex */
- handlers =
- g_slist_insert_sorted(handlers, uh, (GCompareFunc)_handler_prio_compare);
+ handlers = g_slist_insert_sorted (handlers, uh, (GCompareFunc) _handler_prio_compare);
}
return handlers;
diff --git a/src/profile-text-objects.h b/src/profile-text-objects.h
index 9c06877c..d9280edb 100644
--- a/src/profile-text-objects.h
+++ b/src/profile-text-objects.h
@@ -15,8 +15,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#ifndef TEXT_OBJECTS_H
-#define TEXT_OBJECTS_H
+#pragma once
#include <gio/gio.h>
#include <gtk/gtk.h>
@@ -29,8 +28,8 @@ typedef struct
char *name;
char *match;
char *rewrite;
- gint prio;
VteRegex *regex;
+ int prio;
int tag;
} UrlHandler;
@@ -41,5 +40,3 @@ GSList *profile_text_objects_load (GSettings *profile);
void profile_text_objects_free (GSList*);
G_END_DECLS
-
-#endif /* TEXT_OBJECTS_H */
diff --git a/src/terminal-screen.c b/src/terminal-screen.c
index ea01444a..82064a13 100644
--- a/src/terminal-screen.c
+++ b/src/terminal-screen.c
@@ -865,36 +865,31 @@ terminal_screen_profile_changed_cb (GSettings *profile,
VteTerminal *terminal = VTE_TERMINAL (screen);
- /* remove old text-object handlers if any */
+ /* remove old text-object handlers, if any */
if (priv->custom_url_handlers) {
- GSList *next = priv->custom_url_handlers;
- while (next != NULL)
- {
- UrlHandler *uh = (UrlHandler*)next->data;
- next = g_slist_next(next);
- vte_terminal_match_remove (terminal, uh->tag);
- }
+ for (GSList *list = priv->custom_url_handlers; list != NULL; list = list->next) {
+ UrlHandler *uh = (UrlHandler*) list->data;
+
+ vte_terminal_match_remove (terminal, uh->tag);
+ }
+
profile_text_objects_free (priv->custom_url_handlers);
}
/* connect new text-object handlers */
priv->custom_url_handlers = profile_text_objects_load (profile);
if (priv->custom_url_handlers) {
- GSList *next = priv->custom_url_handlers;
- while (next != NULL)
- {
- UrlHandler *uh = (UrlHandler*)next->data;
- next = g_slist_next(next);
- TagData *tag_data;
- tag_data = g_slice_new (TagData);
- tag_data->flavor = FLAVOR_CUSTOM_URI;
- tag_data->tag = vte_terminal_match_add_regex (terminal, uh->regex, 0);
- uh->tag = tag_data->tag;
- tag_data->url_handler = uh;
- vte_terminal_match_set_cursor_type (terminal,
- tag_data->tag, URL_MATCH_CURSOR);
- priv->match_tags = g_slist_prepend (priv->match_tags, tag_data);
- }
+ for (GSList *list = priv->custom_url_handlers; list != NULL; list = list->next) {
+ UrlHandler *uh = (UrlHandler*) list->data;
+
+ TagData *tag_data = g_slice_new (TagData);
+ tag_data->flavor = FLAVOR_CUSTOM_URI;
+ tag_data->tag = vte_terminal_match_add_regex (terminal, uh->regex, 0);
+ uh->tag = tag_data->tag;
+ tag_data->url_handler = uh;
+ vte_terminal_match_set_cursor_type (terminal, tag_data->tag, URL_MATCH_CURSOR);
+ priv->match_tags = g_slist_prepend (priv->match_tags, tag_data);
+ }
}
g_object_thaw_notify (object);
@@ -1602,17 +1597,19 @@ terminal_screen_button_press (GtkWidget *widget,
url = terminal_screen_check_match (screen, (GdkEvent*)event,
&url_flavor, &uhandler);
/* try re-writing the URL if its a custom flavor */
- if (url_flavor == FLAVOR_CUSTOM_URI && uhandler != NULL) {
- gchar *urltmp = vte_regex_substitute (
- uhandler->regex,
- url,
- uhandler->rewrite,
- PCRE2_SUBSTITUTE_EXTENDED,
- NULL);
- if (urltmp != NULL) {
- g_free(url);
- url = urltmp;
- }
+ if (url != NULL &&
+ url_flavor == FLAVOR_CUSTOM_URI &&
+ uhandler != NULL) {
+ char *match = vte_regex_substitute (uhandler->regex,
+ url,
+ uhandler->rewrite,
+ PCRE2_SUBSTITUTE_EXTENDED,
+ NULL);
+ g_free (url);
+ if (match != NULL)
+ url = match;
+ else
+ url = NULL;
}
if (url != NULL &&
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]