comparison mcabber/mcabber/screen.c @ 2337:ffd0e57e9563

Defined types shall end with "_t"
author franky
date Sun, 12 May 2019 11:32:30 +0200
parents 6ad3cada768c
children 6424627913be
comparison
equal deleted inserted replaced
2336:0dc317b5599d 2337:ffd0e57e9563
107 GList *top; // If top is NULL, we'll display the last lines 107 GList *top; // If top is NULL, we'll display the last lines
108 char cleared; // For ex, user has issued a /clear command... 108 char cleared; // For ex, user has issued a /clear command...
109 char lock; 109 char lock;
110 char refcount; // refcount > 0 if there are other users of this struct 110 char refcount; // refcount > 0 if there are other users of this struct
111 // e.g. with symlinked history 111 // e.g. with symlinked history
112 } buffdata; 112 } buffdata_t;
113 113
114 typedef struct { 114 typedef struct {
115 WINDOW *win; 115 WINDOW *win;
116 PANEL *panel; 116 PANEL *panel;
117 buffdata *bd; 117 buffdata_t *bd;
118 } winbuf; 118 } winbuf_t;
119 119
120 struct dimensions { 120 struct dimensions {
121 int l; 121 int l;
122 int c; 122 int c;
123 }; 123 };
127 static PANEL *rosterPanel, *chatPanel, *activechatPanel, *inputPanel; 127 static PANEL *rosterPanel, *chatPanel, *activechatPanel, *inputPanel;
128 static PANEL *mainstatusPanel, *chatstatusPanel; 128 static PANEL *mainstatusPanel, *chatstatusPanel;
129 static PANEL *logPanel; 129 static PANEL *logPanel;
130 static int maxY, maxX; 130 static int maxY, maxX;
131 static int prev_chatwidth; 131 static int prev_chatwidth;
132 static winbuf *statusWindow; 132 static winbuf_t *statusWindow;
133 static winbuf *currentWindow; 133 static winbuf_t *currentWindow;
134 static GList *statushbuf; 134 static GList *statushbuf;
135 135
136 static int roster_hidden; 136 static int roster_hidden;
137 static int chatmode; 137 static int chatmode;
138 static int multimode; 138 static int multimode;
172 172
173 typedef struct { 173 typedef struct {
174 char *seqstr; 174 char *seqstr;
175 guint mkeycode; 175 guint mkeycode;
176 gint value; 176 gint value;
177 } keyseq; 177 } keyseq_t;
178 178
179 GSList *keyseqlist; 179 GSList *keyseqlist;
180 static void add_keyseq(char *seqstr, guint mkeycode, gint value); 180 static void add_keyseq(char *seqstr, guint mkeycode, gint value);
181 181
182 static void scr_write_in_window(const char *winId, const char *text, 182 static void scr_write_in_window(const char *winId, const char *text,
201 #endif 201 #endif
202 #ifdef WITH_ASPELL 202 #ifdef WITH_ASPELL
203 AspellConfig *config; 203 AspellConfig *config;
204 AspellSpeller *checker; 204 AspellSpeller *checker;
205 #endif 205 #endif
206 } spell_checker; 206 } spell_checker_t;
207 207
208 GSList* spell_checkers = NULL; 208 GSList* spell_checkers = NULL;
209 #endif 209 #endif
210 210
211 typedef struct { 211 typedef struct {
212 int color_pair; 212 int color_pair;
213 int color_attrib; 213 int color_attrib;
214 } ccolor; 214 } ccolor_t;
215 215
216 typedef struct { 216 typedef struct {
217 char *status, *wildcard; 217 char *status, *wildcard;
218 ccolor *color; 218 ccolor_t *color;
219 GPatternSpec *compiled; 219 GPatternSpec *compiled;
220 } rostercolor; 220 } rostercolor_t;
221 221
222 static GSList *rostercolrules = NULL; 222 static GSList *rostercolrules = NULL;
223 223
224 static GHashTable *muccolors = NULL, *nickcolors = NULL; 224 static GHashTable *muccolors = NULL, *nickcolors = NULL;
225 225
226 typedef struct { 226 typedef struct {
227 bool manual; // Manually set? 227 bool manual; // Manually set?
228 ccolor *color; 228 ccolor_t *color;
229 } nickcolor; 229 } nickcolor_t;
230 230
231 static int nickcolcount = 0; 231 static int nickcolcount = 0;
232 static ccolor ** nickcols = NULL; 232 static ccolor_t ** nickcols = NULL;
233 static muccoltype glob_muccol = MC_OFF; 233 static muccol_t glob_muccol = MC_OFF;
234 234
235 /* Functions */ 235 /* Functions */
236 236
237 static int find_color(const char *name) 237 static int find_color(const char *name)
238 { 238 {
264 264
265 scr_LogPrint(LPRINT_LOGNORM, "ERROR: Wrong color: %s", name); 265 scr_LogPrint(LPRINT_LOGNORM, "ERROR: Wrong color: %s", name);
266 return -1; 266 return -1;
267 } 267 }
268 268
269 static ccolor *get_user_color(const char *color) 269 static ccolor_t *get_user_color(const char *color)
270 { 270 {
271 bool isbright = FALSE; 271 bool isbright = FALSE;
272 int cl; 272 int cl;
273 ccolor *ccol; 273 ccolor_t *ccol;
274 if (!strncmp(color, "bright", 6)) { 274 if (!strncmp(color, "bright", 6)) {
275 isbright = TRUE; 275 isbright = TRUE;
276 color += 6; 276 color += 6;
277 } 277 }
278 cl = find_color(color); 278 cl = find_color(color);
279 if (cl < 0) 279 if (cl < 0)
280 return NULL; 280 return NULL;
281 ccol = g_new0(ccolor, 1); 281 ccol = g_new0(ccolor_t, 1);
282 ccol->color_attrib = isbright ? A_BOLD : A_NORMAL; 282 ccol->color_attrib = isbright ? A_BOLD : A_NORMAL;
283 ccol->color_pair = cl + COLOR_max; // User colors come after the internal ones 283 ccol->color_pair = cl + COLOR_max; // User colors come after the internal ones
284 return ccol; 284 return ccol;
285 } 285 }
286 286
295 295
296 // Sets the coloring mode for given MUC 296 // Sets the coloring mode for given MUC
297 // The MUC room does not need to be in the roster at that time 297 // The MUC room does not need to be in the roster at that time
298 // muc - the JID of room 298 // muc - the JID of room
299 // type - the new type 299 // type - the new type
300 void scr_muc_color(const char *muc, muccoltype type) 300 void scr_muc_color(const char *muc, muccol_t type)
301 { 301 {
302 gchar *muclow = g_utf8_strdown(muc, -1); 302 gchar *muclow = g_utf8_strdown(muc, -1);
303 if (type == MC_REMOVE) { // Remove it 303 if (type == MC_REMOVE) { // Remove it
304 if (strcmp(muc, "*")) { 304 if (strcmp(muc, "*")) {
305 if (muccolors && g_hash_table_lookup(muccolors, muclow)) 305 if (muccolors && g_hash_table_lookup(muccolors, muclow))
308 scr_LogPrint(LPRINT_NORMAL, "Can not remove global coloring mode"); 308 scr_LogPrint(LPRINT_NORMAL, "Can not remove global coloring mode");
309 } 309 }
310 g_free(muclow); 310 g_free(muclow);
311 } else { // Add or overwrite 311 } else { // Add or overwrite
312 if (strcmp(muc, "*")) { 312 if (strcmp(muc, "*")) {
313 muccoltype *value = g_new(muccoltype, 1); 313 muccol_t *value = g_new(muccol_t, 1);
314 *value = type; 314 *value = type;
315 ensure_string_htable(&muccolors, g_free); 315 ensure_string_htable(&muccolors, g_free);
316 g_hash_table_replace(muccolors, muclow, value); 316 g_hash_table_replace(muccolors, muclow, value);
317 } else { 317 } else {
318 glob_muccol = type; 318 glob_muccol = type;
334 bool need_update = FALSE; 334 bool need_update = FALSE;
335 snick = g_strdup_printf("<%s>", nick); 335 snick = g_strdup_printf("<%s>", nick);
336 mnick = g_strdup_printf("*%s ", nick); 336 mnick = g_strdup_printf("*%s ", nick);
337 if (!strcmp(color, "-")) { // Remove the color 337 if (!strcmp(color, "-")) { // Remove the color
338 if (nickcolors) { 338 if (nickcolors) {
339 nickcolor *nc = g_hash_table_lookup(nickcolors, snick); 339 nickcolor_t *nc = g_hash_table_lookup(nickcolors, snick);
340 if (nc) { // Have this nick already 340 if (nc) { // Have this nick already
341 nc->manual = FALSE; 341 nc->manual = FALSE;
342 nc = g_hash_table_lookup(nickcolors, mnick); 342 nc = g_hash_table_lookup(nickcolors, mnick);
343 assert(nc); // Must have both at the same time 343 assert(nc); // Must have both at the same time
344 nc->manual = FALSE; 344 nc->manual = FALSE;
346 } 346 }
347 g_free(snick); // They are not saved in the hash 347 g_free(snick); // They are not saved in the hash
348 g_free(mnick); 348 g_free(mnick);
349 need_update = TRUE; 349 need_update = TRUE;
350 } else { 350 } else {
351 ccolor *cl = get_user_color(color); 351 ccolor_t *cl = get_user_color(color);
352 if (!cl) { 352 if (!cl) {
353 scr_LogPrint(LPRINT_NORMAL, "No such color name"); 353 scr_LogPrint(LPRINT_NORMAL, "No such color name");
354 g_free(snick); 354 g_free(snick);
355 g_free(mnick); 355 g_free(mnick);
356 } else { 356 } else {
357 nickcolor *nc = g_new(nickcolor, 1); 357 nickcolor_t *nc = g_new(nickcolor_t, 1);
358 ensure_string_htable(&nickcolors, NULL); 358 ensure_string_htable(&nickcolors, NULL);
359 nc->manual = TRUE; 359 nc->manual = TRUE;
360 nc->color = cl; 360 nc->color = cl;
361 // Free the struct, if any there already 361 // Free the struct, if any there already
362 g_free(g_hash_table_lookup(nickcolors, mnick)); 362 g_free(g_hash_table_lookup(nickcolors, mnick));
369 if (need_update && chatmode && 369 if (need_update && chatmode &&
370 (buddy_gettype(BUDDATA(current_buddy)) & ROSTER_TYPE_ROOM)) 370 (buddy_gettype(BUDDATA(current_buddy)) & ROSTER_TYPE_ROOM))
371 scr_update_buddy_window(); 371 scr_update_buddy_window();
372 } 372 }
373 373
374 static void free_rostercolrule(rostercolor *col) 374 static void free_rostercolrule(rostercolor_t *col)
375 { 375 {
376 g_free(col->status); 376 g_free(col->status);
377 g_free(col->wildcard); 377 g_free(col->wildcard);
378 g_free(col->color); 378 g_free(col->color);
379 g_pattern_spec_free(col->compiled); 379 g_pattern_spec_free(col->compiled);
403 const char *color) 403 const char *color)
404 { 404 {
405 GSList *head; 405 GSList *head;
406 GSList *found = NULL; 406 GSList *found = NULL;
407 for (head = rostercolrules; head; head = g_slist_next(head)) { 407 for (head = rostercolrules; head; head = g_slist_next(head)) {
408 rostercolor *rc = head->data; 408 rostercolor_t *rc = head->data;
409 if ((!strcmp(status, rc->status)) && (!strcmp(wildcard, rc->wildcard))) { 409 if ((!strcmp(status, rc->status)) && (!strcmp(wildcard, rc->wildcard))) {
410 found = head; 410 found = head;
411 break; 411 break;
412 } 412 }
413 } 413 }
420 } else { 420 } else {
421 scr_LogPrint(LPRINT_NORMAL, "No such color rule, nothing removed"); 421 scr_LogPrint(LPRINT_NORMAL, "No such color rule, nothing removed");
422 return FALSE; 422 return FALSE;
423 } 423 }
424 } else { 424 } else {
425 ccolor *cl = get_user_color(color); 425 ccolor_t *cl = get_user_color(color);
426 if (!cl) { 426 if (!cl) {
427 scr_LogPrint(LPRINT_NORMAL, "No such color name"); 427 scr_LogPrint(LPRINT_NORMAL, "No such color name");
428 return FALSE; 428 return FALSE;
429 } 429 }
430 if (found) { 430 if (found) {
431 rostercolor *rc = found->data; 431 rostercolor_t *rc = found->data;
432 g_free(rc->color); 432 g_free(rc->color);
433 rc->color = cl; 433 rc->color = cl;
434 } else { 434 } else {
435 rostercolor *rc = g_new(rostercolor, 1); 435 rostercolor_t *rc = g_new(rostercolor_t, 1);
436 rc->status = g_strdup(status); 436 rc->status = g_strdup(status);
437 rc->wildcard = g_strdup(wildcard); 437 rc->wildcard = g_strdup(wildcard);
438 rc->compiled = g_pattern_spec_new(wildcard); 438 rc->compiled = g_pattern_spec_new(wildcard);
439 rc->color = cl; 439 rc->color = cl;
440 rostercolrules = g_slist_prepend(rostercolrules, rc); 440 rostercolrules = g_slist_prepend(rostercolrules, rc);
567 while (ncolors < ncolor_end && *ncolors) { 567 while (ncolors < ncolor_end && *ncolors) {
568 if ((*ncolors == ' ') || (*ncolors == '\t')) { 568 if ((*ncolors == ' ') || (*ncolors == '\t')) {
569 ncolors++; 569 ncolors++;
570 } else { 570 } else {
571 char *end = ncolors; 571 char *end = ncolors;
572 ccolor *cl; 572 ccolor_t *cl;
573 while (*end && (*end != ' ') && (*end != '\t')) 573 while (*end && (*end != ' ') && (*end != '\t'))
574 end++; 574 end++;
575 *end = '\0'; 575 *end = '\0';
576 cl = get_user_color(ncolors); 576 cl = get_user_color(ncolors);
577 if (!cl) { 577 if (!cl) {
585 } 585 }
586 g_free(ncolor_start); 586 g_free(ncolor_start);
587 } 587 }
588 if (!nickcols) { // Fallback to have something 588 if (!nickcols) { // Fallback to have something
589 nickcolcount = 1; 589 nickcolcount = 1;
590 nickcols = g_new(ccolor*, 1); 590 nickcols = g_new(ccolor_t*, 1);
591 *nickcols = g_new(ccolor, 1); 591 *nickcols = g_new(ccolor_t, 1);
592 (*nickcols)->color_pair = COLOR_GENERAL; 592 (*nickcols)->color_pair = COLOR_GENERAL;
593 (*nickcols)->color_attrib = A_NORMAL; 593 (*nickcols)->color_attrib = A_NORMAL;
594 } 594 }
595 } 595 }
596 596
1034 const gchar *message, gpointer user_data) 1034 const gchar *message, gpointer user_data)
1035 { 1035 {
1036 scr_log_print(LPRINT_NORMAL, "[%s] %s", log_domain, message); 1036 scr_log_print(LPRINT_NORMAL, "[%s] %s", log_domain, message);
1037 } 1037 }
1038 1038
1039 static winbuf *scr_search_window(const char *winId, int special) 1039 static winbuf_t *scr_search_window(const char *winId, int special)
1040 { 1040 {
1041 char *id; 1041 char *id;
1042 winbuf *wbp; 1042 winbuf_t *wbp;
1043 1043
1044 if (special) 1044 if (special)
1045 return statusWindow; // Only one special window atm. 1045 return statusWindow; // Only one special window atm.
1046 1046
1047 if (!winId) 1047 if (!winId)
1059 return (scr_search_window(bjid, FALSE) != NULL); 1059 return (scr_search_window(bjid, FALSE) != NULL);
1060 } 1060 }
1061 1061
1062 // scr_new_buddy(title, dontshow) 1062 // scr_new_buddy(title, dontshow)
1063 // Note: title (aka winId/jid) can be NULL for special buffers 1063 // Note: title (aka winId/jid) can be NULL for special buffers
1064 static winbuf *scr_new_buddy(const char *title, int dont_show) 1064 static winbuf_t *scr_new_buddy(const char *title, int dont_show)
1065 { 1065 {
1066 winbuf *tmp; 1066 winbuf_t *tmp;
1067 char *id; 1067 char *id;
1068 1068
1069 tmp = g_new0(winbuf, 1); 1069 tmp = g_new0(winbuf_t, 1);
1070 1070
1071 tmp->win = activechatWnd; 1071 tmp->win = activechatWnd;
1072 tmp->panel = activechatPanel; 1072 tmp->panel = activechatPanel;
1073 1073
1074 if (!dont_show) { 1074 if (!dont_show) {
1081 } 1081 }
1082 update_panels(); 1082 update_panels();
1083 1083
1084 // If title is NULL, this is a special buffer 1084 // If title is NULL, this is a special buffer
1085 if (!title) { 1085 if (!title) {
1086 tmp->bd = g_new0(buffdata, 1); 1086 tmp->bd = g_new0(buffdata_t, 1);
1087 return tmp; 1087 return tmp;
1088 } 1088 }
1089 1089
1090 id = hlog_get_log_jid(title); 1090 id = hlog_get_log_jid(title);
1091 if (id) { 1091 if (id) {
1092 // This is a symlinked history log file. 1092 // This is a symlinked history log file.
1093 // Let's check if the target JID buffer has already been created. 1093 // Let's check if the target JID buffer has already been created.
1094 winbuf *wb = scr_search_window(id, FALSE); 1094 winbuf_t *wb = scr_search_window(id, FALSE);
1095 if (!wb) 1095 if (!wb)
1096 wb = scr_new_buddy(id, TRUE); 1096 wb = scr_new_buddy(id, TRUE);
1097 tmp->bd = wb->bd; 1097 tmp->bd = wb->bd;
1098 tmp->bd->refcount++; 1098 tmp->bd->refcount++;
1099 g_free(id); 1099 g_free(id);
1100 } else { // Load buddy history from file (if enabled) 1100 } else { // Load buddy history from file (if enabled)
1101 tmp->bd = g_new0(buffdata, 1); 1101 tmp->bd = g_new0(buffdata_t, 1);
1102 hlog_read_history(title, &tmp->bd->hbuf, scr_gettextwidth()); 1102 hlog_read_history(title, &tmp->bd->hbuf, scr_gettextwidth());
1103 1103
1104 // Set a readmark to separate new content 1104 // Set a readmark to separate new content
1105 hbuf_set_readmark(tmp->bd->hbuf, TRUE); 1105 hbuf_set_readmark(tmp->bd->hbuf, TRUE);
1106 } 1106 }
1175 return timepreflen; 1175 return timepreflen;
1176 } 1176 }
1177 1177
1178 // scr_update_window() 1178 // scr_update_window()
1179 // (Re-)Display the given chat window. 1179 // (Re-)Display the given chat window.
1180 static void scr_update_window(winbuf *win_entry) 1180 static void scr_update_window(winbuf_t *win_entry)
1181 { 1181 {
1182 int n, mark_offset = 0; 1182 int n, mark_offset = 0;
1183 guint prefixwidth; 1183 guint prefixwidth;
1184 char pref[96]; 1184 char pref[96];
1185 hbb_line **lines, *line; 1185 hbb_line **lines, *line;
1293 1293
1294 // The MUC nick - overwrite with proper color 1294 // The MUC nick - overwrite with proper color
1295 if (line->mucnicklen) { 1295 if (line->mucnicklen) {
1296 char *mucjid; 1296 char *mucjid;
1297 char tmp; 1297 char tmp;
1298 nickcolor *actual = NULL; 1298 nickcolor_t *actual = NULL;
1299 muccoltype type, *typetmp; 1299 muccol_t type, *typetmp;
1300 1300
1301 // Store the char after the nick 1301 // Store the char after the nick
1302 tmp = line->text[line->mucnicklen]; 1302 tmp = line->text[line->mucnicklen];
1303 type = glob_muccol; 1303 type = glob_muccol;
1304 // Terminate the string after the nick 1304 // Terminate the string after the nick
1312 g_free(mucjid); 1312 g_free(mucjid);
1313 // Need to generate a color for the specified nick? 1313 // Need to generate a color for the specified nick?
1314 if ((type == MC_ALL) && (!nickcolors || 1314 if ((type == MC_ALL) && (!nickcolors ||
1315 !g_hash_table_lookup(nickcolors, line->text))) { 1315 !g_hash_table_lookup(nickcolors, line->text))) {
1316 char *snick, *mnick; 1316 char *snick, *mnick;
1317 nickcolor *nc; 1317 nickcolor_t *nc;
1318 const char *p = line->text; 1318 const char *p = line->text;
1319 unsigned int nicksum = 0; 1319 unsigned int nicksum = 0;
1320 snick = g_strdup(line->text); 1320 snick = g_strdup(line->text);
1321 mnick = g_strdup(line->text); 1321 mnick = g_strdup(line->text);
1322 nc = g_new(nickcolor, 1); 1322 nc = g_new(nickcolor_t, 1);
1323 ensure_string_htable(&nickcolors, NULL); 1323 ensure_string_htable(&nickcolors, NULL);
1324 while (*p) 1324 while (*p)
1325 nicksum += *p++; 1325 nicksum += *p++;
1326 nc->color = nickcols[nicksum % nickcolcount]; 1326 nc->color = nickcols[nicksum % nickcolcount];
1327 nc->manual = FALSE; 1327 nc->manual = FALSE;
1393 } 1393 }
1394 1394
1395 g_free(lines); 1395 g_free(lines);
1396 } 1396 }
1397 1397
1398 static winbuf *scr_create_window(const char *winId, int special, int dont_show) 1398 static winbuf_t *scr_create_window(const char *winId, int special, int dont_show)
1399 { 1399 {
1400 if (special) { 1400 if (special) {
1401 if (!statusWindow) { 1401 if (!statusWindow) {
1402 statusWindow = scr_new_buddy(NULL, dont_show); 1402 statusWindow = scr_new_buddy(NULL, dont_show);
1403 statusWindow->bd->hbuf = statushbuf; 1403 statusWindow->bd->hbuf = statushbuf;
1411 // scr_show_window() 1411 // scr_show_window()
1412 // Display the chat window with the given identifier. 1412 // Display the chat window with the given identifier.
1413 // "special" must be true if this is a special buffer window. 1413 // "special" must be true if this is a special buffer window.
1414 static void scr_show_window(const char *winId, int special) 1414 static void scr_show_window(const char *winId, int special)
1415 { 1415 {
1416 winbuf *win_entry; 1416 winbuf_t *win_entry;
1417 1417
1418 win_entry = scr_search_window(winId, special); 1418 win_entry = scr_search_window(winId, special);
1419 1419
1420 if (!win_entry) { 1420 if (!win_entry) {
1421 win_entry = scr_create_window(winId, special, FALSE); 1421 win_entry = scr_create_window(winId, special, FALSE);
1490 static void scr_write_in_window(const char *winId, const char *text, 1490 static void scr_write_in_window(const char *winId, const char *text,
1491 time_t timestamp, unsigned int prefix_flags, 1491 time_t timestamp, unsigned int prefix_flags,
1492 int force_show, unsigned mucnicklen, 1492 int force_show, unsigned mucnicklen,
1493 gpointer xep184) 1493 gpointer xep184)
1494 { 1494 {
1495 winbuf *win_entry; 1495 winbuf_t *win_entry;
1496 char *text_locale; 1496 char *text_locale;
1497 int dont_show = FALSE; 1497 int dont_show = FALSE;
1498 int special; 1498 int special;
1499 guint num_history_blocks; 1499 guint num_history_blocks;
1500 bool setmsgflg = FALSE; 1500 bool setmsgflg = FALSE;
1847 return; 1847 return;
1848 } 1848 }
1849 1849
1850 static void resize_win_buffer(gpointer key, gpointer value, gpointer data) 1850 static void resize_win_buffer(gpointer key, gpointer value, gpointer data)
1851 { 1851 {
1852 winbuf *wbp = value; 1852 winbuf_t *wbp = value;
1853 struct dimensions *dim = data; 1853 struct dimensions *dim = data;
1854 int chat_x_pos, chat_y_pos; 1854 int chat_x_pos, chat_y_pos;
1855 int new_chatwidth; 1855 int new_chatwidth;
1856 1856
1857 if (!(wbp && wbp->win)) 1857 if (!(wbp && wbp->win))
1987 wprintw(chatstatusWnd, "#"); 1987 wprintw(chatstatusWnd, "#");
1988 } 1988 }
1989 } 1989 }
1990 1990
1991 if (chatmode && !isgrp) { 1991 if (chatmode && !isgrp) {
1992 winbuf *win_entry; 1992 winbuf_t *win_entry;
1993 win_entry = scr_search_window(buddy_getjid(BUDDATA(current_buddy)), isspe); 1993 win_entry = scr_search_window(buddy_getjid(BUDDATA(current_buddy)), isspe);
1994 if (win_entry && win_entry->bd->lock) 1994 if (win_entry && win_entry->bd->lock)
1995 mvwprintw(chatstatusWnd, 0, 0, "*"); 1995 mvwprintw(chatstatusWnd, 0, 0, "*");
1996 } 1996 }
1997 1997
2256 int color = get_color(COLOR_ROSTER); 2256 int color = get_color(COLOR_ROSTER);
2257 if ((!isspe) && (!isgrp)) { // Look for color rules 2257 if ((!isspe) && (!isgrp)) { // Look for color rules
2258 GSList *head; 2258 GSList *head;
2259 const char *bjid = buddy_getjid(BUDDATA(buddy)); 2259 const char *bjid = buddy_getjid(BUDDATA(buddy));
2260 for (head = rostercolrules; head; head = g_slist_next(head)) { 2260 for (head = rostercolrules; head; head = g_slist_next(head)) {
2261 rostercolor *rc = head->data; 2261 rostercolor_t *rc = head->data;
2262 if (g_pattern_match_string(rc->compiled, bjid) && 2262 if (g_pattern_match_string(rc->compiled, bjid) &&
2263 (!strcmp("*", rc->status) || strchr(rc->status, status))) { 2263 (!strcmp("*", rc->status) || strchr(rc->status, status))) {
2264 color = compose_color(rc->color); 2264 color = compose_color(rc->color);
2265 break; 2265 break;
2266 } 2266 }
2412 scr_show_window(jidto, FALSE); 2412 scr_show_window(jidto, FALSE);
2413 } 2413 }
2414 2414
2415 void scr_remove_receipt_flag(const char *bjid, gconstpointer xep184) 2415 void scr_remove_receipt_flag(const char *bjid, gconstpointer xep184)
2416 { 2416 {
2417 winbuf *win_entry = scr_search_window(bjid, FALSE); 2417 winbuf_t *win_entry = scr_search_window(bjid, FALSE);
2418 if (win_entry && xep184) { 2418 if (win_entry && xep184) {
2419 hbuf_remove_receipt(win_entry->bd->hbuf, xep184); 2419 hbuf_remove_receipt(win_entry->bd->hbuf, xep184);
2420 if (chatmode && (buddy_search_jid(bjid) == current_buddy)) 2420 if (chatmode && (buddy_search_jid(bjid) == current_buddy))
2421 scr_update_buddy_window(); 2421 scr_update_buddy_window();
2422 } 2422 }
2841 // Scroll up/down the current buddy window, 2841 // Scroll up/down the current buddy window,
2842 // - half a screen if nblines is 0, 2842 // - half a screen if nblines is 0,
2843 // - up if updown == -1, down if updown == 1 2843 // - up if updown == -1, down if updown == 1
2844 void scr_buffer_scroll_up_down(int updown, unsigned int nblines) 2844 void scr_buffer_scroll_up_down(int updown, unsigned int nblines)
2845 { 2845 {
2846 winbuf *win_entry; 2846 winbuf_t *win_entry;
2847 int n, nbl; 2847 int n, nbl;
2848 GList *hbuf_top; 2848 GList *hbuf_top;
2849 guint isspe; 2849 guint isspe;
2850 2850
2851 // Get win_entry 2851 // Get win_entry
2898 2898
2899 // scr_buffer_clear() 2899 // scr_buffer_clear()
2900 // Clear the current buddy window (used for the /clear command) 2900 // Clear the current buddy window (used for the /clear command)
2901 void scr_buffer_clear(void) 2901 void scr_buffer_clear(void)
2902 { 2902 {
2903 winbuf *win_entry; 2903 winbuf_t *win_entry;
2904 guint isspe; 2904 guint isspe;
2905 2905
2906 // Get win_entry 2906 // Get win_entry
2907 if (!current_buddy) return; 2907 if (!current_buddy) return;
2908 isspe = buddy_gettype(BUDDATA(current_buddy)) & ROSTER_TYPE_SPECIAL; 2908 isspe = buddy_gettype(BUDDATA(current_buddy)) & ROSTER_TYPE_SPECIAL;
2919 update_panels(); 2919 update_panels();
2920 } 2920 }
2921 2921
2922 // buffer_purge() 2922 // buffer_purge()
2923 // key: winId/jid 2923 // key: winId/jid
2924 // value: winbuf structure 2924 // value: winbuf_t structure
2925 // data: int, set to 1 if the buffer should be closed. 2925 // data: int, set to 1 if the buffer should be closed.
2926 // NOTE: does not work for special buffers. 2926 // NOTE: does not work for special buffers.
2927 // Returns TRUE IFF the win_entry can be closed and freed. 2927 // Returns TRUE IFF the win_entry can be closed and freed.
2928 static gboolean buffer_purge(gpointer key, gpointer value, gpointer data) 2928 static gboolean buffer_purge(gpointer key, gpointer value, gpointer data)
2929 { 2929 {
2930 int *p_closebuf = data; 2930 int *p_closebuf = data;
2931 winbuf *win_entry = value; 2931 winbuf_t *win_entry = value;
2932 gboolean retval = FALSE; 2932 gboolean retval = FALSE;
2933 2933
2934 // Delete the current hbuf 2934 // Delete the current hbuf
2935 // unless we close the buffer *and* this is a shared bd structure 2935 // unless we close the buffer *and* this is a shared bd structure
2936 if (!(*p_closebuf && win_entry->bd->refcount)) 2936 if (!(*p_closebuf && win_entry->bd->refcount))
2959 // scr_buffer_purge(closebuf, jid) 2959 // scr_buffer_purge(closebuf, jid)
2960 // Purge/Drop the current buddy buffer or jid's buffer if jid != NULL. 2960 // Purge/Drop the current buddy buffer or jid's buffer if jid != NULL.
2961 // If closebuf is 1, close the buffer. 2961 // If closebuf is 1, close the buffer.
2962 void scr_buffer_purge(int closebuf, const char *jid) 2962 void scr_buffer_purge(int closebuf, const char *jid)
2963 { 2963 {
2964 winbuf *win_entry; 2964 winbuf_t *win_entry;
2965 guint isspe; 2965 guint isspe;
2966 const char *cjid; 2966 const char *cjid;
2967 char *ljid = NULL; 2967 char *ljid = NULL;
2968 guint hold_chatmode = FALSE; 2968 guint hold_chatmode = FALSE;
2969 2969
3046 // lock = 1 : lock 3046 // lock = 1 : lock
3047 // lock = 0 : unlock 3047 // lock = 0 : unlock
3048 // lock = -1: toggle lock status 3048 // lock = -1: toggle lock status
3049 void scr_buffer_scroll_lock(int lock) 3049 void scr_buffer_scroll_lock(int lock)
3050 { 3050 {
3051 winbuf *win_entry; 3051 winbuf_t *win_entry;
3052 guint isspe; 3052 guint isspe;
3053 3053
3054 // Get win_entry 3054 // Get win_entry
3055 if (!current_buddy) return; 3055 if (!current_buddy) return;
3056 isspe = buddy_gettype(BUDDATA(current_buddy)) & ROSTER_TYPE_SPECIAL; 3056 isspe = buddy_gettype(BUDDATA(current_buddy)) & ROSTER_TYPE_SPECIAL;
3089 // If action = 1, set the readmark flag on the last message 3089 // If action = 1, set the readmark flag on the last message
3090 // If action = 0, reset the readmark flag 3090 // If action = 0, reset the readmark flag
3091 // If action = -1, remove the readmark flag iff it is on the last line 3091 // If action = -1, remove the readmark flag iff it is on the last line
3092 void scr_buffer_readmark(gchar action) 3092 void scr_buffer_readmark(gchar action)
3093 { 3093 {
3094 winbuf *win_entry; 3094 winbuf_t *win_entry;
3095 guint isspe; 3095 guint isspe;
3096 int autolock; 3096 int autolock;
3097 3097
3098 // Get win_entry 3098 // Get win_entry
3099 if (!current_buddy) return; 3099 if (!current_buddy) return;
3115 // scr_buffer_top_bottom() 3115 // scr_buffer_top_bottom()
3116 // Jump to the head/tail of the current buddy window 3116 // Jump to the head/tail of the current buddy window
3117 // (top if topbottom == -1, bottom topbottom == 1) 3117 // (top if topbottom == -1, bottom topbottom == 1)
3118 void scr_buffer_top_bottom(int topbottom) 3118 void scr_buffer_top_bottom(int topbottom)
3119 { 3119 {
3120 winbuf *win_entry; 3120 winbuf_t *win_entry;
3121 guint isspe; 3121 guint isspe;
3122 3122
3123 // Get win_entry 3123 // Get win_entry
3124 if (!current_buddy) return; 3124 if (!current_buddy) return;
3125 isspe = buddy_gettype(BUDDATA(current_buddy)) & ROSTER_TYPE_SPECIAL; 3125 isspe = buddy_gettype(BUDDATA(current_buddy)) & ROSTER_TYPE_SPECIAL;
3142 // scr_buffer_search(direction, text) 3142 // scr_buffer_search(direction, text)
3143 // Jump to the next line containing text 3143 // Jump to the next line containing text
3144 // (backward search if direction == -1, forward if topbottom == 1) 3144 // (backward search if direction == -1, forward if topbottom == 1)
3145 void scr_buffer_search(int direction, const char *text) 3145 void scr_buffer_search(int direction, const char *text)
3146 { 3146 {
3147 winbuf *win_entry; 3147 winbuf_t *win_entry;
3148 GList *current_line, *search_res; 3148 GList *current_line, *search_res;
3149 guint isspe; 3149 guint isspe;
3150 3150
3151 // Get win_entry 3151 // Get win_entry
3152 if (!current_buddy) return; 3152 if (!current_buddy) return;
3176 3176
3177 // scr_buffer_percent(n) 3177 // scr_buffer_percent(n)
3178 // Jump to the specified position in the buffer, in % 3178 // Jump to the specified position in the buffer, in %
3179 void scr_buffer_percent(int pc) 3179 void scr_buffer_percent(int pc)
3180 { 3180 {
3181 winbuf *win_entry; 3181 winbuf_t *win_entry;
3182 GList *search_res; 3182 GList *search_res;
3183 guint isspe; 3183 guint isspe;
3184 3184
3185 // Get win_entry 3185 // Get win_entry
3186 if (!current_buddy) return; 3186 if (!current_buddy) return;
3208 // scr_buffer_date(t) 3208 // scr_buffer_date(t)
3209 // Jump to the first line after date t in the buffer 3209 // Jump to the first line after date t in the buffer
3210 // t is a date in seconds since `00:00:00 1970-01-01 UTC' 3210 // t is a date in seconds since `00:00:00 1970-01-01 UTC'
3211 void scr_buffer_date(time_t t) 3211 void scr_buffer_date(time_t t)
3212 { 3212 {
3213 winbuf *win_entry; 3213 winbuf_t *win_entry;
3214 GList *search_res; 3214 GList *search_res;
3215 guint isspe; 3215 guint isspe;
3216 3216
3217 // Get win_entry 3217 // Get win_entry
3218 if (!current_buddy) return; 3218 if (!current_buddy) return;
3237 3237
3238 // scr_buffer_jump_readmark() 3238 // scr_buffer_jump_readmark()
3239 // Jump to the buffer readmark, if there's one 3239 // Jump to the buffer readmark, if there's one
3240 void scr_buffer_jump_readmark(void) 3240 void scr_buffer_jump_readmark(void)
3241 { 3241 {
3242 winbuf *win_entry; 3242 winbuf_t *win_entry;
3243 GList *search_res; 3243 GList *search_res;
3244 guint isspe; 3244 guint isspe;
3245 3245
3246 // Get win_entry 3246 // Get win_entry
3247 if (!current_buddy) return; 3247 if (!current_buddy) return;
3288 g_free(extfname); 3288 g_free(extfname);
3289 } 3289 }
3290 3290
3291 // buffer_list() 3291 // buffer_list()
3292 // key: winId/jid 3292 // key: winId/jid
3293 // value: winbuf structure 3293 // value: winbuf_t structure
3294 // data: none. 3294 // data: none.
3295 static void buffer_list(gpointer key, gpointer value, gpointer data) 3295 static void buffer_list(gpointer key, gpointer value, gpointer data)
3296 { 3296 {
3297 GList *head; 3297 GList *head;
3298 winbuf *win_entry = value; 3298 winbuf_t *win_entry = value;
3299 3299
3300 head = g_list_first(win_entry->bd->hbuf); 3300 head = g_list_first(win_entry->bd->hbuf);
3301 3301
3302 scr_LogPrint(LPRINT_NORMAL, " %s (%u/%u)", (const char *) key, 3302 scr_LogPrint(LPRINT_NORMAL, " %s (%u/%u)", (const char *) key,
3303 g_list_length(head), hbuf_get_blocks_number(head)); 3303 g_list_length(head), hbuf_get_blocks_number(head));
3353 if (special) 3353 if (special)
3354 current_id = buddy_getname(BUDDATA(current_buddy)); 3354 current_id = buddy_getname(BUDDATA(current_buddy));
3355 else 3355 else
3356 current_id = buddy_getjid(BUDDATA(current_buddy)); 3356 current_id = buddy_getjid(BUDDATA(current_buddy));
3357 if (current_id) { 3357 if (current_id) {
3358 winbuf *win_entry = scr_search_window(current_id, special); 3358 winbuf_t *win_entry = scr_search_window(current_id, special);
3359 if (!win_entry) return; 3359 if (!win_entry) return;
3360 iscurrentlocked = win_entry->bd->lock; 3360 iscurrentlocked = win_entry->bd->lock;
3361 } 3361 }
3362 } else { 3362 } else {
3363 current_id = NULL; 3363 current_id = NULL;
3373 // TODO: avoid code duplication with scr_setmsgflag_if_needed() 3373 // TODO: avoid code duplication with scr_setmsgflag_if_needed()
3374 void scr_setattentionflag_if_needed(const char *bjid, int special, 3374 void scr_setattentionflag_if_needed(const char *bjid, int special,
3375 guint value, enum setuiprio_ops action) 3375 guint value, enum setuiprio_ops action)
3376 { 3376 {
3377 const char *current_id; 3377 const char *current_id;
3378 winbuf *wb; 3378 winbuf_t *wb;
3379 bool iscurrentlocked = FALSE; 3379 bool iscurrentlocked = FALSE;
3380 3380
3381 if (!bjid) 3381 if (!bjid)
3382 return; 3382 return;
3383 3383
3389 if (special) 3389 if (special)
3390 current_id = buddy_getname(BUDDATA(current_buddy)); 3390 current_id = buddy_getname(BUDDATA(current_buddy));
3391 else 3391 else
3392 current_id = buddy_getjid(BUDDATA(current_buddy)); 3392 current_id = buddy_getjid(BUDDATA(current_buddy));
3393 if (current_id) { 3393 if (current_id) {
3394 winbuf *win_entry = scr_search_window(current_id, special); 3394 winbuf_t *win_entry = scr_search_window(current_id, special);
3395 if (!win_entry) return; 3395 if (!win_entry) return;
3396 iscurrentlocked = win_entry->bd->lock; 3396 iscurrentlocked = win_entry->bd->lock;
3397 } 3397 }
3398 } else { 3398 } else {
3399 current_id = NULL; 3399 current_id = NULL;
4250 refresh_inputline(); 4250 refresh_inputline();
4251 } 4251 }
4252 4252
4253 static void add_keyseq(char *seqstr, guint mkeycode, gint value) 4253 static void add_keyseq(char *seqstr, guint mkeycode, gint value)
4254 { 4254 {
4255 keyseq *ks; 4255 keyseq_t *ks;
4256 4256
4257 // Let's make sure the length is correct 4257 // Let's make sure the length is correct
4258 if (strlen(seqstr) > MAX_KEYSEQ_LENGTH) { 4258 if (strlen(seqstr) > MAX_KEYSEQ_LENGTH) {
4259 scr_LogPrint(LPRINT_LOGNORM, "add_keyseq(): key sequence is too long!"); 4259 scr_LogPrint(LPRINT_LOGNORM, "add_keyseq(): key sequence is too long!");
4260 return; 4260 return;
4261 } 4261 }
4262 4262
4263 ks = g_new0(keyseq, 1); 4263 ks = g_new0(keyseq_t, 1);
4264 ks->seqstr = g_strdup(seqstr); 4264 ks->seqstr = g_strdup(seqstr);
4265 ks->mkeycode = mkeycode; 4265 ks->mkeycode = mkeycode;
4266 ks->value = value; 4266 ks->value = value;
4267 keyseqlist = g_slist_append(keyseqlist, ks); 4267 keyseqlist = g_slist_append(keyseqlist, ks);
4268 } 4268 }
4272 // Return value: 4272 // Return value:
4273 // -1 if "seq" matches no known sequence 4273 // -1 if "seq" matches no known sequence
4274 // 0 if "seq" could match 1 or more known sequences 4274 // 0 if "seq" could match 1 or more known sequences
4275 // >0 if "seq" matches a key sequence; the mkey code is returned 4275 // >0 if "seq" matches a key sequence; the mkey code is returned
4276 // and *ret is set to the matching keyseq structure. 4276 // and *ret is set to the matching keyseq structure.
4277 static inline gint match_keyseq(int *iseq, keyseq **ret) 4277 static inline gint match_keyseq(int *iseq, keyseq_t **ret)
4278 { 4278 {
4279 GSList *ksl; 4279 GSList *ksl;
4280 keyseq *ksp; 4280 keyseq_t *ksp;
4281 char *p, c; 4281 char *p, c;
4282 int *i; 4282 int *i;
4283 int needmore = FALSE; 4283 int needmore = FALSE;
4284 4284
4285 for (ksl = keyseqlist; ksl; ksl = g_slist_next(ksl)) { 4285 for (ksl = keyseqlist; ksl; ksl = g_slist_next(ksl)) {
4330 if (len) 4330 if (len)
4331 return 0; 4331 return 0;
4332 return c; 4332 return c;
4333 } 4333 }
4334 4334
4335 void scr_getch(keycode *kcode) 4335 void scr_getch(keycode_t *kcode)
4336 { 4336 {
4337 keyseq *mks = NULL; 4337 keyseq_t *mks = NULL;
4338 int ks[MAX_KEYSEQ_LENGTH+1]; 4338 int ks[MAX_KEYSEQ_LENGTH+1];
4339 int i; 4339 int i;
4340 4340
4341 memset(kcode, 0, sizeof(keycode)); 4341 memset(kcode, 0, sizeof(keycode_t));
4342 memset(ks, 0, sizeof(ks)); 4342 memset(ks, 0, sizeof(ks));
4343 4343
4344 kcode->value = wgetch(inputWnd); 4344 kcode->value = wgetch(inputWnd);
4345 if (utf8_mode) { 4345 if (utf8_mode) {
4346 bool ismeta = (kcode->value == 27); 4346 bool ismeta = (kcode->value == 27);
4422 if (colors_stalled) 4422 if (colors_stalled)
4423 parse_colors(); 4423 parse_colors();
4424 doupdate(); 4424 doupdate();
4425 } 4425 }
4426 4426
4427 static void bindcommand(keycode kcode) 4427 static void bindcommand(keycode_t kcode)
4428 { 4428 {
4429 gchar asciikey[16], asciicode[16]; 4429 gchar asciikey[16], asciicode[16];
4430 const gchar *boundcmd; 4430 const gchar *boundcmd;
4431 4431
4432 if (kcode.utf8) 4432 if (kcode.utf8)
4507 process_command(mkcmdstr("roster down"), TRUE); 4507 process_command(mkcmdstr("roster down"), TRUE);
4508 } 4508 }
4509 4509
4510 // scr_process_key(key) 4510 // scr_process_key(key)
4511 // Handle the pressed key, in the command line (bottom). 4511 // Handle the pressed key, in the command line (bottom).
4512 void scr_process_key(keycode kcode) 4512 void scr_process_key(keycode_t kcode)
4513 { 4513 {
4514 int key = kcode.value; 4514 int key = kcode.value;
4515 int display_char = FALSE; 4515 int display_char = FALSE;
4516 int vi_search = FALSE; 4516 int vi_search = FALSE;
4517 static int ex_or_search_mode = FALSE; 4517 static int ex_or_search_mode = FALSE;
4877 } 4877 }
4878 4878
4879 #if defined(WITH_ENCHANT) || defined(WITH_ASPELL) 4879 #if defined(WITH_ENCHANT) || defined(WITH_ASPELL)
4880 static void spell_checker_free(gpointer data) 4880 static void spell_checker_free(gpointer data)
4881 { 4881 {
4882 spell_checker* sc = data; 4882 spell_checker_t *sc = data;
4883 #ifdef WITH_ENCHANT 4883 #ifdef WITH_ENCHANT
4884 enchant_broker_free_dict(sc->broker, sc->checker); 4884 enchant_broker_free_dict(sc->broker, sc->checker);
4885 enchant_broker_free(sc->broker); 4885 enchant_broker_free(sc->broker);
4886 #endif 4886 #endif
4887 #ifdef WITH_ASPELL 4887 #ifdef WITH_ASPELL
4889 delete_aspell_config(sc->config); 4889 delete_aspell_config(sc->config);
4890 #endif 4890 #endif
4891 g_free(sc); 4891 g_free(sc);
4892 } 4892 }
4893 4893
4894 static spell_checker* new_spell_checker(const char* spell_lang) 4894 static spell_checker_t* new_spell_checker(const char* spell_lang)
4895 { 4895 {
4896 spell_checker* sc = g_new(spell_checker, 1); 4896 spell_checker_t *sc = g_new(spell_checker_t, 1);
4897 #ifdef WITH_ASPELL 4897 #ifdef WITH_ASPELL
4898 const char *spell_encoding = settings_opt_get("spell_encoding"); 4898 const char *spell_encoding = settings_opt_get("spell_encoding");
4899 AspellCanHaveError *possible_err; 4899 AspellCanHaveError *possible_err;
4900 sc->config = new_aspell_config(); 4900 sc->config = new_aspell_config();
4901 if (spell_encoding) 4901 if (spell_encoding)
4926 // initialization 4926 // initialization
4927 void spellcheck_init(void) 4927 void spellcheck_init(void)
4928 { 4928 {
4929 int spell_enable = settings_opt_get_int("spell_enable"); 4929 int spell_enable = settings_opt_get_int("spell_enable");
4930 const char *spell_lang = settings_opt_get("spell_lang"); 4930 const char *spell_lang = settings_opt_get("spell_lang");
4931 gchar** langs; 4931 gchar **langs;
4932 gchar** lang_iter; 4932 gchar **lang_iter;
4933 spell_checker* sc; 4933 spell_checker_t *sc;
4934 4934
4935 if (!spell_enable) 4935 if (!spell_enable)
4936 return; 4936 return;
4937 4937
4938 spellcheck_deinit(); 4938 spellcheck_deinit();
4968 } 4968 }
4969 4969
4970 typedef struct { 4970 typedef struct {
4971 const char* str; 4971 const char* str;
4972 int len; 4972 int len;
4973 } spell_substring; 4973 } spell_substring_t;
4974 4974
4975 static int spellcheckword(gconstpointer sc_ptr, gconstpointer substr_ptr) 4975 static int spellcheckword(gconstpointer sc_ptr, gconstpointer substr_ptr)
4976 { 4976 {
4977 spell_checker* sc = (spell_checker*) sc_ptr; 4977 spell_checker_t *sc = (spell_checker_t*) sc_ptr;
4978 spell_substring* substr = (spell_substring*) substr_ptr; 4978 spell_substring_t *substr = (spell_substring_t*) substr_ptr;
4979 #ifdef WITH_ENCHANT 4979 #ifdef WITH_ENCHANT
4980 // enchant_dict_check will return 0 on good word 4980 // enchant_dict_check will return 0 on good word
4981 return enchant_dict_check(sc->checker, substr->str, substr->len); 4981 return enchant_dict_check(sc->checker, substr->str, substr->len);
4982 #endif 4982 #endif
4983 #ifdef WITH_ASPELL 4983 #ifdef WITH_ASPELL
4991 4991
4992 // Spell checking function 4992 // Spell checking function
4993 static void spellcheck(char *line, char *checked) 4993 static void spellcheck(char *line, char *checked)
4994 { 4994 {
4995 const char *start, *line_start; 4995 const char *start, *line_start;
4996 spell_substring substr; 4996 spell_substring_t substr;
4997 4997
4998 if (inputLine[0] == 0 || inputLine[0] == COMMAND_CHAR) 4998 if (inputLine[0] == 0 || inputLine[0] == COMMAND_CHAR)
4999 return; 4999 return;
5000 5000
5001 // Give up early if not languages are loaded 5001 // Give up early if not languages are loaded