summary refs log tree commit diff stats
path: root/src/common
diff options
context:
space:
mode:
Diffstat (limited to 'src/common')
-rw-r--r--src/common/cfgfiles.c5
-rw-r--r--src/common/hexchat.c98
-rw-r--r--src/common/hexchat.h14
-rw-r--r--src/common/hexchatc.h3
-rw-r--r--src/common/inbound.c5
-rw-r--r--src/common/textevents.in6
6 files changed, 127 insertions, 4 deletions
diff --git a/src/common/cfgfiles.c b/src/common/cfgfiles.c
index 6748fbbd..fd037525 100644
--- a/src/common/cfgfiles.c
+++ b/src/common/cfgfiles.c
@@ -330,7 +330,7 @@ get_xdir (void)
 			xdir = g_strdup_printf ("%s\\" "HexChat", out);
 		}
 #else
-		xdir = g_strdup_printf ("%s/.config/" HEXCHAT_DIR, g_get_home_dir ());
+		xdir = g_strdup_printf ("%s/" HEXCHAT_DIR, g_get_user_config_dir ());
 #endif
 	}
 
@@ -460,6 +460,8 @@ const struct prefs vars[] =
 	{"gui_throttlemeter", P_OFFINT (hex_gui_throttlemeter), TYPE_INT},
 	{"gui_topicbar", P_OFFINT (hex_gui_topicbar), TYPE_BOOL},
 	{"gui_tray", P_OFFINT (hex_gui_tray), TYPE_BOOL},
+	{"gui_tray_away", P_OFFINT (hex_gui_tray_away), TYPE_BOOL},
+	{"gui_tray_blink", P_OFFINT (hex_gui_tray_blink), TYPE_BOOL},
 	{"gui_tray_close", P_OFFINT (hex_gui_tray_close), TYPE_BOOL},
 	{"gui_tray_minimize", P_OFFINT (hex_gui_tray_minimize), TYPE_BOOL},
 	{"gui_tray_quiet", P_OFFINT (hex_gui_tray_quiet), TYPE_BOOL},
@@ -668,6 +670,7 @@ load_config (void)
 	prefs.hex_gui_tab_sort = 1;
 	prefs.hex_gui_topicbar = 1;
 	prefs.hex_gui_tray = 1;
+	prefs.hex_gui_tray_blink = 1;
 	prefs.hex_gui_ulist_count = 1;
 	prefs.hex_gui_ulist_icons = 1;
 	prefs.hex_gui_ulist_resizable = 1;
diff --git a/src/common/hexchat.c b/src/common/hexchat.c
index da46f7f5..57e3fc86 100644
--- a/src/common/hexchat.c
+++ b/src/common/hexchat.c
@@ -77,6 +77,24 @@ GSList *usermenu_list = 0;
 GSList *urlhandler_list = 0;
 GSList *tabmenu_list = 0;
 
+/*
+ * This array contains 5 double linked lists, one for each priority in the
+ * "interesting session" queue ("channel" stands for everything but
+ * SESS_DIALOG):
+ *
+ * [0] queries with hilight
+ * [1] queries
+ * [2] channels with hilight
+ * [3] channels with dialogue
+ * [4] channels with other data
+ *
+ * Each time activity happens the corresponding session is put at the
+ * beginning of one of the lists.  The aim is to be able to switch to the
+ * session with the most important/recent activity.
+ */
+GList *sess_list_by_lastact[5] = {NULL, NULL, NULL, NULL, NULL};
+
+
 static int in_hexchat_exit = FALSE;
 int hexchat_is_quitting = FALSE;
 /* command-line args */
@@ -103,6 +121,79 @@ SSL_CTX *ctx = NULL;
 pxProxyFactory *libproxy_factory;
 #endif
 
