summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/common.h19
-rw-r--r--src/core/channel-rec.h5
-rw-r--r--src/core/channels-setup.h4
-rw-r--r--src/core/channels.h6
-rw-r--r--src/core/chatnets.c10
-rw-r--r--src/core/chatnets.h8
-rw-r--r--src/core/expandos.c2
-rw-r--r--src/core/expandos.h1
-rw-r--r--src/core/ignore.h1
-rw-r--r--src/core/line-split.c4
-rw-r--r--src/core/line-split.h2
-rw-r--r--src/core/log.h2
-rw-r--r--src/core/masks.h2
-rw-r--r--src/core/net-sendbuffer.h2
-rw-r--r--src/core/network.h4
-rw-r--r--src/core/nicklist.c2
-rw-r--r--src/core/nicklist.h7
-rw-r--r--src/core/queries.c1
-rw-r--r--src/core/queries.h6
-rw-r--r--src/core/rawlog.h4
-rw-r--r--src/core/server-rec.h16
-rw-r--r--src/core/servers-reconnect.c1
-rw-r--r--src/core/servers-redirect.h2
-rw-r--r--src/core/servers-setup.h6
-rw-r--r--src/core/servers.h17
-rw-r--r--src/core/settings.h4
-rw-r--r--src/core/special-vars.h1
-rw-r--r--src/core/window-item-def.h4
-rw-r--r--src/core/window-item-rec.h1
-rw-r--r--src/fe-common/core/chat-completion.c276
-rw-r--r--src/fe-common/core/fe-channels.c3
-rw-r--r--src/fe-common/core/fe-common-core.c40
-rw-r--r--src/fe-common/core/fe-exec.c3
-rw-r--r--src/fe-common/core/module.h31
-rw-r--r--src/fe-common/core/window-activity.c1
-rw-r--r--src/fe-common/core/window-items.c11
-rw-r--r--src/fe-common/core/window-items.h3
-rw-r--r--src/fe-text/statusbar-items.c3
-rw-r--r--src/irc/bot/botnet-connection.c2
-rw-r--r--src/irc/bot/botnet.h2
-rw-r--r--src/irc/core/channel-rejoin.c2
-rw-r--r--src/irc/core/channels-query.c4
-rw-r--r--src/irc/core/irc-channels.c22
-rw-r--r--src/irc/core/irc-commands.c2
-rw-r--r--src/irc/core/irc-nicklist.c9
-rw-r--r--src/irc/core/irc-servers.c11
-rw-r--r--src/irc/core/irc.c2
-rw-r--r--src/irc/core/netsplit.c1
-rw-r--r--src/irc/dcc/dcc.h2
-rw-r--r--src/lib-config/iconfig.h8
50 files changed, 316 insertions, 266 deletions
diff --git a/src/common.h b/src/common.h
index 589f0696..7b8ddba2 100644
--- a/src/common.h
+++ b/src/common.h
@@ -62,4 +62,23 @@ int g_input_add_full(GIOChannel *source, int priority, int condition,
#define MAX_INT_STRLEN ((sizeof(int) * CHAR_BIT + 2) / 3 + 1)
+typedef struct _IPADDR IPADDR;
+typedef struct _CONFIG_REC CONFIG_REC;
+typedef struct _CONFIG_NODE CONFIG_NODE;
+
+typedef struct _LINEBUF_REC LINEBUF_REC;
+typedef struct _NET_SENDBUF_REC NET_SENDBUF_REC;
+typedef struct _RAWLOG_REC RAWLOG_REC;
+
+typedef struct _CHATNET_REC CHATNET_REC;
+typedef struct _SERVER_REC SERVER_REC;
+typedef struct _WI_ITEM_REC WI_ITEM_REC;
+typedef struct _CHANNEL_REC CHANNEL_REC;
+typedef struct _QUERY_REC QUERY_REC;
+typedef struct _NICK_REC NICK_REC;
+
+typedef struct _SERVER_CONNECT_REC SERVER_CONNECT_REC;
+typedef struct _SERVER_SETUP_REC SERVER_SETUP_REC;
+typedef struct _CHANNEL_SETUP_REC CHANNEL_SETUP_REC;
+
#endif
diff --git a/src/core/channel-rec.h b/src/core/channel-rec.h
index 2f7c7dec..4e5d17c8 100644
--- a/src/core/channel-rec.h
+++ b/src/core/channel-rec.h
@@ -5,7 +5,9 @@
char *topic;
char *topic_by;
time_t topic_time;
+
GHashTable *nicks; /* list of nicks */
+NICK_REC *ownnick; /* our own nick */
unsigned int no_modes:1; /* channel doesn't support modes */
char *mode;
@@ -21,6 +23,3 @@ unsigned int joined:1; /* Have we even received JOIN event for this channel? */
unsigned int left:1; /* You just left the channel */
unsigned int kicked:1; /* You just got kicked */
unsigned int destroying:1;
-
-GSList *lastmsgs; /* List of nicks who last send message */
-GSList *lastownmsgs; /* List of nicks who last send message to you */
diff --git a/src/core/channels-setup.h b/src/core/channels-setup.h
index acb24242..b07d9a4f 100644
--- a/src/core/channels-setup.h
+++ b/src/core/channels-setup.h
@@ -3,7 +3,7 @@
#include "modules.h"
-typedef struct {
+struct _CHANNEL_SETUP_REC {
char *name;
char *chatnet;
char *password;
@@ -13,7 +13,7 @@ typedef struct {
unsigned int autojoin:1;
GHashTable *module_data;
-} CHANNEL_SETUP_REC;
+};
extern GSList *setupchannels;
diff --git a/src/core/channels.h b/src/core/channels.h
index 1ebf7abb..b571a5d4 100644
--- a/src/core/channels.h
+++ b/src/core/channels.h
@@ -1,7 +1,7 @@
#ifndef __CHANNELS_H
#define __CHANNELS_H
-#include "servers.h"
+#include "modules.h"
/* Returns CHANNEL_REC if it's channel, NULL if it isn't. */
#define CHANNEL(channel) \
@@ -12,9 +12,9 @@
(CHANNEL(channel) ? TRUE : FALSE)
#define STRUCT_SERVER_REC SERVER_REC
-typedef struct {
+struct _CHANNEL_REC {
#include "channel-rec.h"
-} CHANNEL_REC;
+};
extern GSList *channels;
diff --git a/src/core/chatnets.c b/src/core/chatnets.c
index 465eaa66..def9eb68 100644
--- a/src/core/chatnets.c
+++ b/src/core/chatnets.c
@@ -30,10 +30,8 @@
GSList *chatnets; /* list of available chat networks */
-void chatnet_read(CHATNET_REC *chatnet, void *nodep)
+void chatnet_read(CHATNET_REC *chatnet, CONFIG_NODE *node)
{
- CONFIG_NODE *node = nodep;
-
g_return_if_fail(chatnet != NULL);
g_return_if_fail(node != NULL);
g_return_if_fail(node->key != NULL);
@@ -49,11 +47,9 @@ void chatnet_read(CHATNET_REC *chatnet, void *nodep)
chatnets = g_slist_append(chatnets, chatnet);
}
-void *chatnet_save(CHATNET_REC *chatnet, void *parentnode)
+CONFIG_NODE *chatnet_save(CHATNET_REC *chatnet, CONFIG_NODE *node)
{
- CONFIG_NODE *node = parentnode;
-
- g_return_val_if_fail(parentnode != NULL, NULL);
+ g_return_val_if_fail(node != NULL, NULL);
g_return_val_if_fail(chatnet != NULL, NULL);
node = config_node_section(node, chatnet->name, NODE_TYPE_BLOCK);
diff --git a/src/core/chatnets.h b/src/core/chatnets.h
index 7170c478..8a17a451 100644
--- a/src/core/chatnets.h
+++ b/src/core/chatnets.h
@@ -10,15 +10,15 @@
#define IS_CHATNET(chatnet) \
(CHATNET(chatnet) ? TRUE : FALSE)
-typedef struct {
+struct _CHATNET_REC {
#include "chatnet-rec.h"
-} CHATNET_REC;
+};
extern GSList *chatnets; /* list of available chat networks */
/* read/save to configuration file */
-void chatnet_read(CHATNET_REC *chatnet, void *node);
-void *chatnet_save(CHATNET_REC *chatnet, void *parentnode);
+void chatnet_read(CHATNET_REC *chatnet, CONFIG_NODE *node);
+CONFIG_NODE *chatnet_save(CHATNET_REC *chatnet, CONFIG_NODE *parentnode);
/* add the chatnet to chat networks list */
void chatnet_create(CHATNET_REC *chatnet);
diff --git a/src/core/expandos.c b/src/core/expandos.c
index 37f770a3..006dd443 100644
--- a/src/core/expandos.c
+++ b/src/core/expandos.c
@@ -19,6 +19,7 @@
*/
#include "module.h"
+#include "modules.h"
#include "signals.h"
#include "expandos.h"
#include "settings.h"
@@ -26,6 +27,7 @@
#include "misc.h"
#include "irssi-version.h"
+#include "servers.h"
#include "channels.h"
#include "queries.h"
#include "window-item-def.h"
diff --git a/src/core/expandos.h b/src/core/expandos.h
index a937fcd1..3dcb527e 100644
--- a/src/core/expandos.h
+++ b/src/core/expandos.h
@@ -2,7 +2,6 @@
#define __EXPANDOS_H
#include "signals.h"
-#include "servers.h"
/* first argument of signal must match to active .. */
typedef enum {
diff --git a/src/core/ignore.h b/src/core/ignore.h
index db88d9a4..21433a06 100644
--- a/src/core/ignore.h
+++ b/src/core/ignore.h
@@ -1,7 +1,6 @@
#ifndef __IGNORE_H
#define __IGNORE_H
-#include "servers.h"
#ifdef HAVE_REGEX_H
# include <regex.h>
#endif
diff --git a/src/core/line-split.c b/src/core/line-split.c
index 9d4c0ab0..2810a0d5 100644
--- a/src/core/line-split.c
+++ b/src/core/line-split.c
@@ -31,12 +31,12 @@
too high. */
#define MAX_CHARS_IN_LINE 65536
-typedef struct {
+struct _LINEBUF_REC {
int len;
int alloc;
int remove;
char *str;
-} LINEBUF_REC;
+};
static inline int nearest_power(int num)
{
diff --git a/src/core/line-split.h b/src/core/line-split.h
index 56d694c3..7c101ddd 100644
--- a/src/core/line-split.h
+++ b/src/core/line-split.h
@@ -1,8 +1,6 @@
#ifndef __LINE_SPLIT_H
#define __LINE_SPLIT_H
-typedef struct _LINEBUF_REC LINEBUF_REC;
-
/* line-split `data'. Initially `*buffer' should contain NULL. */
int line_split(const char *data, int len, char **output, LINEBUF_REC **buffer);
void line_split_free(LINEBUF_REC *buffer);
diff --git a/src/core/log.h b/src/core/log.h
index 8d151c26..2fd97a1c 100644
--- a/src/core/log.h
+++ b/src/core/log.h
@@ -1,8 +1,6 @@
#ifndef __LOG_H
#define __LOG_H
-#include "servers.h"
-
enum {
LOG_ITEM_TARGET, /* channel, query, .. */
LOG_ITEM_WINDOW_REFNUM
diff --git a/src/core/masks.h b/src/core/masks.h
index 437c8cb4..b6ce20d8 100644
--- a/src/core/masks.h
+++ b/src/core/masks.h
@@ -1,8 +1,6 @@
#ifndef __MASKS_H
#define __MASKS_H
-#include "servers.h"
-
int mask_match(SERVER_REC *server, const char *mask,
const char *nick, const char *user, const char *host);
int mask_match_address(SERVER_REC *server, const char *mask,
diff --git a/src/core/net-sendbuffer.h b/src/core/net-sendbuffer.h
index 54f2e5ba..bb6d8e07 100644
--- a/src/core/net-sendbuffer.h
+++ b/src/core/net-sendbuffer.h
@@ -3,8 +3,6 @@
#define DEFAULT_BUFFER_SIZE 8192
-typedef struct _NET_SENDBUF_REC NET_SENDBUF_REC;
-
/* Create new buffer - if `bufsize' is zero or less, DEFAULT_BUFFER_SIZE
is used */
NET_SENDBUF_REC *net_sendbuffer_create(GIOChannel *handle, int bufsize);
diff --git a/src/core/network.h b/src/core/network.h
index 38484665..159bda3e 100644
--- a/src/core/network.h
+++ b/src/core/network.h
@@ -7,7 +7,7 @@
# include <netinet/in.h>
#endif
-struct _ipaddr {
+struct _IPADDR {
unsigned short family;
union {
#ifdef HAVE_IPV6
@@ -18,8 +18,6 @@ struct _ipaddr {
} addr;
};
-typedef struct _ipaddr IPADDR;
-
/* maxmimum string length of IP address */
#ifdef HAVE_IPV6
# define MAX_IP_LEN INET6_ADDRSTRLEN
diff --git a/src/core/nicklist.c b/src/core/nicklist.c
index 50623dcf..16453330 100644
--- a/src/core/nicklist.c
+++ b/src/core/nicklist.c
@@ -22,6 +22,8 @@
#include "signals.h"
#include "misc.h"
+#include "servers.h"
+#include "channels.h"
#include "nicklist.h"
#include "masks.h"
diff --git a/src/core/nicklist.h b/src/core/nicklist.h
index 5f857e60..6d278a2e 100644
--- a/src/core/nicklist.h
+++ b/src/core/nicklist.h
@@ -1,9 +1,6 @@
#ifndef __NICKLIST_H
#define __NICKLIST_H
-#include "servers.h"
-#include "channels.h"
-
/* Returns NICK_REC if it's nick, NULL if it isn't. */
#define NICK(server) \
MODULE_CHECK_CAST(server, NICK_REC, type, "NICK")
@@ -11,9 +8,9 @@
#define IS_NICK(server) \
(NICK(server) ? TRUE : FALSE)
-typedef struct {
+struct _NICK_REC {
#include "nick-rec.h"
-} NICK_REC;
+};
/* Add new nick to list */
NICK_REC *nicklist_insert(CHANNEL_REC *channel, const char *nick,
diff --git a/src/core/queries.c b/src/core/queries.c
index ca8d78b4..1912faeb 100644
--- a/src/core/queries.c
+++ b/src/core/queries.c
@@ -22,6 +22,7 @@
#include "signals.h"
#include "misc.h"
+#include "servers.h"
#include "queries.h"
GSList *queries;
diff --git a/src/core/queries.h b/src/core/queries.h
index 95fdfdc2..070099c2 100644
--- a/src/core/queries.h
+++ b/src/core/queries.h
@@ -1,7 +1,7 @@
#ifndef __QUERIES_H
#define __QUERIES_H
-#include "servers.h"
+#include "modules.h"
/* Returns QUERY_REC if it's query, NULL if it isn't. */
#define QUERY(query) \
@@ -12,9 +12,9 @@
(QUERY(query) ? TRUE : FALSE)
#define STRUCT_SERVER_REC SERVER_REC
-typedef struct {
+struct _QUERY_REC {
#include "query-rec.h"
-} QUERY_REC;
+};
extern GSList *queries;
diff --git a/src/core/rawlog.h b/src/core/rawlog.h
index 48e48f34..9e460a83 100644
--- a/src/core/rawlog.h
+++ b/src/core/rawlog.h
@@ -1,13 +1,13 @@
#ifndef __RAWLOG_H
#define __RAWLOG_H
-typedef struct {
+struct _RAWLOG_REC {
int logging;
int handle;
int nlines;
GSList *lines;
-} RAWLOG_REC;
+};
RAWLOG_REC *rawlog_create(void);
void rawlog_destroy(RAWLOG_REC *rawlog);
diff --git a/src/core/server-rec.h b/src/core/server-rec.h
index fe10b724..53b9f7f0 100644
--- a/src/core/server-rec.h
+++ b/src/core/server-rec.h
@@ -13,7 +13,7 @@ char *nick; /* current nick */
unsigned int connected:1; /* connected to server */
unsigned int connection_lost:1; /* Connection lost unintentionally */
-void *handle; /* NET_SENDBUF_REC socket */
+NET_SENDBUF_REC *handle;
int readtag; /* input tag */
/* for net_connect_nonblock() */
@@ -26,8 +26,8 @@ GHashTable *eventtable; /* "event xxx" : GSList* of REDIRECT_RECs */
GHashTable *eventgrouptable; /* event group : GSList* of REDIRECT_RECs */
GHashTable *cmdtable; /* "command xxx" : REDIRECT_CMD_REC* */
-void *rawlog;
-void *buffer; /* receive buffer */
+RAWLOG_REC *rawlog;
+LINEBUF_REC *buffer; /* receive buffer */
GHashTable *module_data;
char *version; /* server version */
@@ -41,8 +41,6 @@ time_t lag_sent; /* 0 or time when last lag query was sent to server */
time_t lag_last_check; /* last time we checked lag */
int lag; /* server lag in milliseconds */
-GSList *lastmsgs; /* List of nicks who last send you msg */
-
GSList *channels;
GSList *queries;
@@ -52,7 +50,7 @@ GSList *queries;
/* join to a number of channels, channels are specified in `data' separated
with commas. there can exist other information after first space like
channel keys etc. */
-void (*channels_join)(void *server, const char *data, int automatic);
+void (*channels_join)(SERVER_REC *server, const char *data, int automatic);
/* returns true if `flag' indicates a nick flag (op/voice/halfop) */
int (*isnickflag)(char flag);
/* returns true if `flag' indicates a channel */
@@ -61,11 +59,11 @@ int (*ischannel)(char flag);
of them aren't supported '\0' can be used. */
const char *(*get_nick_flags)(void);
/* send public or private message to server */
-void (*send_message)(void *server, const char *target, const char *msg);
+void (*send_message)(SERVER_REC *server, const char *target, const char *msg);
/* -- Default implementations are used if NULL -- */
-void *(*channel_find_func)(void *server, const char *name);
-void *(*query_find_func)(void *server, const char *nick);
+CHANNEL_REC *(*channel_find_func)(SERVER_REC *server, const char *name);
+QUERY_REC *(*query_find_func)(SERVER_REC *server, const char *nick);
int (*mask_match_func)(const char *mask, const char *data);
/* returns true if `msg' was meant for `nick' */
int (*nick_match_msg)(const char *nick, const char *msg);
diff --git a/src/core/servers-reconnect.c b/src/core/servers-reconnect.c
index 91e4c883..808dd803 100644
--- a/src/core/servers-reconnect.c
+++ b/src/core/servers-reconnect.c
@@ -23,6 +23,7 @@
#include "network.h"
#include "signals.h"
+#include "servers.h"
#include "servers-setup.h"
#include "servers-reconnect.h"
diff --git a/src/core/servers-redirect.h b/src/core/servers-redirect.h
index b47f7b3d..c9e45ce3 100644
--- a/src/core/servers-redirect.h
+++ b/src/core/servers-redirect.h
@@ -1,8 +1,6 @@
#ifndef __SERVERS_REDIRECT_H
#define __SERVERS_REDIRECT_H
-#include "servers.h"
-
typedef struct {
int last; /* number of "last" events at the start of the events list */
GSList *events; /* char* list of events */
diff --git a/src/core/servers-setup.h b/src/core/servers-setup.h
index 4b22c542..55785e80 100644
--- a/src/core/servers-setup.h
+++ b/src/core/servers-setup.h
@@ -1,7 +1,7 @@
#ifndef __SERVERS_SETUP_H
#define __SERVERS_SETUP_H
-#include "servers.h"
+#include "modules.h"
#define SERVER_SETUP(server) \
MODULE_CHECK_CAST(server, SERVER_SETUP_REC, type, "SERVER SETUP")
@@ -10,9 +10,9 @@
(SERVER_SETUP(server) ? TRUE : FALSE)
/* servers */
-typedef struct {
+struct _SERVER_SETUP_REC {
#include "server-setup-rec.h"
-} SERVER_SETUP_REC;
+};
extern GSList *setupservers;
diff --git a/src/core/servers.h b/src/core/servers.h
index e5ea787b..4ed9a34b 100644
--- a/src/core/servers.h
+++ b/src/core/servers.h
@@ -3,10 +3,6 @@
#include "modules.h"
-#ifndef __NETWORK_H
-typedef struct _ipaddr IPADDR;
-#endif
-
/* Returns SERVER_REC if it's server, NULL if it isn't. */
#define SERVER(server) \
MODULE_CHECK_CAST(server, SERVER_REC, type, "SERVER")
@@ -23,19 +19,14 @@ typedef struct _ipaddr IPADDR;
/* all strings should be either NULL or dynamically allocated */
/* address and nick are mandatory, rest are optional */
-typedef struct {
+struct _SERVER_CONNECT_REC {
#include "server-connect-rec.h"
-} SERVER_CONNECT_REC;
+};
#define STRUCT_SERVER_CONNECT_REC SERVER_CONNECT_REC
-typedef struct {
+struct _SERVER_REC {
#include "server-rec.h"
-} SERVER_REC;
-
-typedef struct {
- time_t time;
- char *nick;
-} LAST_MSG_REC;
+};
extern GSList *servers, *lookup_servers;
diff --git a/src/core/settings.h b/src/core/settings.h
index a878fcfb..72cf6193 100644
--- a/src/core/settings.h
+++ b/src/core/settings.h
@@ -1,10 +1,6 @@
#ifndef __SETTINGS_H
#define __SETTINGS_H
-#ifndef __ICONFIG_H
-typedef struct _config_rec CONFIG_REC;
-#endif
-
enum {
SETTING_TYPE_STRING,
SETTING_TYPE_INT,
diff --git a/src/core/special-vars.h b/src/core/special-vars.h
index deb4de40..e55996b1 100644
--- a/src/core/special-vars.h
+++ b/src/core/special-vars.h
@@ -2,7 +2,6 @@
#define __SPECIAL_VARS_H
#include "signals.h"
-#include "servers.h"
#define PARSE_FLAG_GETNAME 0x01 /* return argument name instead of it's value */
#define PARSE_FLAG_ISSET_ANY 0x02 /* arg_used field specifies that at least one of the $variables was non-empty */
diff --git a/src/core/window-item-def.h b/src/core/window-item-def.h
index 5b54414a..4364c66e 100644
--- a/src/core/window-item-def.h
+++ b/src/core/window-item-def.h
@@ -2,8 +2,8 @@
#define __WINDOW_ITEM_DEF_H
#define STRUCT_SERVER_REC SERVER_REC
-typedef struct {
+struct _WI_ITEM_REC {
#include "window-item-rec.h"
-} WI_ITEM_REC;
+};
#endif
diff --git a/src/core/window-item-rec.h b/src/core/window-item-rec.h
index 801a471e..ea5365a9 100644
--- a/src/core/window-item-rec.h
+++ b/src/core/window-item-rec.h
@@ -4,6 +4,7 @@ int type; /* module_get_uniq_id("CHANNEL/QUERY/xxx", 0) */
int chat_type; /* chat_protocol_lookup(xx) */
GHashTable *module_data;
+void *window;
STRUCT_SERVER_REC *server;
char *name;
diff --git a/src/fe-common/core/chat-completion.c b/src/fe-common/core/chat-completion.c
index 544a6043..2d108d1c 100644
--- a/src/fe-common/core/chat-completion.c
+++ b/src/fe-common/core/chat-completion.c
@@ -22,10 +22,8 @@
#include "signals.h"
#include "commands.h"
#include "misc.h"
-#include "lib-config/iconfig.h"
#include "settings.h"
-#include "servers.h"
#include "chatnets.h"
#include "servers-setup.h"
#include "channels.h"
@@ -36,12 +34,17 @@
#include "completion.h"
#include "window-items.h"
-static int complete_tag;
+static int keep_privates_count, keep_publics_count;
+static int completion_lowercase;
+static const char *completion_char, *cmdchars;
#define SERVER_LAST_MSG_ADD(server, nick) \
- last_msg_add(&server->lastmsgs, nick)
-#define SERVER_LAST_MSG_DESTROY(server, nick) \
- last_msg_destroy(&server->lastmsgs, nick)
+ last_msg_add(&((MODULE_SERVER_REC *) MODULE_DATA(server))->lastmsgs, \
+ nick, TRUE, keep_privates_count)
+
+#define CHANNEL_LAST_MSG_ADD(channel, nick, own) \
+ last_msg_add(&((MODULE_CHANNEL_REC *) MODULE_DATA(channel))->lastmsgs, \
+ nick, own, keep_publics_count)
static LAST_MSG_REC *last_msg_find(GSList *list, const char *nick)
{
@@ -56,20 +59,43 @@ static LAST_MSG_REC *last_msg_find(GSList *list, const char *nick)
return NULL;
}
-static void last_msg_add(GSList **list, const char *nick)
+static void last_msg_dec_owns(GSList *list)
+{
+ LAST_MSG_REC *rec;
+
+ while (list != NULL) {
+ rec = list->data;
+ if (rec->own) rec->own--;
+
+ list = list->next;
+ }
+}
+
+static void last_msg_add(GSList **list, const char *nick, int own, int max)
{
LAST_MSG_REC *rec;
rec = last_msg_find(*list, nick);
if (rec != NULL) {
/* msg already exists, update it */
- *list = g_slist_remove(*list, rec);
+ *list = g_slist_remove(*list, rec);
+ if (own)
+ rec->own = max;
+ else if (rec->own)
+ rec->own--;
} else {
rec = g_new(LAST_MSG_REC, 1);
rec->nick = g_strdup(nick);
+
+ if (g_slist_length(*list) == max)
+ *list = g_slist_remove(*list, (*list)->data);
+
+ rec->own = own ? max : 0;
}
rec->time = time(NULL);
+ last_msg_dec_owns(*list);
+
*list = g_slist_prepend(*list, rec);
}
@@ -81,77 +107,17 @@ static void last_msg_destroy(GSList **list, LAST_MSG_REC *rec)
g_free(rec);
}
-static void last_msgs_remove_old(GSList **list, int timeout, time_t now)
-{
- GSList *tmp, *next;
-
- for (tmp = *list; tmp != NULL; tmp = next) {
- LAST_MSG_REC *rec = tmp->data;
-
- next = tmp->next;
- if (now-rec->time > timeout)
- last_msg_destroy(list, rec);
- }
-}
-
-static int last_msg_cmp(LAST_MSG_REC *m1, LAST_MSG_REC *m2)
-{
- return m1->time < m2->time ? 1 : -1;
-}
-
-static int nick_completion_timeout(void)
-{
- GSList *tmp;
- time_t now;
- int len, keep_private_count;
- int keep_msgs_time, keep_msgs_count, keep_ownmsgs_time;
-
- keep_private_count = settings_get_int("completion_keep_privates");
-
- now = time(NULL);
- for (tmp = servers; tmp != NULL; tmp = tmp->next) {
- SERVER_REC *server = tmp->data;
-
- len = g_slist_length(server->lastmsgs);
- if (len > 0 && len >= keep_private_count) {
- /* remove the oldest msg nick. */
- GSList *link = g_slist_last(server->lastmsgs);
- SERVER_LAST_MSG_DESTROY(server, link->data);
- }
- }
-
- keep_ownmsgs_time = settings_get_int("completion_keep_ownpublics");
- keep_msgs_time = settings_get_int("completion_keep_publics");
- keep_msgs_count = settings_get_int("completion_keep_publics_count");
-
- for (tmp = channels; tmp != NULL; tmp = tmp->next) {
- CHANNEL_REC *channel = tmp->data;
-
- last_msgs_remove_old(&channel->lastmsgs, keep_msgs_time, now);
-
- if (keep_msgs_count == 0 ||
- (int)g_slist_length(channel->lastownmsgs) > keep_msgs_count) {
- last_msgs_remove_old(&channel->lastownmsgs,
- keep_ownmsgs_time, now);
- }
- }
-
- return 1;
-}
-
static void sig_message_public(SERVER_REC *server, const char *msg,
const char *nick, const char *address,
const char *target)
{
CHANNEL_REC *channel;
- GSList **list;
+ int own;
channel = channel_find(server, target);
if (channel != NULL) {
- list = nick_match_msg(channel, msg, server->nick) ?
- &channel->lastownmsgs :
- &channel->lastmsgs;
- last_msg_add(list, nick);
+ own = nick_match_msg(channel, msg, server->nick);
+ CHANNEL_LAST_MSG_ADD(channel, nick, own);
}
}
@@ -164,7 +130,8 @@ static void sig_message_private(SERVER_REC *server, const char *msg,
static void cmd_msg(const char *data, SERVER_REC *server)
{
GHashTable *optlist;
- char *target, *msg;
+ NICK_REC *nick;
+ char *target, *msg, *p;
void *free_arg;
g_return_if_fail(data != NULL);
@@ -175,46 +142,74 @@ static void cmd_msg(const char *data, SERVER_REC *server)
return;
server = cmd_options_get_server("msg", optlist, server);
- if (*target != '\0' && *msg != '\0' && *target != '=' &&
- server != NULL && !server->ischannel(*target))
- SERVER_LAST_MSG_ADD(server, target);
+ if (server != NULL && *target != '\0' && *msg != '\0' &&
+ query_find(server, target) == NULL) {
+ CHANNEL_REC *channel = channel_find(server, target);
+ MODULE_CHANNEL_REC *mchannel;
+
+ mchannel = MODULE_DATA(channel);
+
+ if (channel != NULL) {
+ /* channel msg - if first word in line is nick,
+ add it to lastmsgs */
+ p = strchr(msg, ' ');
+ if (p != NULL && p != msg) {
+ *p = '\0';
+ nick = nicklist_find(channel, msg);
+ if (nick == NULL) {
+ /* probably ':' or ',' or some other
+ char after nick, try without it */
+ p[-1] = '\0';
+ nick = nicklist_find(channel, msg);
+ }
+ if (nick != NULL && nick != channel->ownnick) {
+ CHANNEL_LAST_MSG_ADD(channel,
+ nick->nick, TRUE);
+ }
+ }
+ } else if (!server->ischannel(*target)) {
+ /* private msg */
+ SERVER_LAST_MSG_ADD(server, target);
+ }
+ }
cmd_params_free(free_arg);
}
static void sig_nick_removed(CHANNEL_REC *channel, NICK_REC *nick)
{
+ MODULE_CHANNEL_REC *mchannel;
LAST_MSG_REC *rec;
- rec = last_msg_find(channel->lastownmsgs, nick->nick);
- if (rec != NULL) last_msg_destroy(&channel->lastownmsgs, rec);
-
- rec = last_msg_find(channel->lastmsgs, nick->nick);
- if (rec != NULL) last_msg_destroy(&channel->lastmsgs, rec);
+ mchannel = MODULE_DATA(channel);
+ rec = last_msg_find(mchannel->lastmsgs, nick->nick);
+ if (rec != NULL) last_msg_destroy(&mchannel->lastmsgs, rec);
}
static void sig_nick_changed(CHANNEL_REC *channel, NICK_REC *nick,
const char *oldnick)
{
+ MODULE_CHANNEL_REC *mchannel;
LAST_MSG_REC *rec;
- rec = last_msg_find(channel->lastownmsgs, oldnick);
+ mchannel = MODULE_DATA(channel);
+ rec = last_msg_find(mchannel->lastmsgs, oldnick);
if (rec != NULL) {
g_free(rec->nick);
rec->nick = g_strdup(nick->nick);
}
+}
- rec = last_msg_find(channel->lastmsgs, oldnick);
- if (rec != NULL) {
- g_free(rec->nick);
- rec->nick = g_strdup(nick->nick);
- }
+static int last_msg_cmp(LAST_MSG_REC *m1, LAST_MSG_REC *m2)
+{
+ return m1->time < m2->time ? 1 : -1;
}
/* Complete /MSG from specified server */
static void completion_msg_server(GSList **list, SERVER_REC *server,
const char *nick, const char *prefix)
{
+ MODULE_SERVER_REC *mserver;
LAST_MSG_REC *msg;
GSList *tmp;
int len;
@@ -222,7 +217,8 @@ static void completion_msg_server(GSList **list, SERVER_REC *server,
g_return_if_fail(nick != NULL);
len = strlen(nick);
- for (tmp = server->lastmsgs; tmp != NULL; tmp = tmp->next) {
+ mserver = MODULE_DATA(server);
+ for (tmp = mserver->lastmsgs; tmp != NULL; tmp = tmp->next) {
LAST_MSG_REC *rec = tmp->data;
if (len != 0 && g_strncasecmp(rec->nick, nick, len) != 0)
@@ -290,49 +286,55 @@ static GList *completion_msg(SERVER_REC *win_server,
return convert_msglist(list);
}
-static void complete_from_nicklist(GList **outlist, GSList *list,
- const char *nick, const char *prefix)
+static void complete_from_nicklist(GList **outlist, CHANNEL_REC *channel,
+ const char *nick, const char *suffix)
{
+ MODULE_CHANNEL_REC *mchannel;
GSList *tmp;
+ GList *ownlist;
char *str;
- int len, lowercase;
-
- lowercase = settings_get_bool("completion_nicks_lowercase");
+ int len;
+ /* go through the last x nicks who have said something in the channel.
+ nicks of all the "own messages" are placed before others */
+ ownlist = NULL;
len = strlen(nick);
- for (tmp = list; tmp != NULL; tmp = tmp->next) {
+ mchannel = MODULE_DATA(channel);
+ for (tmp = mchannel->lastmsgs; tmp != NULL; tmp = tmp->next) {
LAST_MSG_REC *rec = tmp->data;
if (g_strncasecmp(rec->nick, nick, len) == 0 &&
glist_find_icase_string(*outlist, rec->nick) == NULL) {
- str = g_strconcat(rec->nick, prefix, NULL);
- if (lowercase) g_strdown(str);
- *outlist = g_list_append(*outlist, str);
+ str = g_strconcat(rec->nick, suffix, NULL);
+ if (completion_lowercase) g_strdown(str);
+ if (rec->own)
+ ownlist = g_list_append(ownlist, str);
+ else
+ *outlist = g_list_append(*outlist, str);
}
}
+
+ *outlist = g_list_concat(ownlist, *outlist);
}
static GList *completion_channel_nicks(CHANNEL_REC *channel, const char *nick,
- const char *prefix)
+ const char *suffix)
{
GSList *nicks, *tmp;
GList *list;
char *str;
- int lowercase, len;
+ int len;
g_return_val_if_fail(channel != NULL, NULL);
g_return_val_if_fail(nick != NULL, NULL);
if (*nick == '\0') return NULL;
- lowercase = settings_get_bool("completion_nicks_lowercase");
+ if (suffix != NULL && *suffix == '\0')
+ suffix = NULL;
- if (prefix != NULL && *prefix == '\0')
- prefix = NULL;
-
- /* put first the nicks who have recently said something [to you] */
+ /* put first the nicks who have recently said something */
list = NULL;
- complete_from_nicklist(&list, channel->lastownmsgs, nick, prefix);
- complete_from_nicklist(&list, channel->lastmsgs, nick, prefix);
+ complete_from_nicklist(&list, channel, nick, suffix);
/* and add the rest of the nicks too */
len = strlen(nick);
@@ -342,9 +344,9 @@ static GList *completion_channel_nicks(CHANNEL_REC *channel, const char *nick,
if (g_strncasecmp(rec->nick, nick, len) == 0 &&
glist_find_icase_string(list, rec->nick) == NULL &&
- g_strcasecmp(rec->nick, channel->server->nick) != 0) {
- str = g_strconcat(rec->nick, prefix, NULL);
- if (lowercase) g_strdown(str);
+ rec != channel->ownnick) {
+ str = g_strconcat(rec->nick, suffix, NULL);
+ if (completion_lowercase) g_strdown(str);
list = g_list_append(list, str);
}
}
@@ -353,6 +355,8 @@ static GList *completion_channel_nicks(CHANNEL_REC *channel, const char *nick,
return list;
}
+/* append all strings in list2 to list1 that already aren't there and
+ free list2 */
static GList *completion_joinlist(GList *list1, GList *list2)
{
GList *old;
@@ -396,7 +400,8 @@ GList *completion_get_channels(SERVER_REC *server, const char *word)
for (tmp = setupchannels; tmp != NULL; tmp = tmp->next) {
CHANNEL_SETUP_REC *rec = tmp->data;
- if (g_strncasecmp(rec->name, word, len) == 0)
+ if (g_strncasecmp(rec->name, word, len) == 0 &&
+ glist_find_icase_string(list, rec->name) == NULL)
list = g_list_append(list, g_strdup(rec->name));
}
@@ -410,20 +415,19 @@ static void complete_window_nicks(GList **list, WINDOW_REC *window,
CHANNEL_REC *channel;
GList *tmplist;
GSList *tmp;
- const char *nickprefix;
+ const char *nicksuffix;
- nickprefix = *linestart != '\0' ? NULL :
- settings_get_str("completion_char");
+ nicksuffix = *linestart != '\0' ? NULL : completion_char;
channel = CHANNEL(window->active);
/* first the active channel */
if (channel != NULL) {
- tmplist = completion_channel_nicks(channel, word, nickprefix);
+ tmplist = completion_channel_nicks(channel, word, nicksuffix);
*list = completion_joinlist(*list, tmplist);
}
- if (nickprefix != NULL) {
+ if (nicksuffix != NULL) {
/* completing nick at the start of line - probably answering
to some other nick, don't even try to complete from
non-active channels */
@@ -435,7 +439,7 @@ static void complete_window_nicks(GList **list, WINDOW_REC *window,
channel = CHANNEL(tmp->data);
if (channel != NULL && tmp->data != window->active) {
tmplist = completion_channel_nicks(channel, word,
- nickprefix);
+ nicksuffix);
*list = completion_joinlist(*list, tmplist);
}
}
@@ -447,7 +451,6 @@ static void sig_complete_word(GList **list, WINDOW_REC *window,
SERVER_REC *server;
CHANNEL_REC *channel;
QUERY_REC *query;
- const char *cmdchars;
char *prefix;
g_return_if_fail(list != NULL);
@@ -469,7 +472,6 @@ static void sig_complete_word(GList **list, WINDOW_REC *window,
if (server == NULL || !server->connected)
return;
- cmdchars = settings_get_str("cmdchars");
if (*linestart == '\0' && *word == '\0') {
/* pressed TAB at the start of line - add /MSG */
prefix = g_strdup_printf("%cmsg", *cmdchars);
@@ -645,7 +647,7 @@ static void event_text(const char *data, SERVER_REC *server, WI_ITEM_REC *item)
line = settings_get_bool("expand_escapes") ?
expand_escapes(data, server, item) : g_strdup(data);
- comp_char = *settings_get_str("completion_char");
+ comp_char = *completion_char;
/* check for automatic nick completion */
ptr = NULL;
@@ -682,35 +684,47 @@ static void event_text(const char *data, SERVER_REC *server, WI_ITEM_REC *item)
static void sig_server_disconnected(SERVER_REC *server)
{
+ MODULE_SERVER_REC *mserver;
+
g_return_if_fail(server != NULL);
- while (server->lastmsgs)
- SERVER_LAST_MSG_DESTROY(server, server->lastmsgs->data);
+ mserver = MODULE_DATA(server);
+ while (mserver->lastmsgs)
+ last_msg_destroy(&mserver->lastmsgs, mserver->lastmsgs->data);
}
static void sig_channel_destroyed(CHANNEL_REC *channel)
{
+ MODULE_CHANNEL_REC *mchannel;
+
g_return_if_fail(channel != NULL);
- while (channel->lastmsgs != NULL)
- last_msg_destroy(&channel->lastmsgs, channel->lastmsgs->data);
- while (channel->lastownmsgs != NULL)
- last_msg_destroy(&channel->lastownmsgs, channel->lastownmsgs->data);
+ mchannel = MODULE_DATA(channel);
+ while (mchannel->lastmsgs != NULL) {
+ last_msg_destroy(&mchannel->lastmsgs,
+ mchannel->lastmsgs->data);
+ }
+}
+
+static void read_settings(void)
+{
+ keep_privates_count = settings_get_int("completion_keep_privates");
+ keep_publics_count = settings_get_int("completion_keep_publics");
+ completion_lowercase = settings_get_bool("completion_nicks_lowercase");
+ completion_char = settings_get_str("completion_char");
+ cmdchars = settings_get_str("cmdchars");
}
void chat_completion_init(void)
{
settings_add_str("completion", "completion_char", ":");
settings_add_bool("completion", "completion_auto", FALSE);
- settings_add_int("completion", "completion_keep_publics", 180);
- settings_add_int("completion", "completion_keep_publics_count", 50);
- settings_add_int("completion", "completion_keep_ownpublics", 360);
+ settings_add_int("completion", "completion_keep_publics", 50);
settings_add_int("completion", "completion_keep_privates", 10);
settings_add_bool("completion", "expand_escapes", FALSE);
settings_add_bool("completion", "completion_nicks_lowercase", FALSE);
- complete_tag = g_timeout_add(1000, (GSourceFunc) nick_completion_timeout, NULL);
-
+ read_settings();
signal_add("complete word", (SIGNAL_FUNC) sig_complete_word);
signal_add("complete command msg", (SIGNAL_FUNC) sig_complete_msg);
signal_add("complete command connect", (SIGNAL_FUNC) sig_complete_connect);
@@ -723,12 +737,11 @@ void chat_completion_init(void)
signal_add("send text", (SIGNAL_FUNC) event_text);
signal_add("server disconnected", (SIGNAL_FUNC) sig_server_disconnected);
signal_add("channel destroyed", (SIGNAL_FUNC) sig_channel_destroyed);
+ signal_add("setup changed", (SIGNAL_FUNC) read_settings);
}
void chat_completion_deinit(void)
{
- g_source_remove(complete_tag);
-
signal_remove("complete word", (SIGNAL_FUNC) sig_complete_word);
signal_remove("complete command msg", (SIGNAL_FUNC) sig_complete_msg);
signal_remove("complete command connect", (SIGNAL_FUNC) sig_complete_connect);
@@ -741,4 +754,5 @@ void chat_completion_deinit(void)
signal_remove("send text", (SIGNAL_FUNC) event_text);
signal_remove("server disconnected", (SIGNAL_FUNC) sig_server_disconnected);
signal_remove("channel destroyed", (SIGNAL_FUNC) sig_channel_destroyed);
+ signal_remove("setup changed", (SIGNAL_FUNC) read_settings);
}
diff --git a/src/fe-common/core/fe-channels.c b/src/fe-common/core/fe-channels.c
index a87320c8..ff0ff6e9 100644
--- a/src/fe-common/core/fe-channels.c
+++ b/src/fe-common/core/fe-channels.c
@@ -27,6 +27,7 @@
#include "misc.h"
#include "settings.h"
+#include "channels.h"
#include "channels-setup.h"
#include "nicklist.h"
@@ -34,7 +35,7 @@
#include "window-items.h"
#include "printtext.h"
-static void signal_channel_created(CHANNEL_REC *channel, gpointer automatic)
+static void signal_channel_created(CHANNEL_REC *channel, void *automatic)
{
if (window_item_find(channel->server, channel->name) == NULL) {
window_item_create((WI_ITEM_REC *) channel,
diff --git a/src/fe-common/core/fe-common-core.c b/src/fe-common/core/fe-common-core.c
index 1547aa3a..200e6e30 100644
--- a/src/fe-common/core/fe-common-core.c
+++ b/src/fe-common/core/fe-common-core.c
@@ -22,6 +22,7 @@
#include "module-formats.h"
#include "levels.h"
#include "settings.h"
+#include "channels.h"
#include "fe-queries.h"
#include "hilight-text.h"
@@ -83,12 +84,28 @@ void window_commands_deinit(void);
void fe_core_commands_init(void);
void fe_core_commands_deinit(void);
+static void sig_connected(SERVER_REC *server)
+{
+ MODULE_DATA_SET(server, g_new0(MODULE_SERVER_REC, 1));
+}
+
+static void sig_disconnected(SERVER_REC *server)
+{
+ g_free(MODULE_DATA(server));
+}
+
+static void sig_channel_created(CHANNEL_REC *channel)
+{
+ MODULE_DATA_SET(channel, g_new0(MODULE_CHANNEL_REC, 1));
+}
+
+static void sig_channel_destroyed(CHANNEL_REC *channel)
+{
+ g_free(MODULE_DATA(channel));
+}
+
void fe_common_core_init(void)
{
- /*settings_add_bool("lookandfeel", "show_menubar", TRUE);
- settings_add_bool("lookandfeel", "show_toolbar", FALSE);
- settings_add_bool("lookandfeel", "show_statusbar", TRUE);
- settings_add_bool("lookandfeel", "show_nicklist", TRUE);*/
settings_add_bool("lookandfeel", "timestamps", TRUE);
settings_add_bool("lookandfeel", "msgs_timestamps", FALSE);
settings_add_bool("lookandfeel", "hide_text_style", FALSE);
@@ -98,9 +115,6 @@ void fe_common_core_init(void)
settings_add_bool("lookandfeel", "use_status_window", TRUE);
settings_add_bool("lookandfeel", "use_msgs_window", FALSE);
- /*settings_add_bool("lookandfeel", "autoraise_msgs_window", FALSE);*/
- /*settings_add_bool("lookandfeel", "use_tabbed_windows", TRUE);
- settings_add_int("lookandfeel", "tab_orientation", 3);*/
themes_init();
theme_register(fecommon_core_formats);
@@ -133,7 +147,12 @@ void fe_common_core_init(void)
fe_messages_init();
fe_ignore_messages_init();
- settings_check();
+ settings_check();
+
+ signal_add_first("server connected", (SIGNAL_FUNC) sig_connected);
+ signal_add_last("server disconnected", (SIGNAL_FUNC) sig_disconnected);
+ signal_add_first("channel created", (SIGNAL_FUNC) sig_channel_created);
+ signal_add_last("channel destroyed", (SIGNAL_FUNC) sig_channel_destroyed);
}
void fe_common_core_deinit(void)
@@ -168,6 +187,11 @@ void fe_common_core_deinit(void)
theme_unregister();
themes_deinit();
+
+ signal_remove("server connected", (SIGNAL_FUNC) sig_connected);
+ signal_remove("server disconnected", (SIGNAL_FUNC) sig_disconnected);
+ signal_remove("channel created", (SIGNAL_FUNC) sig_channel_created);
+ signal_remove("channel destroyed", (SIGNAL_FUNC) sig_channel_destroyed);
}
void fe_common_core_finish_init(void)
diff --git a/src/fe-common/core/fe-exec.c b/src/fe-common/core/fe-exec.c
index 5f7ca755..6524a6eb 100644
--- a/src/fe-common/core/fe-exec.c
+++ b/src/fe-common/core/fe-exec.c
@@ -325,8 +325,7 @@ static void sig_exec_input_reader(PROCESS_REC *rec)
recvlen = -1;
do {
- ret = line_split(tmpbuf, recvlen, &str,
- (LINEBUF_REC **) &rec->databuf);
+ ret = line_split(tmpbuf, recvlen, &str, &rec->databuf);
if (ret == -1) {
/* link to terminal closed? */
g_source_remove(rec->read_tag);
diff --git a/src/fe-common/core/module.h b/src/fe-common/core/module.h
index 4f6dbc87..203e3a30 100644
--- a/src/fe-common/core/module.h
+++ b/src/fe-common/core/module.h
@@ -1,3 +1,34 @@
#include "common.h"
#define MODULE_NAME "fe-common/core"
+
+typedef struct {
+ time_t time;
+ char *nick;
+
+ /* channel specific msg to/from me - this is actually a reference
+ count. it begins from `completion_keep_publics' and is decreased
+ every time some nick is added to lastmsgs list.
+
+ this is because of how the nick completion works. the same nick
+ is never in the lastmsgs list twice, but every time it's used
+ it's just moved to the beginning of the list. if this would be
+ just a boolean value the own-status would never be removed
+ from the nick if it didn't keep quiet for long enough.
+
+ so, the own-status is rememberd only for the last
+ `completion_keep_publics' lines */
+ int own;
+} LAST_MSG_REC;
+
+typedef struct {
+ /* /MSG completion: */
+ GSList *lastmsgs; /* list of nicks who sent you msg or
+ to who you send msg */
+} MODULE_SERVER_REC;
+
+typedef struct {
+ /* nick completion: */
+ GSList *lastmsgs; /* list of nicks who sent latest msgs and
+ list of nicks who you sent msgs to */
+} MODULE_CHANNEL_REC;
diff --git a/src/fe-common/core/window-activity.c b/src/fe-common/core/window-activity.c
index 8cb11dd1..14f7fa43 100644
--- a/src/fe-common/core/window-activity.c
+++ b/src/fe-common/core/window-activity.c
@@ -22,6 +22,7 @@
#include "signals.h"
#include "levels.h"
#include "servers.h"
+#include "channels.h"
#include "misc.h"
#include "settings.h"
diff --git a/src/fe-common/core/window-items.c b/src/fe-common/core/window-items.c
index 6e08ce39..16686b59 100644
--- a/src/fe-common/core/window-items.c
+++ b/src/fe-common/core/window-items.c
@@ -36,7 +36,7 @@ void window_item_add(WINDOW_REC *window, WI_ITEM_REC *item, int automatic)
g_return_if_fail(window != NULL);
g_return_if_fail(item != NULL);
- MODULE_DATA_SET(item, window);
+ item->window = window;
if (window->items == NULL) {
window->active = item;
@@ -66,7 +66,7 @@ void window_item_remove(WINDOW_REC *window, WI_ITEM_REC *item)
if (g_slist_find(window->items, item) == NULL)
return;
- MODULE_DATA_SET(item, NULL);
+ item->window = NULL;
window->items = g_slist_remove(window->items, item);
if (window->active == item) {
@@ -84,13 +84,6 @@ void window_item_destroy(WINDOW_REC *window, WI_ITEM_REC *item)
signal_emit("window item destroy", 2, window, item);
}
-WINDOW_REC *window_item_window(WI_ITEM_REC *item)
-{
- g_return_val_if_fail(item != NULL, NULL);
-
- return MODULE_DATA(item);
-}
-
void window_item_change_server(WI_ITEM_REC *item, void *server)
{
WINDOW_REC *window;
diff --git a/src/fe-common/core/window-items.h b/src/fe-common/core/window-items.h
index 3de76f6c..55b4852e 100644
--- a/src/fe-common/core/window-items.h
+++ b/src/fe-common/core/window-items.h
@@ -11,7 +11,8 @@ void window_item_destroy(WINDOW_REC *window, WI_ITEM_REC *item);
/* Find a window for `item' and call window_item_add(). */
void window_item_create(WI_ITEM_REC *item, int automatic);
-WINDOW_REC *window_item_window(WI_ITEM_REC *item);
+#define window_item_window(item) \
+ ((WINDOW_REC *) ((WI_ITEM_REC *) (item))->window)
void window_item_change_server(WI_ITEM_REC *item, void *server);
void window_item_set_active(WINDOW_REC *window, WI_ITEM_REC *item);
diff --git a/src/fe-text/statusbar-items.c b/src/fe-text/statusbar-items.c
index 4a73297a..2e555581 100644
--- a/src/fe-text/statusbar-items.c
+++ b/src/fe-text/statusbar-items.c
@@ -156,8 +156,7 @@ static void statusbar_nick(SBAR_ITEM_REC *item, int ypos)
nick[9] = '\0';
channel = CHANNEL(active_win->active);
- nickrec = channel == NULL ? NULL :
- nicklist_find(channel, server->nick);
+ nickrec = channel == NULL ? NULL : channel->ownnick;
}
size_needed = 2 + strlen(nick) + umode_size +
diff --git a/src/irc/bot/botnet-connection.c b/src/irc/bot/botnet-connection.c
index bd25d30b..d1a583e1 100644
--- a/src/irc/bot/botnet-connection.c
+++ b/src/irc/bot/botnet-connection.c
@@ -58,7 +58,7 @@ static void sig_bot_read(BOT_REC *bot)
for (;;) {
recvlen = bot->handle == NULL ? -1 :
net_receive(bot->handle, tmpbuf, sizeof(tmpbuf));
- ret = line_split(tmpbuf, recvlen, &str, (LINEBUF_REC **) &bot->buffer);
+ ret = line_split(tmpbuf, recvlen, &str, &bot->buffer);
if (ret == 0)
break;
diff --git a/src/irc/bot/botnet.h b/src/irc/bot/botnet.h
index 44b09bf7..0372de22 100644
--- a/src/irc/bot/botnet.h
+++ b/src/irc/bot/botnet.h
@@ -46,7 +46,7 @@ typedef struct {
GIOChannel *handle;
int read_tag;
- void *buffer;
+ LINEBUF_REC *buffer;
int file_handle; /* if bot is sending a file to us */
diff --git a/src/irc/core/channel-rejoin.c b/src/irc/core/channel-rejoin.c
index d3d4059b..e18da65e 100644
--- a/src/irc/core/channel-rejoin.c
+++ b/src/irc/core/channel-rejoin.c
@@ -218,7 +218,7 @@ static void server_rejoin_channels(IRC_SERVER_REC *server)
g_string_truncate(keys, keys->len-1);
if (use_keys) g_string_sprintfa(channels, " %s", keys->str);
- server->channels_join(server, channels->str, TRUE);
+ server->channels_join(SERVER(server), channels->str, TRUE);
}
g_string_free(channels, TRUE);
diff --git a/src/irc/core/channels-query.c b/src/irc/core/channels-query.c
index 10ab90f9..0152606e 100644
--- a/src/irc/core/channels-query.c
+++ b/src/irc/core/channels-query.c
@@ -422,7 +422,6 @@ static void multi_query_remove(IRC_SERVER_REC *server, const char *event, const
static void event_end_of_who(IRC_SERVER_REC *server, const char *data)
{
IRC_CHANNEL_REC *chanrec;
- NICK_REC *nick;
char *params, *channel, **chans;
int n, onewho;
@@ -441,8 +440,7 @@ static void event_end_of_who(IRC_SERVER_REC *server, const char *data)
/* check that the WHO actually did return something
(that it understood #chan1,#chan2,..) */
chanrec = irc_channel_find(server, chans[0]);
- nick = nicklist_find(CHANNEL(chanrec), server->nick);
- if (nick->host == NULL)
+ if (chanrec->ownnick->host == NULL)
server->no_multi_who = TRUE;
}
diff --git a/src/irc/core/irc-channels.c b/src/irc/core/irc-channels.c
index 4ee9f371..bdef9468 100644
--- a/src/irc/core/irc-channels.c
+++ b/src/irc/core/irc-channels.c
@@ -93,14 +93,14 @@ static void sig_channel_destroyed(IRC_CHANNEL_REC *channel)
#define get_join_key(key) \
(((key) == NULL || *(key) == '\0') ? "x" : (key))
-static void irc_channels_join(IRC_SERVER_REC *server, const char *data,
+static void irc_channels_join(SERVER_REC *server, const char *data,
int automatic)
{
CHANNEL_SETUP_REC *schannel;
- IRC_CHANNEL_REC *chanrec;
+ CHANNEL_REC *chanrec;
GString *outchans, *outkeys;
char *channels, *keys, *key;
- char **chanlist, **keylist, **tmp, **tmpkey, *channel;
+ char **chanlist, **keylist, **tmp, **tmpkey, *channel, *channame;
void *free_arg;
int use_keys;
@@ -124,7 +124,7 @@ static void irc_channels_join(IRC_SERVER_REC *server, const char *data,
channel = ischannel(**tmp) ? g_strdup(*tmp) :
g_strdup_printf("#%s", *tmp);
- chanrec = irc_channel_find(server, channel);
+ chanrec = channel_find(server, channel);
if (chanrec == NULL) {
schannel = channels_setup_find(channel, server->connrec->chatnet);
@@ -138,7 +138,10 @@ static void irc_channels_join(IRC_SERVER_REC *server, const char *data,
} else key = NULL;
g_string_sprintfa(outkeys, "%s,", get_join_key(key));
- chanrec = irc_channel_create(server, channel + (channel[0] == '!' && channel[1] == '!'), automatic);
+ channame = channel + (channel[0] == '!' &&
+ channel[1] == '!');
+ chanrec = channel_create(server->chat_type, server,
+ channame, automatic);
if (key != NULL) chanrec->key = g_strdup(key);
}
g_free(channel);
@@ -150,7 +153,8 @@ static void irc_channels_join(IRC_SERVER_REC *server, const char *data,
if (outchans->len > 0) {
g_string_truncate(outchans, outchans->len-1);
g_string_truncate(outkeys, outkeys->len-1);
- irc_send_cmdv(server, use_keys ? "JOIN %s %s" : "JOIN %s",
+ irc_send_cmdv(IRC_SERVER(server),
+ use_keys ? "JOIN %s %s" : "JOIN %s",
outchans->str, outkeys->str);
}
@@ -192,10 +196,8 @@ static void sig_server_looking(SERVER_REC *server)
if (!IS_IRC_SERVER(server))
return;
- server->channel_find_func =
- (void *(*)(void *, const char *)) irc_channel_find_server;
- server->channels_join =
- (void (*)(void *, const char *, int)) irc_channels_join;
+ server->channel_find_func = irc_channel_find_server;
+ server->channels_join = irc_channels_join;
}
void irc_channels_init(void)
diff --git a/src/irc/core/irc-commands.c b/src/irc/core/irc-commands.c
index 67a91b5e..945bd1cf 100644
--- a/src/irc/core/irc-commands.c
+++ b/src/irc/core/irc-commands.c
@@ -778,7 +778,7 @@ static void cmd_wall(const char *data, IRC_SERVER_REC *server, WI_ITEM_REC *item
for (tmp = nicks; tmp != NULL; tmp = tmp->next) {
NICK_REC *rec = tmp->data;
- if (g_strcasecmp(rec->nick, server->nick) != 0)
+ if (rec != chanrec->ownnick)
irc_send_cmdv(server, "NOTICE %s :%s", rec->nick, msg);
}
g_free(msg);
diff --git a/src/irc/core/irc-nicklist.c b/src/irc/core/irc-nicklist.c
index 036a3e9f..391399bf 100644
--- a/src/irc/core/irc-nicklist.c
+++ b/src/irc/core/irc-nicklist.c
@@ -85,9 +85,6 @@ static void event_names_list(SERVER_REC *server, const char *data)
while (*names != '\0' && *names != ' ') names++;
if (*names != '\0') *names++ = '\0';
- if (*ptr == '@' && g_strcasecmp(server->nick, ptr+1) == 0)
- chanrec->chanop = TRUE;
-
nicklist_insert(chanrec, ptr+isnickflag(*ptr),
*ptr == '@', *ptr == '+', FALSE);
}
@@ -98,14 +95,16 @@ static void event_names_list(SERVER_REC *server, const char *data)
static void event_end_of_names(SERVER_REC *server, const char *data)
{
char *params, *channel;
- IRC_CHANNEL_REC *chanrec;
+ CHANNEL_REC *chanrec;
g_return_if_fail(server != NULL);
params = event_get_params(data, 2, NULL, &channel);
- chanrec = irc_channel_find(server, channel);
+ chanrec = channel_find(server, channel);
if (chanrec != NULL && !chanrec->names_got) {
+ chanrec->ownnick = nicklist_find(chanrec, server->nick);
+ chanrec->chanop = chanrec->ownnick->op;
chanrec->names_got = TRUE;
signal_emit("channel joined", 1, chanrec);
}
diff --git a/src/irc/core/irc-servers.c b/src/irc/core/irc-servers.c
index 0bd19e4b..ca548400 100644
--- a/src/irc/core/irc-servers.c
+++ b/src/irc/core/irc-servers.c
@@ -73,17 +73,19 @@ static int ischannel_func(char flag)
return ischannel(flag);
}
-static void send_message(IRC_SERVER_REC *server, const char *target,
+static void send_message(SERVER_REC *server, const char *target,
const char *msg)
{
+ IRC_SERVER_REC *ircserver;
char *str;
- g_return_if_fail(server != NULL);
+ ircserver = IRC_SERVER(server);
+ g_return_if_fail(ircserver != NULL);
g_return_if_fail(target != NULL);
g_return_if_fail(msg != NULL);
str = g_strdup_printf("PRIVMSG %s :%s", target, msg);
- irc_send_cmd_split(server, str, 2, server->max_msgs_in_cmd);
+ irc_send_cmd_split(ircserver, str, 2, ircserver->max_msgs_in_cmd);
g_free(str);
}
@@ -94,8 +96,7 @@ static void sig_server_looking(IRC_SERVER_REC *server)
server->isnickflag = isnickflag_func;
server->ischannel = ischannel_func;
- server->send_message =
- (void (*)(void *, const char *, const char *)) send_message;
+ server->send_message = send_message;
}
static void server_init(IRC_SERVER_REC *server)
diff --git a/src/irc/core/irc.c b/src/irc/core/irc.c
index 24a2c757..c894adc5 100644
--- a/src/irc/core/irc.c
+++ b/src/irc/core/irc.c
@@ -291,7 +291,7 @@ static int irc_receive_line(SERVER_REC *server, char **str, int read_socket)
net_receive(net_sendbuffer_handle(server->handle),
tmpbuf, sizeof(tmpbuf));
- ret = line_split(tmpbuf, recvlen, str, (LINEBUF_REC **) &server->buffer);
+ ret = line_split(tmpbuf, recvlen, str, &server->buffer);
if (ret == -1) {
/* connection lost */
server->connection_lost = TRUE;
diff --git a/src/irc/core/netsplit.c b/src/irc/core/netsplit.c
index 3abd1717..a825ba1a 100644
--- a/src/irc/core/netsplit.c
+++ b/src/irc/core/netsplit.c
@@ -24,6 +24,7 @@
#include "misc.h"
#include "irc-servers.h"
+#include "irc-channels.h"
#include "netsplit.h"
/* How long to keep netsplits in memory (seconds) */
diff --git a/src/irc/dcc/dcc.h b/src/irc/dcc/dcc.h
index 5f67991b..8aef0c82 100644
--- a/src/irc/dcc/dcc.h
+++ b/src/irc/dcc/dcc.h
@@ -41,7 +41,7 @@ typedef struct DCC_REC {
long size, transfd, skipped; /* file size / bytes transferred / skipped at start */
GIOChannel *handle; /* socket handle */
- void *sendbuf;
+ NET_SENDBUF_REC *sendbuf;
int tagconn, tagread, tagwrite;
int fhandle; /* file handle */
time_t starttime; /* transfer start time */
diff --git a/src/lib-config/iconfig.h b/src/lib-config/iconfig.h
index 2718caa9..ea2e6c37 100644
--- a/src/lib-config/iconfig.h
+++ b/src/lib-config/iconfig.h
@@ -14,11 +14,11 @@ enum {
#define is_node_list(a) \
((a)->type == NODE_TYPE_BLOCK || (a)->type == NODE_TYPE_LIST)
-typedef struct {
+struct _CONFIG_NODE {
int type;
char *key;
void *value;
-} CONFIG_NODE;
+};
/* a = { x=y; y=z; }
@@ -43,7 +43,7 @@ typedef struct {
*/
-struct _config_rec {
+struct _CONFIG_REC {
char *fname;
int handle;
int create_mode;
@@ -61,8 +61,6 @@ struct _config_rec {
int tmp_last_lf; /* last character was a line feed */
};
-typedef struct _config_rec CONFIG_REC;
-
/* Open configuration. The file is created if it doesn't exist, unless
`create_mode' is -1. `fname' can be NULL if you just want to use
config_parse_data() */