From: Andy Spencer Date: Wed, 26 Oct 2011 05:22:17 +0000 (+0000) Subject: Properly sort monitors left->right X-Git-Url: http://pileus.org/git/?p=wmpus;a=commitdiff_plain;h=f223b1a30b6afe99f7d94980d11f3e42ce6b9c0a Properly sort monitors left->right --- diff --git a/util.c b/util.c index cfe69a9..30df76c 100644 --- a/util.c +++ b/util.c @@ -90,6 +90,41 @@ list_t *list_find(list_t *list, void *data) return NULL; } +list_t *list_sort(list_t *list, int rev, int (*func)(void *a, void*b)) +{ + if (list == NULL || list->next == NULL) + return list; + + /* Split list */ + list_t *sides[2] = {NULL, NULL}; + for (int i = 0; list; i=(i+1)%2) { + list_t *head = list; + list = list->next; + head->next = sides[i]; + sides[i] = head; + } + + /* Sort sides */ + sides[0] = list_sort(sides[0], !rev, func); + sides[1] = list_sort(sides[1], !rev, func); + + /* Merge sides */ + while (sides[0] || sides[1]) { + int i = sides[0] == NULL ? 1 : + sides[1] == NULL ? 0 : + func(sides[0]->data, + sides[1]->data) > 0 ? !!rev : !rev; + list_t *head = sides[i]; + sides[i] = sides[i]->next; + head->next = list; + head->prev = NULL; + if (list) + list->prev = head; + list = head; + } + return list; +} + /* Misc */ int str2num(char *str, int def) { diff --git a/util.h b/util.h index ff68fb1..65b82f5 100644 --- a/util.h +++ b/util.h @@ -55,6 +55,8 @@ list_t *list_last(list_t *list); list_t *list_find(list_t *list, void *data); +list_t *list_sort(list_t *list, int rev, int (*func)(void*,void*)); + /* Misc */ int str2num(char *str, int def); diff --git a/wm-wmii.c b/wm-wmii.c index 7654948..38a3725 100644 --- a/wm-wmii.c +++ b/wm-wmii.c @@ -126,6 +126,12 @@ static struct { int v, h; } move_dir; /******************** * Helper functions * ********************/ +static int sort_win(void *a, void *b) +{ + return ((win_t*)a)->x > ((win_t*)b)->x ? 1 : + ((win_t*)a)->x < ((win_t*)b)->x ? -1 : 0; +} + static win_t *get_focus(void) { if (!wm_tag || !wm_dpy) @@ -895,19 +901,9 @@ void wm_init(win_t *root) MARGIN = conf_get_int("main.margin", MARGIN); STACK = conf_get_int("main.stack", STACK); - /* Hack, fix screen order */ - list_t *screens = sys_info(root); - list_t *left = screens; - list_t *right = screens->next; - if (left && right && WIN(left)->x > WIN(right)->x) { - void *tmp = left->data; - left->data = right->data; - right->data = tmp; - } - wm = new0(wm_t); wm->root = root; - wm->screens = screens; + wm->screens = list_sort(sys_info(root), 0, sort_win); wm->tag = tag_new(wm->screens, 1); wm->tags = list_insert(NULL, wm->tag);