]> git.sur5r.net Git - i3/i3/commitdiff
Store output names as a linked list
authorVladimir Panteleev <git@thecybershadow.net>
Sat, 9 Sep 2017 07:37:37 +0000 (07:37 +0000)
committerMichael Stapelberg <michael@stapelberg.de>
Wed, 13 Sep 2017 16:45:46 +0000 (18:45 +0200)
Currently, only one name is ever added, and only the first name is
ever accessed; actually using the capability to store and access
multiple names comes in the following commits.

include/data.h
src/fake_outputs.c
src/output.c
src/randr.c
src/xinerama.c

index 69a79ade09faabf22bca2ddbbebef2243a65c14c..31ef1dc1f8d9dfb6eb437dc46b396f1371696d6b 100644 (file)
@@ -349,6 +349,13 @@ struct Autostart {
     autostarts_always;
 };
 
+struct output_name {
+    char *name;
+
+    SLIST_ENTRY(output_name)
+    names;
+};
+
 /**
  * An Output is a physical output on your graphics driver. Outputs which
  * are currently in use have (output->active == true). Each output has a
@@ -370,8 +377,11 @@ struct xoutput {
     bool to_be_disabled;
     bool primary;
 
-    /** Name of the output */
-    char *name;
+    /** List of names for the output.
+     * An output always has at least one name; the first name is
+     * considered the primary one. */
+    SLIST_HEAD(names_head, output_name)
+    names_head;
 
     /** Pointer to the Con which represents this output */
     Con *con;
index 93e00e729f27c4c47a0b421e51c501062c54bc06..6639b3611005b3a393a1c493558724ff0122490c 100644 (file)
@@ -47,8 +47,11 @@ void fake_outputs_init(const char *output_spec) {
             new_output->rect.width = min(new_output->rect.width, width);
             new_output->rect.height = min(new_output->rect.height, height);
         } else {
+            struct output_name *output_name = scalloc(1, sizeof(struct output_name));
             new_output = scalloc(1, sizeof(Output));
-            sasprintf(&(new_output->name), "fake-%d", num_screens);
+            sasprintf(&(output_name->name), "fake-%d", num_screens);
+            SLIST_INIT(&(new_output->names_head));
+            SLIST_INSERT_HEAD(&(new_output->names_head), output_name, names);
             DLOG("Created new fake output %s (%p)\n", output_primary_name(new_output), new_output);
             new_output->active = true;
             new_output->rect.x = x;
index 1b232694ddc0b14ecbed72320305b8a26c567f7c..e76903844821c532f14cca9b132beeb18ea3af93 100644 (file)
@@ -49,7 +49,7 @@ Output *get_output_from_string(Output *current_output, const char *output_str) {
  *
  */
 char *output_primary_name(Output *output) {
-    return output->name;
+    return SLIST_FIRST(&output->names_head)->name;
 }
 
 Output *get_output_for_con(Con *con) {
index 9cb45c5db5e44ef49be2f9962586f0b1c974b288..df63826d57ad9fb0ad602ebdfcb523c65d25de7c 100644 (file)
@@ -266,7 +266,11 @@ Output *create_root_output(xcb_connection_t *conn) {
     s->rect.y = 0;
     s->rect.width = root_screen->width_in_pixels;
     s->rect.height = root_screen->height_in_pixels;
-    s->name = "xroot-0";
+
+    struct output_name *output_name = scalloc(1, sizeof(struct output_name));
+    output_name->name = "xroot-0";
+    SLIST_INIT(&s->names_head);
+    SLIST_INSERT_HEAD(&s->names_head, output_name, names);
 
     return s;
 }
@@ -594,7 +598,12 @@ static bool randr_query_outputs_15(void) {
         Output *new = get_output_by_name(name, false);
         if (new == NULL) {
             new = scalloc(1, sizeof(Output));
-            new->name = sstrdup(name);
+
+            struct output_name *output_name = scalloc(1, sizeof(struct output_name));
+            output_name->name = sstrdup(name);
+            SLIST_INIT(&new->names_head);
+            SLIST_INSERT_HEAD(&new->names_head, output_name, names);
+
             if (monitor_info->primary) {
                 TAILQ_INSERT_HEAD(&outputs, new, outputs);
             } else {
@@ -643,14 +652,23 @@ static void handle_output(xcb_connection_t *conn, xcb_randr_output_t id,
 
     Output *new = get_output_by_id(id);
     bool existing = (new != NULL);
-    if (!existing)
+    if (!existing) {
         new = scalloc(1, sizeof(Output));
+        SLIST_INIT(&new->names_head);
+    }
     new->id = id;
     new->primary = (primary && primary->output == id);
-    FREE(new->name);
-    sasprintf(&new->name, "%.*s",
+    while (!SLIST_EMPTY(&new->names_head)) {
+        FREE(SLIST_FIRST(&new->names_head)->name);
+        struct output_name *old_head = SLIST_FIRST(&new->names_head);
+        SLIST_REMOVE_HEAD(&new->names_head, names);
+        FREE(old_head);
+    }
+    struct output_name *output_name = scalloc(1, sizeof(struct output_name));
+    sasprintf(&output_name->name, "%.*s",
               xcb_randr_get_output_info_name_length(output),
               xcb_randr_get_output_info_name(output));
+    SLIST_INSERT_HEAD(&new->names_head, output_name, names);
 
     DLOG("found output with name %s\n", output_primary_name(new));
 
index 9574b894986f79290ebb5005cadee8b0e8039502..d0651a851dadf9acf0787c4502d67564a941b474 100644 (file)
@@ -55,7 +55,10 @@ static void query_screens(xcb_connection_t *conn) {
             s->rect.height = min(s->rect.height, screen_info[screen].height);
         } else {
             s = scalloc(1, sizeof(Output));
-            sasprintf(&(s->name), "xinerama-%d", num_screens);
+            struct output_name *output_name = scalloc(1, sizeof(struct output_name));
+            sasprintf(&output_name->name, "xinerama-%d", num_screens);
+            SLIST_INIT(&s->names_head);
+            SLIST_INSERT_HEAD(&s->names_head, output_name, names);
             DLOG("Created new Xinerama screen %s (%p)\n", output_primary_name(s), s);
             s->active = true;
             s->rect.x = screen_info[screen].x_org;