From 560283ba4e4d355daa32dc970021845260d2dca9 Mon Sep 17 00:00:00 2001 From: ailin-nemui Date: Mon, 12 Dec 2016 21:07:56 +0100 Subject: [PATCH 1/7] g_sequence backing for window list --- configure.ac | 2 +- src/fe-common/core/fe-windows.c | 204 ++++++++++++++++++++++---------- 2 files changed, 145 insertions(+), 61 deletions(-) diff --git a/configure.ac b/configure.ac index bf87f5aa..464f6288 100644 --- a/configure.ac +++ b/configure.ac @@ -237,7 +237,7 @@ for try in 1 2; do echo "*** trying without -lgmodule" glib_modules= fi - AM_PATH_GLIB_2_0(2.16.0,,, $glib_modules) + AM_PATH_GLIB_2_0(2.28.0,,, $glib_modules) if test "$GLIB_LIBS"; then if test $glib_modules = gmodule; then AC_DEFINE(HAVE_GMODULE) diff --git a/src/fe-common/core/fe-windows.c b/src/fe-common/core/fe-windows.c index 46c1593b..ff45f141 100644 --- a/src/fe-common/core/fe-windows.c +++ b/src/fe-common/core/fe-windows.c @@ -35,6 +35,7 @@ GSList *windows; /* first in the list is the active window, next is the last active, etc. */ +GSequence *windows_seq; WINDOW_REC *active_win; static int daytag; @@ -44,21 +45,23 @@ static int daycheck; /* 0 = don't check, 1 = time is 00:00, check, static int window_get_new_refnum(void) { WINDOW_REC *win; - GSList *tmp; + GSequenceIter *iter, *end; int refnum; refnum = 1; - tmp = windows; - while (tmp != NULL) { - win = tmp->data; + for (iter = g_sequence_get_begin_iter(windows_seq), + end = g_sequence_get_end_iter(windows_seq); + + iter != end; + + refnum++, + iter = g_sequence_iter_next(iter)) { + + win = g_sequence_get(iter); if (refnum != win->refnum) { - tmp = tmp->next; - continue; + return refnum; } - - refnum++; - tmp = windows; } return refnum; @@ -73,6 +76,7 @@ WINDOW_REC *window_create(WI_ITEM_REC *item, int automatic) rec->level = settings_get_level("window_default_level"); windows = g_slist_prepend(windows, rec); + g_sequence_insert_sorted(windows_seq, rec, (GCompareDataFunc)window_refnum_cmp, NULL); signal_emit("window created", 2, rec, GINT_TO_POINTER(automatic)); if (item != NULL) window_item_add(rec, item, automatic); @@ -84,6 +88,25 @@ WINDOW_REC *window_create(WI_ITEM_REC *item, int automatic) return rec; } +static void window_set_refnum0(WINDOW_REC *window, int refnum) +{ + int old_refnum; + + g_return_if_fail(window != NULL); + g_return_if_fail(refnum >= 1); + if (window->refnum == refnum) return; + + old_refnum = window->refnum; + window->refnum = refnum; + signal_emit("window refnum changed", 2, window, GINT_TO_POINTER(old_refnum)); +} + +static int window_refnum_lookup(WINDOW_REC *window, void *refnum_p) +{ + int refnum = GPOINTER_TO_INT(refnum_p); + return window->refnum == refnum ? 0 : window->refnum < refnum ? -1 : 1; +} + /* removed_refnum was removed from the windows list, pack the windows so there won't be any holes. If there is any holes after removed_refnum, leave the windows behind it alone. */ @@ -91,23 +114,34 @@ static void windows_pack(int removed_refnum) { WINDOW_REC *window; int refnum; + GSequenceIter *iter, *end; - for (refnum = removed_refnum+1;; refnum++) { - window = window_find_refnum(refnum); - if (window == NULL || window->sticky_refnum) + refnum = removed_refnum+1; + end = g_sequence_get_end_iter(windows_seq); + iter = g_sequence_lookup(windows_seq, GINT_TO_POINTER(refnum), (GCompareDataFunc)window_refnum_lookup, NULL); + if (iter == NULL) iter = end; + + for (; iter != end; refnum++, iter = g_sequence_iter_next(iter)) { + window = g_sequence_get(iter); + + if (window == NULL || window->sticky_refnum || window->refnum != refnum) break; - window_set_refnum(window, refnum-1); + window_set_refnum0(window, refnum-1); + g_sequence_sort_changed(iter, (GCompareDataFunc)window_refnum_cmp, NULL); } } void window_destroy(WINDOW_REC *window) { + GSequenceIter *iter; g_return_if_fail(window != NULL); if (window->destroying) return; window->destroying = TRUE; windows = g_slist_remove(windows, window); + iter = g_sequence_lookup(windows_seq, window, (GCompareDataFunc)window_refnum_cmp, NULL); + if (iter != NULL) g_sequence_remove(iter); if (active_win == window) { active_win = NULL; /* it's corrupted */ @@ -189,26 +223,32 @@ void window_change_server(WINDOW_REC *window, void *server) void window_set_refnum(WINDOW_REC *window, int refnum) { - GSList *tmp; + GSequenceIter *oiter, *witer; int old_refnum; g_return_if_fail(window != NULL); g_return_if_fail(refnum >= 1); if (window->refnum == refnum) return; - for (tmp = windows; tmp != NULL; tmp = tmp->next) { - WINDOW_REC *rec = tmp->data; + oiter = g_sequence_lookup(windows_seq, GINT_TO_POINTER(refnum), (GCompareDataFunc)window_refnum_lookup, NULL); + witer = g_sequence_lookup(windows_seq, GINT_TO_POINTER(window->refnum), (GCompareDataFunc)window_refnum_lookup, NULL); - if (rec->refnum == refnum) { - rec->refnum = window->refnum; - signal_emit("window refnum changed", 2, rec, GINT_TO_POINTER(refnum)); - break; - } + if (oiter != NULL) { + WINDOW_REC *rec = g_sequence_get(oiter); + + rec->refnum = window->refnum; + signal_emit("window refnum changed", 2, rec, GINT_TO_POINTER(refnum)); } old_refnum = window->refnum; window->refnum = refnum; signal_emit("window refnum changed", 2, window, GINT_TO_POINTER(old_refnum)); + + if (witer != NULL && oiter != NULL) { + g_sequence_swap(oiter, witer); + } else { + g_sequence_sort_changed(witer, (GCompareDataFunc)window_refnum_cmp, NULL); + } } void window_set_name(WINDOW_REC *window, const char *name) @@ -346,13 +386,13 @@ WINDOW_REC *window_find_closest(void *server, const char *name, int level) WINDOW_REC *window_find_refnum(int refnum) { - GSList *tmp; + GSequenceIter *iter; - for (tmp = windows; tmp != NULL; tmp = tmp->next) { - WINDOW_REC *rec = tmp->data; + iter = g_sequence_lookup(windows_seq, GINT_TO_POINTER(refnum), (GCompareDataFunc)window_refnum_lookup, NULL); + if (iter != NULL) { + WINDOW_REC *rec = g_sequence_get(iter); - if (rec->refnum == refnum) - return rec; + return rec; } return NULL; @@ -400,71 +440,112 @@ WINDOW_REC *window_find_item(SERVER_REC *server, const char *name) int window_refnum_prev(int refnum, int wrap) { - GSList *tmp; - int prev, max; + GSequenceIter *iter, *end; - max = prev = -1; - for (tmp = windows; tmp != NULL; tmp = tmp->next) { - WINDOW_REC *rec = tmp->data; + iter = g_sequence_search(windows_seq, GINT_TO_POINTER(refnum-1), (GCompareDataFunc)window_refnum_lookup, NULL); + end = g_sequence_get_end_iter(windows_seq); - if (rec->refnum < refnum && (prev == -1 || rec->refnum > prev)) - prev = rec->refnum; - if (wrap && (max == -1 || rec->refnum > max)) - max = rec->refnum; + if (iter != NULL) { + WINDOW_REC *rec; + if (iter != end) { + rec = g_sequence_get(iter); + + if (rec->refnum < refnum) + return rec->refnum; + } + + iter = g_sequence_iter_prev(iter); + rec = g_sequence_get(iter); + + if (rec->refnum < refnum) + return rec->refnum; } - return prev != -1 ? prev : max; + if (wrap) { + WINDOW_REC *rec; + iter = g_sequence_iter_prev(end); + if (iter != end) { + rec = g_sequence_get(iter); + + return rec->refnum; + } + } + + return -1; } int window_refnum_next(int refnum, int wrap) { - GSList *tmp; - int min, next; + GSequenceIter *iter, *end; - min = next = -1; - for (tmp = windows; tmp != NULL; tmp = tmp->next) { - WINDOW_REC *rec = tmp->data; + iter = g_sequence_search(windows_seq, GINT_TO_POINTER(refnum), (GCompareDataFunc)window_refnum_lookup, NULL); + end = g_sequence_get_end_iter(windows_seq); - if (rec->refnum > refnum && (next == -1 || rec->refnum < next)) - next = rec->refnum; - if (wrap && (min == -1 || rec->refnum < min)) - min = rec->refnum; + if (iter != NULL && iter != end) { + WINDOW_REC *rec = g_sequence_get(iter); + + if (rec->refnum > refnum) + return rec->refnum; + + iter = g_sequence_iter_next(iter); + if (iter != end) { + rec = g_sequence_get(iter); + + if (rec->refnum > refnum) + return rec->refnum; + } } - return next != -1 ? next : min; + if (wrap) { + WINDOW_REC *rec; + iter = g_sequence_get_begin_iter(windows_seq); + if (iter != end) { + rec = g_sequence_get(iter); + + return rec->refnum; + } + } + + return -1; } int windows_refnum_last(void) { - GSList *tmp; - int max; + GSequenceIter *end, *iter; + WINDOW_REC *rec; - max = -1; - for (tmp = windows; tmp != NULL; tmp = tmp->next) { - WINDOW_REC *rec = tmp->data; + end = g_sequence_get_end_iter(windows_seq); + iter = g_sequence_iter_prev(end); + if (iter != end) { + rec = g_sequence_get(iter); - if (rec->refnum > max) - max = rec->refnum; + return rec->refnum; } - return max; + return -1; } int window_refnum_cmp(WINDOW_REC *w1, WINDOW_REC *w2) { - return w1->refnum < w2->refnum ? -1 : 1; + return w1 == w2 ? 0 : w1->refnum < w2->refnum ? -1 : 1; } GSList *windows_get_sorted(void) { - GSList *tmp, *sorted; + GSequenceIter *iter, *begin; + GSList *sorted; sorted = NULL; - for (tmp = windows; tmp != NULL; tmp = tmp->next) { - WINDOW_REC *rec = tmp->data; + for (iter = g_sequence_get_end_iter(windows_seq), + begin = g_sequence_get_begin_iter(windows_seq); - sorted = g_slist_insert_sorted(sorted, rec, (GCompareFunc) - window_refnum_cmp); + iter != begin; + + ) { + iter = g_sequence_iter_prev(iter); + WINDOW_REC *rec = g_sequence_get(iter); + + sorted = g_slist_prepend(sorted, rec); } return sorted; @@ -709,6 +790,7 @@ static void read_settings(void) void windows_init(void) { active_win = NULL; + windows_seq = g_sequence_new(NULL); daycheck = 0; daytag = -1; settings_add_bool("lookandfeel", "window_auto_change", FALSE); settings_add_bool("lookandfeel", "windows_auto_renumber", TRUE); @@ -733,4 +815,6 @@ void windows_deinit(void) signal_remove("server disconnected", (SIGNAL_FUNC) sig_server_disconnected); signal_remove("server connect failed", (SIGNAL_FUNC) sig_server_disconnected); signal_remove("setup changed", (SIGNAL_FUNC) read_settings); + g_sequence_free(windows_seq); + windows_seq = NULL; } From 365097319f2bf57d7d01c2c4c912fca124fbedf9 Mon Sep 17 00:00:00 2001 From: ailin-nemui Date: Tue, 13 Dec 2016 03:04:01 +0100 Subject: [PATCH 2/7] manually redraw the activity list on expose only might speed up /foreach query /unquery --- src/fe-text/statusbar-items.c | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/fe-text/statusbar-items.c b/src/fe-text/statusbar-items.c index 0db4f63a..de4499b4 100644 --- a/src/fe-text/statusbar-items.c +++ b/src/fe-text/statusbar-items.c @@ -143,16 +143,34 @@ static char *get_activity_list(MAIN_WINDOW_REC *window, int normal, int hilight) static void item_act(SBAR_ITEM_REC *item, int get_size_only) { char *actlist; + int max_size; - actlist = get_activity_list(item->bar->parent_window, TRUE, TRUE); - if (actlist == NULL) { - if (get_size_only) + if (get_size_only) { + if (activity_list == NULL) item->min_size = item->max_size = 0; + /* Skip activity calculation on regular trigger, only + set dirty */ return; } - statusbar_item_default_handler(item, get_size_only, + actlist = get_activity_list(item->bar->parent_window, TRUE, TRUE); + if (actlist == NULL) { + return; + } + + max_size = item->max_size; + statusbar_item_default_handler(item, TRUE, NULL, actlist, FALSE); + statusbar_item_default_handler(item, FALSE, + NULL, actlist, FALSE); + if (max_size != item->max_size) { + /* Due to above hack of skipping the calculation, we + need to manually trigger the redraw process now or + we won't see the item */ + item->bar->dirty = item->dirty = TRUE; + statusbar_redraw(item->bar, TRUE); + statusbar_redraw_dirty(); + } g_free_not_null(actlist); } From 2f59fe206233c0f45256e9e541c121f4d63385dd Mon Sep 17 00:00:00 2001 From: ailin-nemui Date: Mon, 19 Dec 2016 22:03:46 +0100 Subject: [PATCH 3/7] add some sequence helper functions --- src/fe-common/core/fe-windows.c | 85 +++++++++++++++++++++++---------- 1 file changed, 60 insertions(+), 25 deletions(-) diff --git a/src/fe-common/core/fe-windows.c b/src/fe-common/core/fe-windows.c index ff45f141..d02048be 100644 --- a/src/fe-common/core/fe-windows.c +++ b/src/fe-common/core/fe-windows.c @@ -42,6 +42,16 @@ static int daytag; static int daycheck; /* 0 = don't check, 1 = time is 00:00, check, 2 = time is 00:00, already checked */ +static GSequenceIter *windows_seq_begin(void) +{ + return g_sequence_get_begin_iter(windows_seq); +} + +static GSequenceIter *windows_seq_end(void) +{ + return g_sequence_get_end_iter(windows_seq); +} + static int window_get_new_refnum(void) { WINDOW_REC *win; @@ -49,8 +59,8 @@ static int window_get_new_refnum(void) int refnum; refnum = 1; - for (iter = g_sequence_get_begin_iter(windows_seq), - end = g_sequence_get_end_iter(windows_seq); + for (iter = windows_seq_begin(), + end = windows_seq_end(); iter != end; @@ -67,6 +77,11 @@ static int window_get_new_refnum(void) return refnum; } +static GSequenceIter *windows_seq_insert(WINDOW_REC *rec) +{ + return g_sequence_insert_sorted(windows_seq, rec, (GCompareDataFunc)window_refnum_cmp, NULL); +} + WINDOW_REC *window_create(WI_ITEM_REC *item, int automatic) { WINDOW_REC *rec; @@ -76,7 +91,7 @@ WINDOW_REC *window_create(WI_ITEM_REC *item, int automatic) rec->level = settings_get_level("window_default_level"); windows = g_slist_prepend(windows, rec); - g_sequence_insert_sorted(windows_seq, rec, (GCompareDataFunc)window_refnum_cmp, NULL); + windows_seq_insert(rec); signal_emit("window created", 2, rec, GINT_TO_POINTER(automatic)); if (item != NULL) window_item_add(rec, item, automatic); @@ -107,6 +122,16 @@ static int window_refnum_lookup(WINDOW_REC *window, void *refnum_p) return window->refnum == refnum ? 0 : window->refnum < refnum ? -1 : 1; } +static GSequenceIter *windows_seq_refnum_lookup(int refnum) +{ + return g_sequence_lookup(windows_seq, GINT_TO_POINTER(refnum), (GCompareDataFunc)window_refnum_lookup, NULL); +} + +static void windows_seq_changed(GSequenceIter *iter) +{ + g_sequence_sort_changed(iter, (GCompareDataFunc)window_refnum_cmp, NULL); +} + /* removed_refnum was removed from the windows list, pack the windows so there won't be any holes. If there is any holes after removed_refnum, leave the windows behind it alone. */ @@ -117,9 +142,9 @@ static void windows_pack(int removed_refnum) GSequenceIter *iter, *end; refnum = removed_refnum+1; - end = g_sequence_get_end_iter(windows_seq); - iter = g_sequence_lookup(windows_seq, GINT_TO_POINTER(refnum), (GCompareDataFunc)window_refnum_lookup, NULL); - if (iter == NULL) iter = end; + end = windows_seq_end(); + iter = windows_seq_refnum_lookup(refnum); + if (iter == NULL) return; for (; iter != end; refnum++, iter = g_sequence_iter_next(iter)) { window = g_sequence_get(iter); @@ -128,10 +153,15 @@ static void windows_pack(int removed_refnum) break; window_set_refnum0(window, refnum-1); - g_sequence_sort_changed(iter, (GCompareDataFunc)window_refnum_cmp, NULL); + windows_seq_changed(iter); } } +static GSequenceIter *windows_seq_window_lookup(WINDOW_REC *rec) +{ + return g_sequence_lookup(windows_seq, rec, (GCompareDataFunc)window_refnum_cmp, NULL); +} + void window_destroy(WINDOW_REC *window) { GSequenceIter *iter; @@ -140,7 +170,7 @@ void window_destroy(WINDOW_REC *window) if (window->destroying) return; window->destroying = TRUE; windows = g_slist_remove(windows, window); - iter = g_sequence_lookup(windows_seq, window, (GCompareDataFunc)window_refnum_cmp, NULL); + iter = windows_seq_window_lookup(window); if (iter != NULL) g_sequence_remove(iter); if (active_win == window) { @@ -223,18 +253,18 @@ void window_change_server(WINDOW_REC *window, void *server) void window_set_refnum(WINDOW_REC *window, int refnum) { - GSequenceIter *oiter, *witer; + GSequenceIter *other_iter, *window_iter; int old_refnum; g_return_if_fail(window != NULL); g_return_if_fail(refnum >= 1); if (window->refnum == refnum) return; - oiter = g_sequence_lookup(windows_seq, GINT_TO_POINTER(refnum), (GCompareDataFunc)window_refnum_lookup, NULL); - witer = g_sequence_lookup(windows_seq, GINT_TO_POINTER(window->refnum), (GCompareDataFunc)window_refnum_lookup, NULL); + other_iter = windows_seq_refnum_lookup(refnum); + window_iter = windows_seq_refnum_lookup(window->refnum); - if (oiter != NULL) { - WINDOW_REC *rec = g_sequence_get(oiter); + if (other_iter != NULL) { + WINDOW_REC *rec = g_sequence_get(other_iter); rec->refnum = window->refnum; signal_emit("window refnum changed", 2, rec, GINT_TO_POINTER(refnum)); @@ -244,10 +274,10 @@ void window_set_refnum(WINDOW_REC *window, int refnum) window->refnum = refnum; signal_emit("window refnum changed", 2, window, GINT_TO_POINTER(old_refnum)); - if (witer != NULL && oiter != NULL) { - g_sequence_swap(oiter, witer); + if (window_iter != NULL && other_iter != NULL) { + g_sequence_swap(other_iter, window_iter); } else { - g_sequence_sort_changed(witer, (GCompareDataFunc)window_refnum_cmp, NULL); + windows_seq_changed(window_iter); } } @@ -388,7 +418,7 @@ WINDOW_REC *window_find_refnum(int refnum) { GSequenceIter *iter; - iter = g_sequence_lookup(windows_seq, GINT_TO_POINTER(refnum), (GCompareDataFunc)window_refnum_lookup, NULL); + iter = windows_seq_refnum_lookup(refnum); if (iter != NULL) { WINDOW_REC *rec = g_sequence_get(iter); @@ -438,12 +468,17 @@ WINDOW_REC *window_find_item(SERVER_REC *server, const char *name) return window_item_window(item); } +static GSequenceIter *windows_seq_refnum_search_right(int refnum) +{ + return g_sequence_search(windows_seq, GINT_TO_POINTER(refnum), (GCompareDataFunc)window_refnum_lookup, NULL); +} + int window_refnum_prev(int refnum, int wrap) { GSequenceIter *iter, *end; - iter = g_sequence_search(windows_seq, GINT_TO_POINTER(refnum-1), (GCompareDataFunc)window_refnum_lookup, NULL); - end = g_sequence_get_end_iter(windows_seq); + iter = windows_seq_refnum_search_right(refnum-1); + end = windows_seq_end(); if (iter != NULL) { WINDOW_REC *rec; @@ -478,8 +513,8 @@ int window_refnum_next(int refnum, int wrap) { GSequenceIter *iter, *end; - iter = g_sequence_search(windows_seq, GINT_TO_POINTER(refnum), (GCompareDataFunc)window_refnum_lookup, NULL); - end = g_sequence_get_end_iter(windows_seq); + iter = windows_seq_refnum_search_right(refnum); + end = windows_seq_end(); if (iter != NULL && iter != end) { WINDOW_REC *rec = g_sequence_get(iter); @@ -498,7 +533,7 @@ int window_refnum_next(int refnum, int wrap) if (wrap) { WINDOW_REC *rec; - iter = g_sequence_get_begin_iter(windows_seq); + iter = windows_seq_begin(); if (iter != end) { rec = g_sequence_get(iter); @@ -514,7 +549,7 @@ int windows_refnum_last(void) GSequenceIter *end, *iter; WINDOW_REC *rec; - end = g_sequence_get_end_iter(windows_seq); + end = windows_seq_end(); iter = g_sequence_iter_prev(end); if (iter != end) { rec = g_sequence_get(iter); @@ -536,8 +571,8 @@ GSList *windows_get_sorted(void) GSList *sorted; sorted = NULL; - for (iter = g_sequence_get_end_iter(windows_seq), - begin = g_sequence_get_begin_iter(windows_seq); + for (iter = windows_seq_end(), + begin = windows_seq_begin(); iter != begin; From 9004265e5417c509e55c5141d5880ebd1e1c3281 Mon Sep 17 00:00:00 2001 From: ailin-nemui Date: Tue, 20 Dec 2016 21:01:16 +0100 Subject: [PATCH 4/7] clean up window_refnum_{prev,next} --- src/fe-common/core/fe-windows.c | 46 ++++++++++----------------------- 1 file changed, 14 insertions(+), 32 deletions(-) diff --git a/src/fe-common/core/fe-windows.c b/src/fe-common/core/fe-windows.c index d02048be..97034192 100644 --- a/src/fe-common/core/fe-windows.c +++ b/src/fe-common/core/fe-windows.c @@ -473,35 +473,29 @@ static GSequenceIter *windows_seq_refnum_search_right(int refnum) return g_sequence_search(windows_seq, GINT_TO_POINTER(refnum), (GCompareDataFunc)window_refnum_lookup, NULL); } +static GSequenceIter *windows_seq_refnum_search_left(int refnum) +{ + GSequenceIter *iter = windows_seq_refnum_search_right(refnum-1); + return iter == windows_seq_begin() ? NULL : g_sequence_iter_prev(iter); +} + int window_refnum_prev(int refnum, int wrap) { + WINDOW_REC *rec; GSequenceIter *iter, *end; - iter = windows_seq_refnum_search_right(refnum-1); + iter = windows_seq_refnum_search_left(refnum); end = windows_seq_end(); if (iter != NULL) { - WINDOW_REC *rec; - if (iter != end) { - rec = g_sequence_get(iter); - - if (rec->refnum < refnum) - return rec->refnum; - } - - iter = g_sequence_iter_prev(iter); rec = g_sequence_get(iter); - - if (rec->refnum < refnum) - return rec->refnum; + return rec->refnum; } if (wrap) { - WINDOW_REC *rec; iter = g_sequence_iter_prev(end); if (iter != end) { rec = g_sequence_get(iter); - return rec->refnum; } } @@ -511,32 +505,21 @@ int window_refnum_prev(int refnum, int wrap) int window_refnum_next(int refnum, int wrap) { + WINDOW_REC *rec; GSequenceIter *iter, *end; iter = windows_seq_refnum_search_right(refnum); end = windows_seq_end(); - if (iter != NULL && iter != end) { - WINDOW_REC *rec = g_sequence_get(iter); - - if (rec->refnum > refnum) - return rec->refnum; - - iter = g_sequence_iter_next(iter); - if (iter != end) { - rec = g_sequence_get(iter); - - if (rec->refnum > refnum) - return rec->refnum; - } + if (iter != end) { + rec = g_sequence_get(iter); + return rec->refnum; } if (wrap) { - WINDOW_REC *rec; iter = windows_seq_begin(); if (iter != end) { rec = g_sequence_get(iter); - return rec->refnum; } } @@ -546,14 +529,13 @@ int window_refnum_next(int refnum, int wrap) int windows_refnum_last(void) { - GSequenceIter *end, *iter; WINDOW_REC *rec; + GSequenceIter *end, *iter; end = windows_seq_end(); iter = g_sequence_iter_prev(end); if (iter != end) { rec = g_sequence_get(iter); - return rec->refnum; } From 03f5dc63fee7c60bb5d5c29698c975073e365b88 Mon Sep 17 00:00:00 2001 From: ailin-nemui Date: Tue, 20 Dec 2016 21:33:51 +0100 Subject: [PATCH 5/7] nits --- src/fe-common/core/fe-windows.c | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/src/fe-common/core/fe-windows.c b/src/fe-common/core/fe-windows.c index 97034192..bd289d2f 100644 --- a/src/fe-common/core/fe-windows.c +++ b/src/fe-common/core/fe-windows.c @@ -59,19 +59,17 @@ static int window_get_new_refnum(void) int refnum; refnum = 1; - for (iter = windows_seq_begin(), - end = windows_seq_end(); - - iter != end; - - refnum++, - iter = g_sequence_iter_next(iter)) { + iter = windows_seq_begin(); + end = windows_seq_end(); + while (iter != end) { win = g_sequence_get(iter); - if (refnum != win->refnum) { + if (refnum != win->refnum) return refnum; - } + + refnum++; + iter = g_sequence_iter_next(iter); } return refnum; @@ -141,7 +139,7 @@ static void windows_pack(int removed_refnum) int refnum; GSequenceIter *iter, *end; - refnum = removed_refnum+1; + refnum = removed_refnum + 1; end = windows_seq_end(); iter = windows_seq_refnum_lookup(refnum); if (iter == NULL) return; @@ -152,7 +150,7 @@ static void windows_pack(int removed_refnum) if (window == NULL || window->sticky_refnum || window->refnum != refnum) break; - window_set_refnum0(window, refnum-1); + window_set_refnum0(window, refnum - 1); windows_seq_changed(iter); } } @@ -468,14 +466,19 @@ WINDOW_REC *window_find_item(SERVER_REC *server, const char *name) return window_item_window(item); } +/* search to the numerically right iterator of refnum */ static GSequenceIter *windows_seq_refnum_search_right(int refnum) { return g_sequence_search(windows_seq, GINT_TO_POINTER(refnum), (GCompareDataFunc)window_refnum_lookup, NULL); } +/* we want to find the numerically left iterator of refnum, so we + search the right of the previous refnum. but we need to figure out + the case where the iterator is already at the beginning, i.e + iter->refnum >= refnum */ static GSequenceIter *windows_seq_refnum_search_left(int refnum) { - GSequenceIter *iter = windows_seq_refnum_search_right(refnum-1); + GSequenceIter *iter = windows_seq_refnum_search_right(refnum - 1); return iter == windows_seq_begin() ? NULL : g_sequence_iter_prev(iter); } From 9a018a782c40ed9da88ae88a7f1c01265f3342de Mon Sep 17 00:00:00 2001 From: ailin-nemui Date: Tue, 20 Dec 2016 21:36:56 +0100 Subject: [PATCH 6/7] sort windows_seq helpers to top --- src/fe-common/core/fe-windows.c | 84 ++++++++++++++++----------------- 1 file changed, 42 insertions(+), 42 deletions(-) diff --git a/src/fe-common/core/fe-windows.c b/src/fe-common/core/fe-windows.c index bd289d2f..248cd621 100644 --- a/src/fe-common/core/fe-windows.c +++ b/src/fe-common/core/fe-windows.c @@ -42,6 +42,12 @@ static int daytag; static int daycheck; /* 0 = don't check, 1 = time is 00:00, check, 2 = time is 00:00, already checked */ +static int window_refnum_lookup(WINDOW_REC *window, void *refnum_p) +{ + int refnum = GPOINTER_TO_INT(refnum_p); + return window->refnum == refnum ? 0 : window->refnum < refnum ? -1 : 1; +} + static GSequenceIter *windows_seq_begin(void) { return g_sequence_get_begin_iter(windows_seq); @@ -52,6 +58,42 @@ static GSequenceIter *windows_seq_end(void) return g_sequence_get_end_iter(windows_seq); } +static GSequenceIter *windows_seq_insert(WINDOW_REC *rec) +{ + return g_sequence_insert_sorted(windows_seq, rec, (GCompareDataFunc)window_refnum_cmp, NULL); +} + +static GSequenceIter *windows_seq_refnum_lookup(int refnum) +{ + return g_sequence_lookup(windows_seq, GINT_TO_POINTER(refnum), (GCompareDataFunc)window_refnum_lookup, NULL); +} + +static void windows_seq_changed(GSequenceIter *iter) +{ + g_sequence_sort_changed(iter, (GCompareDataFunc)window_refnum_cmp, NULL); +} + +static GSequenceIter *windows_seq_window_lookup(WINDOW_REC *rec) +{ + return g_sequence_lookup(windows_seq, rec, (GCompareDataFunc)window_refnum_cmp, NULL); +} + +/* search to the numerically right iterator of refnum */ +static GSequenceIter *windows_seq_refnum_search_right(int refnum) +{ + return g_sequence_search(windows_seq, GINT_TO_POINTER(refnum), (GCompareDataFunc)window_refnum_lookup, NULL); +} + +/* we want to find the numerically left iterator of refnum, so we + search the right of the previous refnum. but we need to figure out + the case where the iterator is already at the beginning, i.e + iter->refnum >= refnum */ +static GSequenceIter *windows_seq_refnum_search_left(int refnum) +{ + GSequenceIter *iter = windows_seq_refnum_search_right(refnum - 1); + return iter == windows_seq_begin() ? NULL : g_sequence_iter_prev(iter); +} + static int window_get_new_refnum(void) { WINDOW_REC *win; @@ -75,11 +117,6 @@ static int window_get_new_refnum(void) return refnum; } -static GSequenceIter *windows_seq_insert(WINDOW_REC *rec) -{ - return g_sequence_insert_sorted(windows_seq, rec, (GCompareDataFunc)window_refnum_cmp, NULL); -} - WINDOW_REC *window_create(WI_ITEM_REC *item, int automatic) { WINDOW_REC *rec; @@ -114,22 +151,6 @@ static void window_set_refnum0(WINDOW_REC *window, int refnum) signal_emit("window refnum changed", 2, window, GINT_TO_POINTER(old_refnum)); } -static int window_refnum_lookup(WINDOW_REC *window, void *refnum_p) -{ - int refnum = GPOINTER_TO_INT(refnum_p); - return window->refnum == refnum ? 0 : window->refnum < refnum ? -1 : 1; -} - -static GSequenceIter *windows_seq_refnum_lookup(int refnum) -{ - return g_sequence_lookup(windows_seq, GINT_TO_POINTER(refnum), (GCompareDataFunc)window_refnum_lookup, NULL); -} - -static void windows_seq_changed(GSequenceIter *iter) -{ - g_sequence_sort_changed(iter, (GCompareDataFunc)window_refnum_cmp, NULL); -} - /* removed_refnum was removed from the windows list, pack the windows so there won't be any holes. If there is any holes after removed_refnum, leave the windows behind it alone. */ @@ -155,11 +176,6 @@ static void windows_pack(int removed_refnum) } } -static GSequenceIter *windows_seq_window_lookup(WINDOW_REC *rec) -{ - return g_sequence_lookup(windows_seq, rec, (GCompareDataFunc)window_refnum_cmp, NULL); -} - void window_destroy(WINDOW_REC *window) { GSequenceIter *iter; @@ -466,22 +482,6 @@ WINDOW_REC *window_find_item(SERVER_REC *server, const char *name) return window_item_window(item); } -/* search to the numerically right iterator of refnum */ -static GSequenceIter *windows_seq_refnum_search_right(int refnum) -{ - return g_sequence_search(windows_seq, GINT_TO_POINTER(refnum), (GCompareDataFunc)window_refnum_lookup, NULL); -} - -/* we want to find the numerically left iterator of refnum, so we - search the right of the previous refnum. but we need to figure out - the case where the iterator is already at the beginning, i.e - iter->refnum >= refnum */ -static GSequenceIter *windows_seq_refnum_search_left(int refnum) -{ - GSequenceIter *iter = windows_seq_refnum_search_right(refnum - 1); - return iter == windows_seq_begin() ? NULL : g_sequence_iter_prev(iter); -} - int window_refnum_prev(int refnum, int wrap) { WINDOW_REC *rec; From 9151f87145e6c9ea40192e0e7c8266eacaaa335f Mon Sep 17 00:00:00 2001 From: ailin-nemui Date: Tue, 20 Dec 2016 21:40:18 +0100 Subject: [PATCH 7/7] remove some for loops --- src/fe-common/core/fe-windows.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/fe-common/core/fe-windows.c b/src/fe-common/core/fe-windows.c index 248cd621..0afa2914 100644 --- a/src/fe-common/core/fe-windows.c +++ b/src/fe-common/core/fe-windows.c @@ -165,7 +165,7 @@ static void windows_pack(int removed_refnum) iter = windows_seq_refnum_lookup(refnum); if (iter == NULL) return; - for (; iter != end; refnum++, iter = g_sequence_iter_next(iter)) { + while (iter != end) { window = g_sequence_get(iter); if (window == NULL || window->sticky_refnum || window->refnum != refnum) @@ -173,6 +173,9 @@ static void windows_pack(int removed_refnum) window_set_refnum0(window, refnum - 1); windows_seq_changed(iter); + + refnum++; + iter = g_sequence_iter_next(iter); } } @@ -556,12 +559,10 @@ GSList *windows_get_sorted(void) GSList *sorted; sorted = NULL; - for (iter = windows_seq_end(), - begin = windows_seq_begin(); + iter = windows_seq_end(); + begin = windows_seq_begin(); - iter != begin; - - ) { + while (iter != begin) { iter = g_sequence_iter_prev(iter); WINDOW_REC *rec = g_sequence_get(iter);