+/*
+ * Update the priority queue of the "interesting sessions"
+ * (sess_list_by_lastact).
+ */
+void
+lastact_update(session *sess)
+{
+	int oldidx = sess->lastact_idx;
+	int newidx = LACT_NONE;
+	int dia = (sess->type == SESS_DIALOG);
+
+	if (sess->nick_said)
+		newidx = dia? LACT_QUERY_HI: LACT_CHAN_HI;
+	else if (sess->msg_said)
+		newidx = dia? LACT_QUERY: LACT_CHAN;
+	else if (sess->new_data)
+		newidx = dia? LACT_QUERY: LACT_CHAN_DATA;
+
+	/* If already first at the right position, just return */
+	if (oldidx == newidx &&
+		 (newidx == LACT_NONE || g_list_index(sess_list_by_lastact[newidx], sess) == 0))
+		return;
+
+	/* Remove from the old position */
+	if (oldidx != LACT_NONE)
+		sess_list_by_lastact[oldidx] = g_list_remove(sess_list_by_lastact[oldidx], sess);
+
+	/* Add at the new position */
+	sess->lastact_idx = newidx;
+	if (newidx != LACT_NONE)
+		sess_list_by_lastact[newidx] = g_list_prepend(sess_list_by_lastact[newidx], sess);
+	return;
+}
+
+/*
+ * Extract the first session from the priority queue of sessions with recent
+ * activity. Return NULL if no such session can be found.
+ *
+ * If filter is specified, skip a session if filter(session) returns 0. This
+ * can be used for UI-specific needs, e.g. in fe-gtk we want to filter out
+ * detached sessions.
+ */
+session *
+lastact_getfirst(int (*filter) (session *sess))
+{
+	int i;
+	session *sess = NULL;
+	GList *curitem;
+
+	/* 5 is the number of priority classes LACT_ */
+	for (i = 0; i < 5 && !sess; i++)
+	{
+		curitem = sess_list_by_lastact[i];
+		while (curitem && !sess)
+		{
+			sess = g_list_nth_data(curitem, 0);
+			if (!sess || (filter && !filter(sess)))
+			{
+				sess = NULL;
+				curitem = g_list_next(curitem);
+			}
+		}
+
+		if (sess)
+		{
+			sess_list_by_lastact[i] = g_list_remove(sess_list_by_lastact[i], sess);
+			sess->lastact_idx = LACT_NONE;
+		}
+	}
+	
+	return sess;
+}
+
 int
 is_session (session * sess)
 {
@@ -372,6 +463,8 @@ session_new (server *serv, char *from, int type, int focus)
 	sess->text_logging = SET_DEFAULT;
 	sess->text_scrollback = SET_DEFAULT;
 
+	sess->lastact_idx = LACT_NONE;
+
 	if (from != NULL)
 		safe_strcpy (sess->channel, from, CHANLEN);
 
@@ -489,6 +582,7 @@ session_free (session *killsess)
 	server *killserv = killsess->server;
 	session *sess;
 	GSList *list;
+	int oldidx;
 
 	plugin_emit_dummy_print (killsess, "Close Context");
 
@@ -525,6 +619,10 @@ session_free (session *killsess)
 	if (killsess->type == SESS_CHANNEL)
 		userlist_free (killsess);
 
+	oldidx = killsess->lastact_idx;
+	if (oldidx != LACT_NONE)
+		sess_list_by_lastact[oldidx] = g_list_remove(sess_list_by_lastact[oldidx], killsess);
+
 	exec_notify_kill (killsess);
 
 	log_close (killsess);
diff --git a/src/common/hexchat.h b/src/common/hexchat.h
index d84e2761..dfd2fd5a 100644
--- a/src/common/hexchat.h
+++ b/src/common/hexchat.h
@@ -152,6 +152,8 @@ struct hexchatprefs
 	unsigned int hex_gui_tab_utils;
 	unsigned int hex_gui_topicbar;
 	unsigned int hex_gui_tray;
+	unsigned int hex_gui_tray_away;
+	unsigned int hex_gui_tray_blink;
 	unsigned int hex_gui_tray_close;
 	unsigned int hex_gui_tray_minimize;
 	unsigned int hex_gui_tray_quiet;
@@ -348,6 +350,15 @@ struct hexchatprefs
 #define SET_ON 1
 #define SET_DEFAULT 2 /* use global setting */
 
+/* Priorities in the "interesting sessions" priority queue
+ * (see xchat.c:sess_list_by_lastact) */
+#define LACT_NONE		-1		/* no queues */
+#define LACT_QUERY_HI	0		/* query with hilight */
+#define LACT_QUERY		1		/* query with messages */
+#define LACT_CHAN_HI	2		/* channel with hilight */
+#define LACT_CHAN		3		/* channel with messages */
+#define LACT_CHAN_DATA	4		/* channel with other data */
+
 /* Moved from fe-gtk for use in outbound.c as well -- */
 typedef enum gtk_xtext_search_flags_e {
 	case_match = 1,
@@ -406,6 +417,9 @@ typedef struct session
 
 	int type;					/* SESS_* */
 
+	int lastact_idx;		/* the sess_list_by_lastact[] index of the list we're in.
+							 * For valid values, see defines of LACT_*. */
+
 	int new_data:1;			/* new data avail? (purple tab) */
 	int nick_said:1;		/* your nick mentioned? (blue tab) */
 	int msg_said:1;			/* new msg available? (red tab) */
diff --git a/src/common/hexchatc.h b/src/common/hexchatc.h
index 207a97cd..9650dc10 100644
--- a/src/common/hexchatc.h
+++ b/src/common/hexchatc.h
@@ -25,10 +25,13 @@ extern GSList *ignore_list;
 extern GSList *usermenu_list;
 extern GSList *urlhandler_list;
 extern GSList *tabmenu_list;
+extern GList *sess_list_by_lastact[];
 
 session * find_channel (server *serv, char *chan);
 session * find_dialog (server *serv, char *nick);
 session * new_ircwindow (server *serv, char *name, int type, int focus);
+void lastact_update (session * sess);
+session * lastact_getfirst (int (*filter) (session *sess));
 int is_session (session * sess);
 void session_free (session *killsess);
 void lag_check (void);
diff --git a/src/common/inbound.c b/src/common/inbound.c
index 41b36296..54e5bff0 100644
--- a/src/common/inbound.c
+++ b/src/common/inbound.c
@@ -301,7 +301,10 @@ is_hilight (char *from, char *text, session *sess, server *serv)
 	{
 		g_free (text);
 		if (sess != current_tab)
+		{
 			sess->nick_said = TRUE;
+			lastact_update (sess);
+		}
 		fe_set_hilight (sess);
 		return 1;
 	}
@@ -364,6 +367,7 @@ inbound_action (session *sess, char *chan, char *from, char *ip, char *text, int
 			sess->msg_said = TRUE;
 			sess->new_data = FALSE;
 		}
+		lastact_update (sess);
 	}
 
 	user = userlist_find (sess, from);
@@ -421,6 +425,7 @@ inbound_chanmsg (server *serv, session *sess, char *chan, char *from, char *text
 	{
 		sess->msg_said = TRUE;
 		sess->new_data = FALSE;
+		lastact_update (sess);
 	}
 
 	user = userlist_find (sess, from);
diff --git a/src/common/textevents.in b/src/common/textevents.in
index 827900ff..69d42526 100644
--- a/src/common/textevents.in
+++ b/src/common/textevents.in
@@ -67,7 +67,7 @@ pevt_chanban_help
 Channel Creation
 XP_TE_CHANDATE
 pevt_chandate_help
-%C22*%O$tChannel %C22$1%O created
+%C22*%O$tChannel %C22$1%O created on %C24$2%O
 2
 
 Channel DeHalfOp
@@ -589,13 +589,13 @@ n0
 Part
 XP_TE_PART
 pevt_part_help
-%C24*$t$1 has left
+%C24*$t$1 ($2) has left
 3
 
 Part with Reason
 XP_TE_PARTREASON
 pevt_partreason_help
-%C24*%O$t%C18$1%C ($2) has left (%C24$4%O)
+%C24*$t$1 ($2) has left ($4)
 4
 
 Ping Reply