]> Pileus Git - wmpus/commitdiff
Properly sort monitors left->right
authorAndy Spencer <andy753421@gmail.com>
Wed, 26 Oct 2011 05:22:17 +0000 (05:22 +0000)
committerAndy Spencer <andy753421@gmail.com>
Wed, 26 Oct 2011 06:32:15 +0000 (06:32 +0000)
util.c
util.h
wm-wmii.c

diff --git a/util.c b/util.c
index cfe69a9b863e1d1a1b80825c506209b7dffc3f6c..30df76c28a39d2e25320226545be0bfc8253904b 100644 (file)
--- a/util.c
+++ b/util.c
@@ -90,6 +90,41 @@ list_t *list_find(list_t *list, void *data)
        return NULL;
 }
 
        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)
 {
 /* Misc */
 int str2num(char *str, int def)
 {
diff --git a/util.h b/util.h
index ff68fb1f66858e5667698da039ff1f51cad711af..65b82f5ec6bfa68f703c7853d74c5df4ba7ed787 100644 (file)
--- 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_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);
 
 /* Misc */
 int str2num(char *str, int def);
 
index 7654948ee5d6d61b1cb2877736b680149fb2cc80..38a37250fea5441fa7518956b9036c13f1a32f25 100644 (file)
--- a/wm-wmii.c
+++ b/wm-wmii.c
@@ -126,6 +126,12 @@ static struct { int v, h; } move_dir;
 /********************
  * Helper functions *
  ********************/
 /********************
  * 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)
 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);
 
        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          = 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);
 
        wm->tag     = tag_new(wm->screens, 1);
        wm->tags    = list_insert(NULL, wm->tag);