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:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user