Don not make handler struct public.
authorDaniel Carl <danielcarl@gmx.de>
Mon, 16 Apr 2018 20:13:23 +0000 (22:13 +0200)
committerDaniel Carl <danielcarl@gmx.de>
Mon, 16 Apr 2018 20:34:58 +0000 (22:34 +0200)
src/ex.c
src/handler.c
src/handler.h
src/main.c
src/main.h

index 94d3d7d..98da593 100644 (file)
--- a/src/ex.c
+++ b/src/ex.c
@@ -1065,12 +1065,12 @@ static VbCmdResult ex_handlers(Client *c, const ExArg *arg)
         case EX_HANDADD:
             if (arg->rhs->len && (p = strchr(arg->rhs->str, '='))) {
                 *p++ = '\0';
-                res = handler_add(c, arg->rhs->str, p);
+                res = handler_add(c->handler, arg->rhs->str, p);
             }
             break;
 
         case EX_HANDREM:
-            res = handler_remove(c, arg->rhs->str);
+            res = handler_remove(c->handler, arg->rhs->str);
             break;
 
         default:
@@ -1240,7 +1240,7 @@ static gboolean complete(Client *c, short direction)
                     break;
 
                 case EX_HANDREM:
-                    found = handler_fill_completion(c, store, token);
+                    found = handler_fill_completion(c->handler, store, token);
                     break;
 
                 case EX_SAVE: /* Fallthrough */
index e114508..fd15d8e 100644 (file)
 
 extern struct Vimb vb;
 
-static char *handler_lookup(Client *c, const char *uri);
+struct handler {
+    GHashTable *table;  /* holds the protocol handlers */
+};
 
-void handler_init(Client *c)
+static char *handler_lookup(Handler *h, const char *uri);
+
+Handler *handler_new(void)
 {
-    c->handlers.table = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);
+    Handler *h = g_slice_new(Handler);
+    h->table   = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);
+
+    return h;
 }
 
-void handler_cleanup(Client *c)
+void handler_free(Handler *h)
 {
-    if (c->handlers.table) {
-        g_hash_table_destroy(c->handlers.table);
-        c->handlers.table = NULL;
+    if (h->table) {
+        g_hash_table_destroy(h->table);
+        h->table = NULL;
     }
+    g_slice_free(Handler, h);
 }
 
-gboolean handler_add(Client *c, const char *key, const char *cmd)
+gboolean handler_add(Handler *h, const char *key, const char *cmd)
 {
-    g_hash_table_insert(c->handlers.table, g_strdup(key), g_strdup(cmd));
+    g_hash_table_insert(h->table, g_strdup(key), g_strdup(cmd));
 
     return TRUE;
 }
 
-gboolean handler_remove(Client *c, const char *key)
+gboolean handler_remove(Handler *h, const char *key)
 {
-    return g_hash_table_remove(c->handlers.table, key);
+    return g_hash_table_remove(h->table, key);
 }
 
-gboolean handler_handle_uri(Client *c, const char *uri)
+gboolean handler_handle_uri(Handler *h, const char *uri)
 {
     char *handler, *cmd;
     GError *error = NULL;
     gboolean res;
 
-    if (!(handler = handler_lookup(c, uri))) {
+    if (!(handler = handler_lookup(h, uri))) {
         return FALSE;
     }
 
@@ -75,25 +83,24 @@ gboolean handler_handle_uri(Client *c, const char *uri)
     return res;
 }
 
-gboolean handler_fill_completion(Client *c, GtkListStore *store, const char *input)
+gboolean handler_fill_completion(Handler *h, GtkListStore *store, const char *input)
 {
-    GList *src = g_hash_table_get_keys(c->handlers.table);
+    GList *src     = g_hash_table_get_keys(h->table);
     gboolean found = util_fill_completion(store, input, src);
     g_list_free(src);
 
     return found;
 }
 
-static char *handler_lookup(Client *c, const char *uri)
+static char *handler_lookup(Handler *h, const char *uri)
 {
     char *p, *schema, *handler = NULL;
 
     if ((p = strchr(uri, ':'))) {
         schema  = g_strndup(uri, p - uri);
-        handler = g_hash_table_lookup(c->handlers.table, schema);
+        handler = g_hash_table_lookup(h->table, schema);
         g_free(schema);
     }
 
     return handler;
 }
-
index d5bbbe9..092949b 100644 (file)
 #ifndef _HANDLERS_H
 #define _HANDLERS_H
 
-void handler_init(Client *c);
-void handler_cleanup(Client *c);
-gboolean handler_add(Client *c, const char *key, const char *cmd);
-gboolean handler_remove(Client *c, const char *key);
-gboolean handler_handle_uri(Client *c, const char *uri);
-gboolean handler_fill_completion(Client *c, GtkListStore *store, const char *input);
+typedef struct handler Handler;
+
+Handler *handler_new();
+void handler_free(Handler *h);
+gboolean handler_add(Handler *h, const char *key, const char *cmd);
+gboolean handler_remove(Handler *h, const char *key);
+gboolean handler_handle_uri(Handler *h, const char *uri);
+gboolean handler_fill_completion(Handler *h, GtkListStore *store, const char *input);
 
 #endif /* end of include guard: _HANDLERS_H */
 
index 84c9c9f..e3cfdf6 100644 (file)
@@ -663,10 +663,10 @@ static void client_destroy(Client *c)
     map_cleanup(c);
     register_cleanup(c);
     setting_cleanup(c);
-    handler_cleanup(c);
 #ifdef FEATURE_AUTOCMD
     autocmd_cleanup(c);
 #endif
+    handler_free(c->handler);
     shortcut_free(c->config.shortcuts);
 
     g_slice_free(Client, c);
@@ -698,7 +698,7 @@ static Client *client_new(WebKitWebView *webview)
 
     completion_init(c);
     map_init(c);
-    handler_init(c);
+    c->handler = handler_new();
 #ifdef FEATURE_AUTOCMD
     autocmd_init(c);
 #endif
@@ -1199,7 +1199,7 @@ static gboolean on_webview_decide_policy(WebKitWebView *webview,
             uri    = webkit_uri_request_get_uri(req);
 
             /* Try to handle with specific protocol handler. */
-            if (handler_handle_uri(c, uri)) {
+            if (handler_handle_uri(c->handler, uri)) {
                 webkit_policy_decision_ignore(dec);
                 return TRUE;
             }
index b282712..a15d1d0 100644 (file)
@@ -25,6 +25,7 @@
 #include <stdio.h>
 #include <webkit2/webkit2.h>
 #include "shortcut.h"
+#include "handler.h"
 
 #include "config.h"
 
@@ -227,6 +228,7 @@ struct Client {
     GtkTextBuffer       *buffer;
     GDBusProxy          *dbusproxy;
     GDBusServer         *dbusserver;
+    Handler             *handler;               /* the protocoll handlers */
     struct {
         /* TODO split in global setting definitions and set values on a per
          * client base. */
@@ -250,9 +252,6 @@ struct Client {
         char        showcmd[SHOWCMD_LEN + 1];   /* buffer to show ambiguous key sequence */
         guint       timeoutlen;                 /* timeout for ambiguous mappings */
     } map;
-    struct {
-        GHashTable *table;                      /* holds the protocol handlers */
-    } handlers;
     struct {
         struct AuGroup *curgroup;
         GSList         *groups;