summaryrefslogtreecommitdiff
path: root/conky/irc_lines.patch
blob: 2ff03c0c12d17da94e30b587e720b486dd7a3a71 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
diff --git a/doc/variables.xml b/doc/variables.xml
index effc5880..f07ef893 100644
--- a/doc/variables.xml
+++ b/doc/variables.xml
@@ -1756,11 +1756,12 @@
             <command>
                 <option>irc</option>
             </command>
-            <option>server(:port) #channel</option>
+            <option>server(:port) #channel (max_msg_lines)</option>
         </term>
         <listitem>Shows everything that's being told in #channel on IRCserver
         'server'. TCP-port 6667 is used for the connection unless 'port' is
-        specified.
+        specified. Shows everything since the last time or the last
+        'max_msg_lines' entries if specified.
         <para /></listitem>
     </varlistentry>
     <varlistentry>
diff --git a/src/irc.cc b/src/irc.cc
index 17b81d73..ad5cb846 100644
--- a/src/irc.cc
+++ b/src/irc.cc
@@ -44,6 +44,7 @@ struct obj_irc {
 
 struct ctx {
 	char *chan;
+	int max_msg_lines;
 	struct ll_text *messages;
 };
 
@@ -69,6 +70,22 @@ void addmessage(struct ctx *ctxptr, char *nick, const char *text) {
 		}
 		lastmsg->next = newmsg;
 	}
+	if(ctxptr->max_msg_lines>0) {
+		int msgcnt = 0;
+		newmsg = ctxptr->messages;
+		while(newmsg) {
+			newmsg = newmsg->next;
+			msgcnt++;
+		}
+		msgcnt -= ctxptr->max_msg_lines;
+		while(msgcnt>0) {
+			msgcnt--;
+			newmsg = ctxptr->messages->next;
+			free(ctxptr->messages->text);
+			free(ctxptr->messages);
+			ctxptr->messages = newmsg;
+		}
+	}
 }
 
 void ev_talkinchan(irc_session_t *session, const char *event, const char *origin, const char **params, unsigned int count) {
@@ -95,7 +112,7 @@ void ev_num(irc_session_t *session, unsigned int event, const char *origin, cons
 	if(origin || count) {}	//fix gcc warnings
 }
 
-#define IRCSYNTAX "The correct syntax is ${irc server(:port) #channel}"
+#define IRCSYNTAX "The correct syntax is ${irc server(:port) #channel (max_msg_lines)}"
 #define IRCPORT 6667
 #define IRCNICK "conky"
 #define IRCSERVERPASS NULL
@@ -108,6 +125,7 @@ void *ircclient(void *ptr) {
 	irc_callbacks_t callbacks;
 	char *server;
 	char *strport;
+	char *str_max_msg_lines;
 	unsigned int port;
 
 	memset (&callbacks, 0, sizeof(callbacks));
@@ -120,6 +138,10 @@ void *ircclient(void *ptr) {
 	if( ! ctxptr->chan) {
 		NORM_ERR("irc: %s", IRCSYNTAX);
 	}
+	str_max_msg_lines = strtok(NULL, " ");
+	if(str_max_msg_lines) {
+		ctxptr->max_msg_lines = strtol(str_max_msg_lines, NULL, 10);
+	}
 	ctxptr->messages = NULL;
 	irc_set_ctx(ircobj->session, ctxptr);
 	server = strtok(server, ":");
@@ -169,14 +191,18 @@ void print_irc(struct text_object *obj, char *p, int p_max_size) {
 	while(curmsg) {
 		nextmsg = curmsg->next;
 		strncat(p, curmsg->text, p_max_size - strlen(p) - 1);
-		free(curmsg->text);
-		free(curmsg);
+		if(!ctxptr->max_msg_lines) {
+			free(curmsg->text);
+			free(curmsg);
+		}
 		curmsg = nextmsg;
 	}
 	if(p[0] != 0) {
 		p[strlen(p) - 1] = 0;
 	}
-	ctxptr->messages = NULL;
+	if(!ctxptr->max_msg_lines) {
+		ctxptr->messages = NULL;
+	}
 }
 
 void free_irc(struct text_object *obj) {