]> git.sur5r.net Git - i3/i3/commitdiff
Bugfix: Correctly free old assignments when reloading
authorMichael Stapelberg <michael@stapelberg.de>
Sun, 11 Sep 2011 22:41:46 +0000 (23:41 +0100)
committerMichael Stapelberg <michael@stapelberg.de>
Sun, 11 Sep 2011 22:41:46 +0000 (23:41 +0100)
Fixes #516

include/data.h
include/match.h
include/regex.h
src/config.c
src/match.c
src/regex.c

index 122833c3b884f6dca7782ec55c8d9b7ffc001b44..1db7c4428a16bd22da48267bf72062ca6bab496b 100644 (file)
@@ -148,7 +148,7 @@ struct Ignore_Event {
  *
  */
 struct regex {
-    const char *pattern;
+    char *pattern;
     pcre *regex;
     pcre_extra *extra;
 };
index 2786c66a8be7792cd25485f48ca7ea971b8d0667..6c0694efeace588462c69fec845d00ba69188261 100644 (file)
@@ -28,4 +28,10 @@ void match_copy(Match *dest, Match *src);
  */
 bool match_matches_window(Match *match, i3Window *window);
 
+/**
+ * Frees the given match. It must not be used afterwards!
+ *
+ */
+void match_free(Match *match);
+
 #endif
index 2a6608a80837652cadf9d99dbc6067b12b2f81a5..adfa665635e9879ce7f8521f6cf17341f3230862 100644 (file)
  */
 struct regex *regex_new(const char *pattern);
 
+/**
+ * Frees the given regular expression. It must not be used afterwards!
+ *
+ */
+void regex_free(struct regex *regex);
+
 /**
  * Checks if the given regular expression matches the given input and returns
  * true if it does. In either case, it logs the outcome using LOG(), so it will
index 5dc52472d9b743feb897121c8f05db86d6f0a14f..c979d8cdbfcc83ec5bda074a375611688aec4beb 100644 (file)
@@ -280,15 +280,19 @@ void load_configuration(xcb_connection_t *conn, const char *override_configpath,
             SLIST_REMOVE(&modes, mode, Mode, modes);
         }
 
-#if 0
         struct Assignment *assign;
         while (!TAILQ_EMPTY(&assignments)) {
             assign = TAILQ_FIRST(&assignments);
-            FREE(assign->windowclass_title);
+            if (assign->type == A_TO_WORKSPACE)
+                FREE(assign->dest.workspace);
+            else if (assign->type == A_TO_OUTPUT)
+                FREE(assign->dest.output);
+            else if (assign->type == A_COMMAND)
+                FREE(assign->dest.command);
+            match_free(&(assign->match));
             TAILQ_REMOVE(&assignments, assign, assignments);
             FREE(assign);
         }
-#endif
 
         /* Clear workspace names */
 #if 0
index 85d2eaabc5cf520d93937b5202c2125e6820df2f..3514aceece2a95ca0a6d112575e6fb593c68a487 100644 (file)
@@ -136,3 +136,23 @@ bool match_matches_window(Match *match, i3Window *window) {
 
     return true;
 }
+
+/*
+ * Frees the given match. It must not be used afterwards!
+ *
+ */
+void match_free(Match *match) {
+    /* First step: free the regex fields / patterns */
+    regex_free(match->title);
+    regex_free(match->application);
+    regex_free(match->class);
+    regex_free(match->instance);
+    regex_free(match->mark);
+
+    /* Second step: free the regex helper struct itself */
+    FREE(match->title);
+    FREE(match->application);
+    FREE(match->class);
+    FREE(match->instance);
+    FREE(match->mark);
+}
index da8f91d8a67fbd4f09e35fc0a512598d0c0ccd11..f419e4bbf4e7d1a3cf739b17d12efeb74b1d6c85 100644 (file)
@@ -49,6 +49,18 @@ struct regex *regex_new(const char *pattern) {
     return re;
 }
 
+/*
+ * Frees the given regular expression. It must not be used afterwards!
+ *
+ */
+void regex_free(struct regex *regex) {
+    if (!regex)
+        return;
+    FREE(regex->pattern);
+    FREE(regex->regex);
+    FREE(regex->extra);
+}
+
 /*
  * Checks if the given regular expression matches the given input and returns
  * true if it does. In either case, it logs the outcome using LOG(), so it will