No need to always get a fresh list of keys or values.

> The returned data is valid until changes to the hash release those keys.
As of the doc of `g_hash_table_get_keys()` [0].

> The returned data is valid until hash_table is modified.
As of the doc of `g_hash_table_get_values()` [1].

Use this property and create the lists when modifying the hashtable.
The `keys` list is most of the time used sorted, so sort it immediately. In
the cases where it was not used sorted, it does not matter.

This started off by looking into whether this can be improved.
`g_hash_table_foreach()` is discouraged to be used and proposes to use
a `GHashTableIter`. Since our lists are not modified very often it does not
really make sense, so I decided to keep using lists, but allocating
those lists statically instead of per invocation.

Instead of using a list, we could maybe use the `GArray` version, but
I am not sure whether it wouldn't be even better to replace the
`GHashTable` all along to store the `windows` instead.

[0] https://docs.gtk.org/glib/type_func.HashTable.get_keys.html
[1] https://docs.gtk.org/glib/type_func.HashTable.get_values.html

Signed-off-by: Steffen Jaeckel <s@jaeckel.eu>
This commit is contained in:
Steffen Jaeckel
2025-04-01 17:05:31 +02:00
parent a6f1250589
commit 5efec675fd

View File

@@ -57,6 +57,7 @@
#endif #endif
static GHashTable* windows; static GHashTable* windows;
static GList *keys, *values;
static int current; static int current;
static Autocomplete wins_ac; static Autocomplete wins_ac;
static Autocomplete wins_close_ac; static Autocomplete wins_close_ac;
@@ -64,13 +65,35 @@ static Autocomplete wins_close_ac;
static int _wins_cmp_num(gconstpointer a, gconstpointer b); static int _wins_cmp_num(gconstpointer a, gconstpointer b);
static int _wins_get_next_available_num(GList* used); static int _wins_get_next_available_num(GList* used);
static void
_wins_htable_update(void)
{
if (values)
g_list_free(values);
if (keys)
g_list_free(keys);
keys = g_hash_table_get_keys(windows);
keys = g_list_sort(keys, _wins_cmp_num);
values = g_hash_table_get_values(windows);
}
static gboolean
_wins_htable_insert(GHashTable* hash_table,
gpointer key,
gpointer value)
{
gboolean ret = g_hash_table_insert(hash_table, key, value);
_wins_htable_update();
return ret;
}
void void
wins_init(void) wins_init(void)
{ {
windows = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, (GDestroyNotify)win_free); windows = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, (GDestroyNotify)win_free);
ProfWin* console = win_create_console(); ProfWin* console = win_create_console();
g_hash_table_insert(windows, GINT_TO_POINTER(1), console); _wins_htable_insert(windows, GINT_TO_POINTER(1), console);
current = 1; current = 1;
@@ -98,7 +121,6 @@ wins_chat_exists(const char* const barejid)
ProfChatWin* ProfChatWin*
wins_get_chat(const char* const barejid) wins_get_chat(const char* const barejid)
{ {
GList* values = g_hash_table_get_values(windows);
GList* curr = values; GList* curr = values;
while (curr) { while (curr) {
@@ -106,14 +128,12 @@ wins_get_chat(const char* const barejid)
if (window->type == WIN_CHAT) { if (window->type == WIN_CHAT) {
ProfChatWin* chatwin = (ProfChatWin*)window; ProfChatWin* chatwin = (ProfChatWin*)window;
if (g_strcmp0(chatwin->barejid, barejid) == 0) { if (g_strcmp0(chatwin->barejid, barejid) == 0) {
g_list_free(values);
return chatwin; return chatwin;
} }
} }
curr = g_list_next(curr); curr = g_list_next(curr);
} }
g_list_free(values);
return NULL; return NULL;
} }
@@ -127,7 +147,6 @@ GList*
wins_get_chat_unsubscribed(void) wins_get_chat_unsubscribed(void)
{ {
GList* result = NULL; GList* result = NULL;
GList* values = g_hash_table_get_values(windows);
GList* curr = values; GList* curr = values;
while (curr) { while (curr) {
@@ -142,14 +161,12 @@ wins_get_chat_unsubscribed(void)
curr = g_list_next(curr); curr = g_list_next(curr);
} }
g_list_free(values);
return result; return result;
} }
ProfConfWin* ProfConfWin*
wins_get_conf(const char* const roomjid) wins_get_conf(const char* const roomjid)
{ {
GList* values = g_hash_table_get_values(windows);
GList* curr = values; GList* curr = values;
while (curr) { while (curr) {
@@ -157,21 +174,18 @@ wins_get_conf(const char* const roomjid)
if (window->type == WIN_CONFIG) { if (window->type == WIN_CONFIG) {
ProfConfWin* confwin = (ProfConfWin*)window; ProfConfWin* confwin = (ProfConfWin*)window;
if (g_strcmp0(confwin->roomjid, roomjid) == 0) { if (g_strcmp0(confwin->roomjid, roomjid) == 0) {
g_list_free(values);
return confwin; return confwin;
} }
} }
curr = g_list_next(curr); curr = g_list_next(curr);
} }
g_list_free(values);
return NULL; return NULL;
} }
ProfMucWin* ProfMucWin*
wins_get_muc(const char* const roomjid) wins_get_muc(const char* const roomjid)
{ {
GList* values = g_hash_table_get_values(windows);
GList* curr = values; GList* curr = values;
while (curr) { while (curr) {
@@ -179,21 +193,18 @@ wins_get_muc(const char* const roomjid)
if (window->type == WIN_MUC) { if (window->type == WIN_MUC) {
ProfMucWin* mucwin = (ProfMucWin*)window; ProfMucWin* mucwin = (ProfMucWin*)window;
if (g_strcmp0(mucwin->roomjid, roomjid) == 0) { if (g_strcmp0(mucwin->roomjid, roomjid) == 0) {
g_list_free(values);
return mucwin; return mucwin;
} }
} }
curr = g_list_next(curr); curr = g_list_next(curr);
} }
g_list_free(values);
return NULL; return NULL;
} }
ProfPrivateWin* ProfPrivateWin*
wins_get_private(const char* const fulljid) wins_get_private(const char* const fulljid)
{ {
GList* values = g_hash_table_get_values(windows);
GList* curr = values; GList* curr = values;
while (curr) { while (curr) {
@@ -201,21 +212,18 @@ wins_get_private(const char* const fulljid)
if (window->type == WIN_PRIVATE) { if (window->type == WIN_PRIVATE) {
ProfPrivateWin* privatewin = (ProfPrivateWin*)window; ProfPrivateWin* privatewin = (ProfPrivateWin*)window;
if (g_strcmp0(privatewin->fulljid, fulljid) == 0) { if (g_strcmp0(privatewin->fulljid, fulljid) == 0) {
g_list_free(values);
return privatewin; return privatewin;
} }
} }
curr = g_list_next(curr); curr = g_list_next(curr);
} }
g_list_free(values);
return NULL; return NULL;
} }
ProfPluginWin* ProfPluginWin*
wins_get_plugin(const char* const tag) wins_get_plugin(const char* const tag)
{ {
GList* values = g_hash_table_get_values(windows);
GList* curr = values; GList* curr = values;
while (curr) { while (curr) {
@@ -223,14 +231,12 @@ wins_get_plugin(const char* const tag)
if (window->type == WIN_PLUGIN) { if (window->type == WIN_PLUGIN) {
ProfPluginWin* pluginwin = (ProfPluginWin*)window; ProfPluginWin* pluginwin = (ProfPluginWin*)window;
if (g_strcmp0(pluginwin->tag, tag) == 0) { if (g_strcmp0(pluginwin->tag, tag) == 0) {
g_list_free(values);
return pluginwin; return pluginwin;
} }
} }
curr = g_list_next(curr); curr = g_list_next(curr);
} }
g_list_free(values);
return NULL; return NULL;
} }
@@ -254,7 +260,6 @@ wins_get_private_chats(const char* const roomjid)
GList* result = NULL; GList* result = NULL;
GString* prefix = g_string_new(roomjid); GString* prefix = g_string_new(roomjid);
g_string_append(prefix, "/"); g_string_append(prefix, "/");
GList* values = g_hash_table_get_values(windows);
GList* curr = values; GList* curr = values;
while (curr) { while (curr) {
@@ -268,7 +273,6 @@ wins_get_private_chats(const char* const roomjid)
curr = g_list_next(curr); curr = g_list_next(curr);
} }
g_list_free(values);
g_string_free(prefix, TRUE); g_string_free(prefix, TRUE);
return result; return result;
} }
@@ -332,7 +336,7 @@ wins_get_current(void)
GList* GList*
wins_get_nums(void) wins_get_nums(void)
{ {
return g_hash_table_get_keys(windows); return g_list_copy(keys);
} }
void void
@@ -431,11 +435,7 @@ wins_get_by_string(const char* str)
ProfWin* ProfWin*
wins_get_next(void) wins_get_next(void)
{ {
// get and sort win nums
GList* keys = g_hash_table_get_keys(windows);
keys = g_list_sort(keys, _wins_cmp_num);
GList* curr = keys; GList* curr = keys;
// find our place in the list // find our place in the list
while (curr) { while (curr) {
if (current == GPOINTER_TO_INT(curr->data)) { if (current == GPOINTER_TO_INT(curr->data)) {
@@ -448,23 +448,16 @@ wins_get_next(void)
curr = g_list_next(curr); curr = g_list_next(curr);
if (curr) { if (curr) {
int next = GPOINTER_TO_INT(curr->data); int next = GPOINTER_TO_INT(curr->data);
g_list_free(keys);
return wins_get_by_num(next); return wins_get_by_num(next);
// otherwise return the first window (console)
} else {
g_list_free(keys);
return wins_get_console();
} }
// otherwise return the first window (console)
return wins_get_console();
} }
ProfWin* ProfWin*
wins_get_previous(void) wins_get_previous(void)
{ {
// get and sort win nums
GList* keys = g_hash_table_get_keys(windows);
keys = g_list_sort(keys, _wins_cmp_num);
GList* curr = keys; GList* curr = keys;
// find our place in the list // find our place in the list
while (curr) { while (curr) {
if (current == GPOINTER_TO_INT(curr->data)) { if (current == GPOINTER_TO_INT(curr->data)) {
@@ -477,33 +470,27 @@ wins_get_previous(void)
curr = g_list_previous(curr); curr = g_list_previous(curr);
if (curr) { if (curr) {
int previous = GPOINTER_TO_INT(curr->data); int previous = GPOINTER_TO_INT(curr->data);
g_list_free(keys);
return wins_get_by_num(previous); return wins_get_by_num(previous);
// otherwise return the last window
} else {
int new_num = GPOINTER_TO_INT(g_list_last(keys)->data);
g_list_free(keys);
return wins_get_by_num(new_num);
} }
// otherwise return the last window
int new_num = GPOINTER_TO_INT(g_list_last(keys)->data);
return wins_get_by_num(new_num);
} }
int int
wins_get_num(ProfWin* window) wins_get_num(ProfWin* window)
{ {
GList* keys = g_hash_table_get_keys(windows);
GList* curr = keys; GList* curr = keys;
while (curr) { while (curr) {
gconstpointer num_p = curr->data; gconstpointer num_p = curr->data;
ProfWin* curr_win = g_hash_table_lookup(windows, num_p); ProfWin* curr_win = g_hash_table_lookup(windows, num_p);
if (curr_win == window) { if (curr_win == window) {
g_list_free(keys);
return GPOINTER_TO_INT(num_p); return GPOINTER_TO_INT(num_p);
} }
curr = g_list_next(curr); curr = g_list_next(curr);
} }
g_list_free(keys);
return -1; return -1;
} }
@@ -596,6 +583,7 @@ wins_close_by_num(int i)
} }
g_hash_table_remove(windows, GINT_TO_POINTER(i)); g_hash_table_remove(windows, GINT_TO_POINTER(i));
_wins_htable_update();
status_bar_inactive(i); status_bar_inactive(i);
} }
} }
@@ -615,11 +603,9 @@ wins_is_current(ProfWin* window)
ProfWin* ProfWin*
wins_new_xmlconsole(void) wins_new_xmlconsole(void)
{ {
GList* keys = g_hash_table_get_keys(windows);
int result = _wins_get_next_available_num(keys); int result = _wins_get_next_available_num(keys);
g_list_free(keys);
ProfWin* newwin = win_create_xmlconsole(); ProfWin* newwin = win_create_xmlconsole();
g_hash_table_insert(windows, GINT_TO_POINTER(result), newwin); _wins_htable_insert(windows, GINT_TO_POINTER(result), newwin);
autocomplete_add(wins_ac, "xmlconsole"); autocomplete_add(wins_ac, "xmlconsole");
autocomplete_add(wins_close_ac, "xmlconsole"); autocomplete_add(wins_close_ac, "xmlconsole");
return newwin; return newwin;
@@ -628,11 +614,9 @@ wins_new_xmlconsole(void)
ProfWin* ProfWin*
wins_new_chat(const char* const barejid) wins_new_chat(const char* const barejid)
{ {
GList* keys = g_hash_table_get_keys(windows);
int result = _wins_get_next_available_num(keys); int result = _wins_get_next_available_num(keys);
g_list_free(keys);
ProfWin* newwin = win_create_chat(barejid); ProfWin* newwin = win_create_chat(barejid);
g_hash_table_insert(windows, GINT_TO_POINTER(result), newwin); _wins_htable_insert(windows, GINT_TO_POINTER(result), newwin);
autocomplete_add(wins_ac, barejid); autocomplete_add(wins_ac, barejid);
autocomplete_add(wins_close_ac, barejid); autocomplete_add(wins_close_ac, barejid);
@@ -653,11 +637,9 @@ wins_new_chat(const char* const barejid)
ProfWin* ProfWin*
wins_new_muc(const char* const roomjid) wins_new_muc(const char* const roomjid)
{ {
GList* keys = g_hash_table_get_keys(windows);
int result = _wins_get_next_available_num(keys); int result = _wins_get_next_available_num(keys);
g_list_free(keys);
ProfWin* newwin = win_create_muc(roomjid); ProfWin* newwin = win_create_muc(roomjid);
g_hash_table_insert(windows, GINT_TO_POINTER(result), newwin); _wins_htable_insert(windows, GINT_TO_POINTER(result), newwin);
autocomplete_add(wins_ac, roomjid); autocomplete_add(wins_ac, roomjid);
autocomplete_add(wins_close_ac, roomjid); autocomplete_add(wins_close_ac, roomjid);
newwin->urls_ac = autocomplete_new(); newwin->urls_ac = autocomplete_new();
@@ -669,11 +651,9 @@ wins_new_muc(const char* const roomjid)
ProfWin* ProfWin*
wins_new_config(const char* const roomjid, DataForm* form, ProfConfWinCallback submit, ProfConfWinCallback cancel, const void* userdata) wins_new_config(const char* const roomjid, DataForm* form, ProfConfWinCallback submit, ProfConfWinCallback cancel, const void* userdata)
{ {
GList* keys = g_hash_table_get_keys(windows);
int result = _wins_get_next_available_num(keys); int result = _wins_get_next_available_num(keys);
g_list_free(keys);
ProfWin* newwin = win_create_config(roomjid, form, submit, cancel, userdata); ProfWin* newwin = win_create_config(roomjid, form, submit, cancel, userdata);
g_hash_table_insert(windows, GINT_TO_POINTER(result), newwin); _wins_htable_insert(windows, GINT_TO_POINTER(result), newwin);
return newwin; return newwin;
} }
@@ -681,11 +661,9 @@ wins_new_config(const char* const roomjid, DataForm* form, ProfConfWinCallback s
ProfWin* ProfWin*
wins_new_private(const char* const fulljid) wins_new_private(const char* const fulljid)
{ {
GList* keys = g_hash_table_get_keys(windows);
int result = _wins_get_next_available_num(keys); int result = _wins_get_next_available_num(keys);
g_list_free(keys);
ProfWin* newwin = win_create_private(fulljid); ProfWin* newwin = win_create_private(fulljid);
g_hash_table_insert(windows, GINT_TO_POINTER(result), newwin); _wins_htable_insert(windows, GINT_TO_POINTER(result), newwin);
autocomplete_add(wins_ac, fulljid); autocomplete_add(wins_ac, fulljid);
autocomplete_add(wins_close_ac, fulljid); autocomplete_add(wins_close_ac, fulljid);
newwin->urls_ac = autocomplete_new(); newwin->urls_ac = autocomplete_new();
@@ -697,11 +675,9 @@ wins_new_private(const char* const fulljid)
ProfWin* ProfWin*
wins_new_plugin(const char* const plugin_name, const char* const tag) wins_new_plugin(const char* const plugin_name, const char* const tag)
{ {
GList* keys = g_hash_table_get_keys(windows);
int result = _wins_get_next_available_num(keys); int result = _wins_get_next_available_num(keys);
g_list_free(keys);
ProfWin* newwin = win_create_plugin(plugin_name, tag); ProfWin* newwin = win_create_plugin(plugin_name, tag);
g_hash_table_insert(windows, GINT_TO_POINTER(result), newwin); _wins_htable_insert(windows, GINT_TO_POINTER(result), newwin);
autocomplete_add(wins_ac, tag); autocomplete_add(wins_ac, tag);
autocomplete_add(wins_close_ac, tag); autocomplete_add(wins_close_ac, tag);
return newwin; return newwin;
@@ -710,11 +686,9 @@ wins_new_plugin(const char* const plugin_name, const char* const tag)
ProfWin* ProfWin*
wins_new_vcard(vCard* vcard) wins_new_vcard(vCard* vcard)
{ {
GList* keys = g_hash_table_get_keys(windows);
int result = _wins_get_next_available_num(keys); int result = _wins_get_next_available_num(keys);
g_list_free(keys);
ProfWin* newwin = win_create_vcard(vcard); ProfWin* newwin = win_create_vcard(vcard);
g_hash_table_insert(windows, GINT_TO_POINTER(result), newwin); _wins_htable_insert(windows, GINT_TO_POINTER(result), newwin);
return newwin; return newwin;
} }
@@ -722,18 +696,15 @@ wins_new_vcard(vCard* vcard)
gboolean gboolean
wins_do_notify_remind(void) wins_do_notify_remind(void)
{ {
GList* values = g_hash_table_get_values(windows);
GList* curr = values; GList* curr = values;
while (curr) { while (curr) {
ProfWin* window = curr->data; ProfWin* window = curr->data;
if (win_notify_remind(window)) { if (win_notify_remind(window)) {
g_list_free(values);
return TRUE; return TRUE;
} }
curr = g_list_next(curr); curr = g_list_next(curr);
} }
g_list_free(values);
return FALSE; return FALSE;
} }
@@ -741,7 +712,6 @@ int
wins_get_total_unread(void) wins_get_total_unread(void)
{ {
int result = 0; int result = 0;
GList* values = g_hash_table_get_values(windows);
GList* curr = values; GList* curr = values;
while (curr) { while (curr) {
@@ -749,21 +719,18 @@ wins_get_total_unread(void)
result += win_unread(window); result += win_unread(window);
curr = g_list_next(curr); curr = g_list_next(curr);
} }
g_list_free(values);
return result; return result;
} }
void void
wins_resize_all(void) wins_resize_all(void)
{ {
GList* values = g_hash_table_get_values(windows);
GList* curr = values; GList* curr = values;
while (curr) { while (curr) {
ProfWin* window = curr->data; ProfWin* window = curr->data;
win_resize(window); win_resize(window);
curr = g_list_next(curr); curr = g_list_next(curr);
} }
g_list_free(values);
ProfWin* current_win = wins_get_current(); ProfWin* current_win = wins_get_current();
win_update_virtual(current_win); win_update_virtual(current_win);
@@ -795,7 +762,6 @@ wins_show_subwin(ProfWin* window)
ProfXMLWin* ProfXMLWin*
wins_get_xmlconsole(void) wins_get_xmlconsole(void)
{ {
GList* values = g_hash_table_get_values(windows);
GList* curr = values; GList* curr = values;
while (curr) { while (curr) {
@@ -803,20 +769,17 @@ wins_get_xmlconsole(void)
if (window->type == WIN_XML) { if (window->type == WIN_XML) {
ProfXMLWin* xmlwin = (ProfXMLWin*)window; ProfXMLWin* xmlwin = (ProfXMLWin*)window;
assert(xmlwin->memcheck == PROFXMLWIN_MEMCHECK); assert(xmlwin->memcheck == PROFXMLWIN_MEMCHECK);
g_list_free(values);
return xmlwin; return xmlwin;
} }
curr = g_list_next(curr); curr = g_list_next(curr);
} }
g_list_free(values);
return NULL; return NULL;
} }
ProfVcardWin* ProfVcardWin*
wins_get_vcard(void) wins_get_vcard(void)
{ {
GList* values = g_hash_table_get_values(windows);
GList* curr = values; GList* curr = values;
while (curr) { while (curr) {
@@ -824,13 +787,11 @@ wins_get_vcard(void)
if (window->type == WIN_VCARD) { if (window->type == WIN_VCARD) {
ProfVcardWin* vcardwin = (ProfVcardWin*)window; ProfVcardWin* vcardwin = (ProfVcardWin*)window;
assert(vcardwin->memcheck == PROFVCARDWIN_MEMCHECK); assert(vcardwin->memcheck == PROFVCARDWIN_MEMCHECK);
g_list_free(values);
return vcardwin; return vcardwin;
} }
curr = g_list_next(curr); curr = g_list_next(curr);
} }
g_list_free(values);
return NULL; return NULL;
} }
@@ -838,7 +799,6 @@ GSList*
wins_get_chat_recipients(void) wins_get_chat_recipients(void)
{ {
GSList* result = NULL; GSList* result = NULL;
GList* values = g_hash_table_get_values(windows);
GList* curr = values; GList* curr = values;
while (curr) { while (curr) {
@@ -849,7 +809,6 @@ wins_get_chat_recipients(void)
} }
curr = g_list_next(curr); curr = g_list_next(curr);
} }
g_list_free(values);
return result; return result;
} }
@@ -857,7 +816,6 @@ GSList*
wins_get_prune_wins(void) wins_get_prune_wins(void)
{ {
GSList* result = NULL; GSList* result = NULL;
GList* values = g_hash_table_get_values(windows);
GList* curr = values; GList* curr = values;
while (curr) { while (curr) {
@@ -867,14 +825,12 @@ wins_get_prune_wins(void)
} }
curr = g_list_next(curr); curr = g_list_next(curr);
} }
g_list_free(values);
return result; return result;
} }
void void
wins_lost_connection(void) wins_lost_connection(void)
{ {
GList* values = g_hash_table_get_values(windows);
GList* curr = values; GList* curr = values;
while (curr) { while (curr) {
@@ -889,13 +845,11 @@ wins_lost_connection(void)
} }
curr = g_list_next(curr); curr = g_list_next(curr);
} }
g_list_free(values);
} }
void void
wins_reestablished_connection(void) wins_reestablished_connection(void)
{ {
GList* values = g_hash_table_get_values(windows);
GList* curr = values; GList* curr = values;
while (curr) { while (curr) {
@@ -928,7 +882,6 @@ wins_reestablished_connection(void)
} }
curr = g_list_next(curr); curr = g_list_next(curr);
} }
g_list_free(values);
} }
void void
@@ -943,7 +896,7 @@ wins_swap(int source_win, int target_win)
// target window empty // target window empty
if (target == NULL) { if (target == NULL) {
g_hash_table_steal(windows, GINT_TO_POINTER(source_win)); g_hash_table_steal(windows, GINT_TO_POINTER(source_win));
g_hash_table_insert(windows, GINT_TO_POINTER(target_win), source); _wins_htable_insert(windows, GINT_TO_POINTER(target_win), source);
status_bar_inactive(source_win); status_bar_inactive(source_win);
auto_char char* identifier = win_get_tab_identifier(source); auto_char char* identifier = win_get_tab_identifier(source);
if (win_unread(source) > 0) { if (win_unread(source) > 0) {
@@ -961,7 +914,7 @@ wins_swap(int source_win, int target_win)
g_hash_table_steal(windows, GINT_TO_POINTER(source_win)); g_hash_table_steal(windows, GINT_TO_POINTER(source_win));
g_hash_table_steal(windows, GINT_TO_POINTER(target_win)); g_hash_table_steal(windows, GINT_TO_POINTER(target_win));
g_hash_table_insert(windows, GINT_TO_POINTER(source_win), target); g_hash_table_insert(windows, GINT_TO_POINTER(source_win), target);
g_hash_table_insert(windows, GINT_TO_POINTER(target_win), source); _wins_htable_insert(windows, GINT_TO_POINTER(target_win), source);
auto_char char* source_identifier = win_get_tab_identifier(source); auto_char char* source_identifier = win_get_tab_identifier(source);
auto_char char* target_identifier = win_get_tab_identifier(target); auto_char char* target_identifier = win_get_tab_identifier(target);
if (win_unread(source) > 0) { if (win_unread(source) > 0) {
@@ -1011,16 +964,9 @@ _wins_get_next_available_num(GList* used)
if (g_list_length(used) == 1) { if (g_list_length(used) == 1) {
return 2; return 2;
} else { } else {
GList* sorted = NULL;
GList* curr = used; GList* curr = used;
while (curr) {
sorted = g_list_insert_sorted(sorted, curr->data, _wins_cmp_num);
curr = g_list_next(curr);
}
int result = 0; int result = 0;
int last_num = 1; int last_num = 1;
curr = sorted;
// skip console // skip console
curr = g_list_next(curr); curr = g_list_next(curr);
while (curr) { while (curr) {
@@ -1031,7 +977,6 @@ _wins_get_next_available_num(GList* used)
if (result == 10) { if (result == 10) {
result = 0; result = 0;
} }
g_list_free(sorted);
return (result); return (result);
} else { } else {
@@ -1047,7 +992,6 @@ _wins_get_next_available_num(GList* used)
result = 0; result = 0;
} }
g_list_free(sorted);
return result; return result;
} }
} }
@@ -1056,10 +1000,6 @@ gboolean
wins_tidy(void) wins_tidy(void)
{ {
gboolean tidy_required = FALSE; gboolean tidy_required = FALSE;
// check for gaps
GList* keys = g_hash_table_get_keys(windows);
keys = g_list_sort(keys, _wins_cmp_num);
// get last used // get last used
GList* last = g_list_last(keys); GList* last = g_list_last(keys);
int last_num = GPOINTER_TO_INT(last->data); int last_num = GPOINTER_TO_INT(last->data);
@@ -1104,13 +1044,12 @@ wins_tidy(void)
g_hash_table_destroy(windows); g_hash_table_destroy(windows);
windows = new_windows; windows = new_windows;
_wins_htable_update();
current = 1; current = 1;
ProfWin* console = wins_get_console(); ProfWin* console = wins_get_console();
ui_focus_win(console); ui_focus_win(console);
g_list_free(keys);
return TRUE; return TRUE;
} else { } else {
g_list_free(keys);
return FALSE; return FALSE;
} }
} }
@@ -1123,9 +1062,6 @@ wins_create_summary(gboolean unread)
} }
GSList* result = NULL; GSList* result = NULL;
GList* keys = g_hash_table_get_keys(windows);
keys = g_list_sort(keys, _wins_cmp_num);
GList* curr = keys; GList* curr = keys;
while (curr) { while (curr) {
@@ -1149,8 +1085,6 @@ wins_create_summary(gboolean unread)
curr = g_list_next(curr); curr = g_list_next(curr);
} }
g_list_free(keys);
return result; return result;
} }
@@ -1159,8 +1093,6 @@ wins_create_summary_attention()
{ {
GSList* result = NULL; GSList* result = NULL;
GList* keys = g_hash_table_get_keys(windows);
keys = g_list_sort(keys, _wins_cmp_num);
GList* curr = keys; GList* curr = keys;
while (curr) { while (curr) {
@@ -1193,8 +1125,6 @@ wins_create_summary_attention()
curr = g_list_next(curr); curr = g_list_next(curr);
} }
g_list_free(keys);
return result; return result;
} }
@@ -1225,6 +1155,11 @@ win_close_reset_search_attempts(void)
void void
wins_destroy(void) wins_destroy(void)
{ {
if (values)
g_list_free(values);
if (keys)
g_list_free(keys);
values = keys = NULL;
g_hash_table_destroy(windows); g_hash_table_destroy(windows);
windows = NULL; windows = NULL;
autocomplete_free(wins_ac); autocomplete_free(wins_ac);
@@ -1237,9 +1172,7 @@ ProfWin*
wins_get_next_unread(void) wins_get_next_unread(void)
{ {
// get and sort win nums // get and sort win nums
GList* values = g_hash_table_get_keys(windows); GList* curr = keys;
values = g_list_sort(values, _wins_cmp_num);
GList* curr = values;
while (curr) { while (curr) {
int curr_win_num = GPOINTER_TO_INT(curr->data); int curr_win_num = GPOINTER_TO_INT(curr->data);
@@ -1247,14 +1180,12 @@ wins_get_next_unread(void)
// test if window has unread messages // test if window has unread messages
if (win_unread(window) > 0) { if (win_unread(window) > 0) {
g_list_free(values);
return window; return window;
} }
curr = g_list_next(curr); curr = g_list_next(curr);
} }
g_list_free(values);
return NULL; return NULL;
} }
@@ -1262,8 +1193,6 @@ ProfWin*
wins_get_next_attention(void) wins_get_next_attention(void)
{ {
// get and sort win nums // get and sort win nums
GList* values = g_hash_table_get_values(windows);
values = g_list_sort(values, _wins_cmp_num);
GList* curr = values; GList* curr = values;
ProfWin* current_window = wins_get_by_num(current); ProfWin* current_window = wins_get_by_num(current);
@@ -1283,7 +1212,6 @@ wins_get_next_attention(void)
while (current_window && curr) { while (current_window && curr) {
ProfWin* window = curr->data; ProfWin* window = curr->data;
if (win_has_attention(window)) { if (win_has_attention(window)) {
g_list_free(values);
return window; return window;
} }
curr = g_list_next(curr); curr = g_list_next(curr);
@@ -1297,13 +1225,11 @@ wins_get_next_attention(void)
break; break;
} }
if (win_has_attention(window)) { if (win_has_attention(window)) {
g_list_free(values);
return window; return window;
} }
curr = g_list_next(curr); curr = g_list_next(curr);
} }
g_list_free(values);
return NULL; return NULL;
} }