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
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;
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;
*
*/
char *output_primary_name(Output *output) {
- return output->name;
+ return SLIST_FIRST(&output->names_head)->name;
}
Output *get_output_for_con(Con *con) {
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;
}
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 {
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));
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;