mirror of
https://github.com/ZoiteChat/zoitechat.git
synced 2026-03-15 10:10:19 +00:00
Move userlist sorting to frontend
This Fixes possible crashes when the two usertrees get out of sync and a double free occurs. Also now requires restart to change sort orders. Fixes #1252 Fixes #818 (probably)
This commit is contained in:
@@ -88,11 +88,10 @@ void fe_progressbar_start (struct session *sess);
|
||||
void fe_progressbar_end (struct server *serv);
|
||||
void fe_print_text (struct session *sess, char *text, time_t stamp,
|
||||
gboolean no_activity);
|
||||
void fe_userlist_insert (struct session *sess, struct User *newuser, int row, int sel);
|
||||
void fe_userlist_insert (struct session *sess, struct User *newuser, gboolean sel);
|
||||
int fe_userlist_remove (struct session *sess, struct User *user);
|
||||
void fe_userlist_rehash (struct session *sess, struct User *user);
|
||||
void fe_userlist_update (struct session *sess, struct User *user);
|
||||
void fe_userlist_move (struct session *sess, struct User *user, int new_row);
|
||||
void fe_userlist_numbers (struct session *sess);
|
||||
void fe_userlist_clear (struct session *sess);
|
||||
void fe_userlist_set_selected (struct session *sess);
|
||||
|
||||
@@ -37,6 +37,7 @@
|
||||
#endif
|
||||
|
||||
#include "history.h"
|
||||
#include "tree.h"
|
||||
|
||||
#ifdef USE_OPENSSL
|
||||
#include <openssl/ssl.h> /* SSL_() */
|
||||
@@ -369,8 +370,7 @@ typedef struct session
|
||||
guint8 text_strip;
|
||||
|
||||
struct server *server;
|
||||
void *usertree_alpha; /* pure alphabetical tree */
|
||||
void *usertree; /* ordered with Ops first */
|
||||
tree *usertree; /* alphabetical tree */
|
||||
struct User *me; /* points to myself in the usertree */
|
||||
char channel[CHANLEN];
|
||||
char waitchannel[CHANLEN]; /* waiting to join channel (/join sent) */
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
#include "util.h"
|
||||
|
||||
|
||||
static int
|
||||
int
|
||||
nick_cmp_az_ops (server *serv, struct User *user1, struct User *user2)
|
||||
{
|
||||
unsigned int access1 = user1->access;
|
||||
@@ -52,30 +52,12 @@ nick_cmp_az_ops (server *serv, struct User *user1, struct User *user2)
|
||||
return serv->p_cmp (user1->nick, user2->nick);
|
||||
}
|
||||
|
||||
static int
|
||||
int
|
||||
nick_cmp_alpha (struct User *user1, struct User *user2, server *serv)
|
||||
{
|
||||
return serv->p_cmp (user1->nick, user2->nick);
|
||||
}
|
||||
|
||||
static int
|
||||
nick_cmp (struct User *user1, struct User *user2, server *serv)
|
||||
{
|
||||
switch (prefs.hex_gui_ulist_sort)
|
||||
{
|
||||
case 0:
|
||||
return nick_cmp_az_ops (serv, user1, user2);
|
||||
case 1:
|
||||
return serv->p_cmp (user1->nick, user2->nick);
|
||||
case 2:
|
||||
return -1 * nick_cmp_az_ops (serv, user1, user2);
|
||||
case 3:
|
||||
return -1 * serv->p_cmp (user1->nick, user2->nick);
|
||||
default:
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
insert name in appropriate place in linked list. Returns row number or:
|
||||
-1: duplicate
|
||||
@@ -86,11 +68,9 @@ userlist_insertname (session *sess, struct User *newuser)
|
||||
{
|
||||
if (!sess->usertree)
|
||||
{
|
||||
sess->usertree = tree_new ((tree_cmp_func *)nick_cmp, sess->server);
|
||||
sess->usertree_alpha = tree_new ((tree_cmp_func *)nick_cmp_alpha, sess->server);
|
||||
sess->usertree = tree_new ((tree_cmp_func *)nick_cmp_alpha, sess->server);
|
||||
}
|
||||
|
||||
tree_insert (sess->usertree_alpha, newuser);
|
||||
return tree_insert (sess->usertree, newuser);
|
||||
}
|
||||
|
||||
@@ -188,10 +168,8 @@ userlist_free (session *sess)
|
||||
{
|
||||
tree_foreach (sess->usertree, (tree_traverse_func *)free_user, NULL);
|
||||
tree_destroy (sess->usertree);
|
||||
tree_destroy (sess->usertree_alpha);
|
||||
|
||||
sess->usertree = NULL;
|
||||
sess->usertree_alpha = NULL;
|
||||
sess->me = NULL;
|
||||
|
||||
sess->ops = 0;
|
||||
@@ -219,8 +197,8 @@ userlist_find (struct session *sess, const char *name)
|
||||
{
|
||||
int pos;
|
||||
|
||||
if (sess->usertree_alpha)
|
||||
return tree_find (sess->usertree_alpha, name,
|
||||
if (sess->usertree)
|
||||
return tree_find (sess->usertree, name,
|
||||
(tree_cmp_func *)find_cmp, sess->server, &pos);
|
||||
|
||||
return NULL;
|
||||
@@ -283,7 +261,7 @@ userlist_update_mode (session *sess, char *name, char mode, char sign)
|
||||
|
||||
/* remove from binary trees, before we loose track of it */
|
||||
tree_remove (sess->usertree, user, &pos);
|
||||
tree_remove (sess->usertree_alpha, user, &pos);
|
||||
fe_userlist_remove (sess, user);
|
||||
|
||||
/* which bit number is affected? */
|
||||
access = mode_access (sess->server, mode, &prefix);
|
||||
@@ -313,11 +291,8 @@ userlist_update_mode (session *sess, char *name, char mode, char sign)
|
||||
update_counts (sess, user, prefix, level, offset);
|
||||
|
||||
/* insert it back into its new place */
|
||||
tree_insert (sess->usertree_alpha, user);
|
||||
pos = tree_insert (sess->usertree, user);
|
||||
|
||||
/* let GTK move it too */
|
||||
fe_userlist_move (sess, user, pos);
|
||||
tree_insert (sess->usertree, user);
|
||||
fe_userlist_insert (sess, user, FALSE);
|
||||
fe_userlist_numbers (sess);
|
||||
}
|
||||
|
||||
@@ -330,14 +305,12 @@ userlist_change (struct session *sess, char *oldname, char *newname)
|
||||
if (user)
|
||||
{
|
||||
tree_remove (sess->usertree, user, &pos);
|
||||
tree_remove (sess->usertree_alpha, user, &pos);
|
||||
fe_userlist_remove (sess, user);
|
||||
|
||||
safe_strcpy (user->nick, newname, NICKLEN);
|
||||
|
||||
tree_insert (sess->usertree_alpha, user);
|
||||
|
||||
fe_userlist_move (sess, user, tree_insert (sess->usertree, user));
|
||||
fe_userlist_numbers (sess);
|
||||
tree_insert (sess->usertree, user);
|
||||
fe_userlist_insert (sess, user, FALSE);
|
||||
|
||||
return 1;
|
||||
}
|
||||
@@ -376,7 +349,6 @@ userlist_remove_user (struct session *sess, struct User *user)
|
||||
sess->me = NULL;
|
||||
|
||||
tree_remove (sess->usertree, user, &pos);
|
||||
tree_remove (sess->usertree_alpha, user, &pos);
|
||||
free_user (user, NULL);
|
||||
}
|
||||
|
||||
@@ -442,7 +414,7 @@ userlist_add (struct session *sess, char *name, char *hostname,
|
||||
if (user->me)
|
||||
sess->me = user;
|
||||
|
||||
fe_userlist_insert (sess, user, row, FALSE);
|
||||
fe_userlist_insert (sess, user, FALSE);
|
||||
fe_userlist_numbers (sess);
|
||||
}
|
||||
|
||||
@@ -456,7 +428,7 @@ rehash_cb (struct User *user, session *sess)
|
||||
void
|
||||
userlist_rehash (session *sess)
|
||||
{
|
||||
tree_foreach (sess->usertree_alpha, (tree_traverse_func *)rehash_cb, sess);
|
||||
tree_foreach (sess->usertree, (tree_traverse_func *)rehash_cb, sess);
|
||||
}
|
||||
|
||||
static int
|
||||
@@ -471,7 +443,7 @@ userlist_flat_list (session *sess)
|
||||
{
|
||||
GSList *list = NULL;
|
||||
|
||||
tree_foreach (sess->usertree_alpha, (tree_traverse_func *)flat_cb, &list);
|
||||
tree_foreach (sess->usertree, (tree_traverse_func *)flat_cb, &list);
|
||||
return g_slist_reverse (list);
|
||||
}
|
||||
|
||||
@@ -487,6 +459,6 @@ userlist_double_list(session *sess)
|
||||
{
|
||||
GList *list = NULL;
|
||||
|
||||
tree_foreach (sess->usertree_alpha, (tree_traverse_func *)double_cb, &list);
|
||||
tree_foreach (sess->usertree, (tree_traverse_func *)double_cb, &list);
|
||||
return list;
|
||||
}
|
||||
|
||||
@@ -61,5 +61,7 @@ void userlist_update_mode (session *sess, char *name, char mode, char sign);
|
||||
GSList *userlist_flat_list (session *sess);
|
||||
GList *userlist_double_list (session *sess);
|
||||
void userlist_rehash (session *sess);
|
||||
int nick_cmp_az_ops (server *serv, struct User *user1, struct User *user2);
|
||||
int nick_cmp_alpha (struct User *user1, struct User *user2, server *serv);
|
||||
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user