From 9d50f88ceffc44f5ce0b83cc060bbae649ce898b Mon Sep 17 00:00:00 2001
From: taiyu <taiyu.len@gmail.com>
Date: Tue, 24 Nov 2015 00:30:02 -0800
Subject: fix list sorting

---
 sway/commands.c |  6 +++---
 sway/config.c   | 20 +++++++++++---------
 2 files changed, 14 insertions(+), 12 deletions(-)

(limited to 'sway')

diff --git a/sway/commands.c b/sway/commands.c
index 5b3b1d0f..f6d56bb4 100644
--- a/sway/commands.c
+++ b/sway/commands.c
@@ -1128,9 +1128,9 @@ static struct cmd_results *cmd_scratchpad(int argc, char **argv) {
 
 // sort in order of longest->shortest
 static int compare_set(const void *_l, const void *_r) {
-	struct sway_variable * const *l = _l;
-	struct sway_variable * const *r = _r;
-	return strlen((*r)->name) - strlen((*l)->name);
+	struct sway_variable const *l = _l;
+	struct sway_variable const *r = _r;
+	return strlen(r->name) - strlen(l->name);
 }
 
 static struct cmd_results *cmd_set(int argc, char **argv) {
diff --git a/sway/config.c b/sway/config.c
index d70c016a..f2523c1f 100644
--- a/sway/config.c
+++ b/sway/config.c
@@ -387,18 +387,20 @@ int workspace_output_cmp_workspace(const void *a, const void *b) {
 int sway_binding_cmp_keys(const void *a, const void *b) {
 	const struct sway_binding *binda = a, *bindb = b;
 
-	if (binda->modifiers > bindb->modifiers) {
-		return 1;
-	} else if (binda->modifiers < bindb->modifiers) {
-		return -1;
+	// Count keys pressed for this binding. important so we check long before
+	// short ones.  for example mod+a+b  before  mod+a
+	unsigned int moda = 0, modb = 0, i;
+
+	// Count how any modifiers are pressed
+	for (i = 0; i < 8 * sizeof(binda->modifiers); ++i) {
+		moda += (binda->modifiers & 1 << i) != 0;
+		modb += (bindb->modifiers & 1 << i) != 0;
 	}
-
-	if (binda->keys->length > bindb->keys->length) {
-		return 1;
-	} else if (binda->keys->length < bindb->keys->length) {
-		return -1;
+	if (bindb->keys->length + modb != binda->keys->length + moda) {
+		return (bindb->keys->length + modb) - (binda->keys->length + moda);
 	}
 
+	// Otherwise compare keys
 	for (int i = 0; i < binda->keys->length; i++) {
 		xkb_keysym_t *ka = binda->keys->items[i],
 				*kb = bindb->keys->items[i];
-- 
cgit v1.2.3