Mercurial > ~mikael > mcabber > hg
comparison mcabber/mcabber/main.c @ 2288:ece02eb9c81d
Backed out changeset 1bb9002801e5
author | Mikael Berthe <mikael@lilotux.net> |
---|---|
date | Tue, 13 Dec 2016 22:26:45 +0100 |
parents | 1bb9002801e5 |
children | f181418db215 |
comparison
equal
deleted
inserted
replaced
2287:1f5f708d58a6 | 2288:ece02eb9c81d |
---|---|
26 #include <sys/types.h> | 26 #include <sys/types.h> |
27 #include <sys/wait.h> | 27 #include <sys/wait.h> |
28 #include <glib.h> | 28 #include <glib.h> |
29 #include <config.h> | 29 #include <config.h> |
30 #include <poll.h> | 30 #include <poll.h> |
31 #include <time.h> | |
32 #include <errno.h> | 31 #include <errno.h> |
33 | 32 |
34 #include "caps.h" | 33 #include "caps.h" |
35 #include "screen.h" | 34 #include "screen.h" |
36 #include "settings.h" | 35 #include "settings.h" |
65 #ifdef USE_SIGWINCH | 64 #ifdef USE_SIGWINCH |
66 void sigwinch_resize(void); | 65 void sigwinch_resize(void); |
67 static bool sigwinch; | 66 static bool sigwinch; |
68 #endif | 67 #endif |
69 | 68 |
70 extern int build_buddylist; | |
71 | |
72 static bool terminate_ui; | 69 static bool terminate_ui; |
73 GMainContext *main_context; | 70 GMainContext *main_context; |
74 static guint refresh_timeout_id; | |
75 | 71 |
76 static struct termios *backup_termios; | 72 static struct termios *backup_termios; |
77 | 73 |
78 char *mcabber_version(void) | 74 char *mcabber_version(void) |
79 { | 75 { |
379 static gboolean mcabber_source_dispatch(GSource *source, GSourceFunc callback, | 375 static gboolean mcabber_source_dispatch(GSource *source, GSourceFunc callback, |
380 gpointer udata) { | 376 gpointer udata) { |
381 return keyboard_activity(); | 377 return keyboard_activity(); |
382 } | 378 } |
383 | 379 |
384 static gboolean refresh_timeout_cb(gpointer data) { | |
385 // Only called once, to trigger a refresh if needed | |
386 // so reset ID and return false. | |
387 refresh_timeout_id = 0; | |
388 return FALSE; | |
389 } | |
390 | |
391 static GSourceFuncs mcabber_source_funcs = { | 380 static GSourceFuncs mcabber_source_funcs = { |
392 mcabber_source_prepare, | 381 mcabber_source_prepare, |
393 mcabber_source_check, | 382 mcabber_source_check, |
394 mcabber_source_dispatch, | 383 mcabber_source_dispatch, |
395 NULL, | 384 NULL, |
492 settings_set(SETTINGS_TYPE_OPTION, "password", pwd); | 481 settings_set(SETTINGS_TYPE_OPTION, "password", pwd); |
493 g_free(pwd); | 482 g_free(pwd); |
494 } | 483 } |
495 } | 484 } |
496 | 485 |
497 /* Initialize buddylist update timestamp */ | |
498 struct timespec last_ui_update; | |
499 clock_gettime(CLOCK_MONOTONIC, &last_ui_update); | |
500 | |
501 /* Initialize PGP system | 486 /* Initialize PGP system |
502 We do it before ncurses initialization because we may need to request | 487 We do it before ncurses initialization because we may need to request |
503 a passphrase. */ | 488 a passphrase. */ |
504 if (settings_opt_get_int("pgp")) | 489 if (settings_opt_get_int("pgp")) |
505 main_init_pgp(); | 490 main_init_pgp(); |
568 g_source_attach(mc_source, main_context); | 553 g_source_attach(mc_source, main_context); |
569 | 554 |
570 scr_LogPrint(LPRINT_DEBUG, "Entering into main loop..."); | 555 scr_LogPrint(LPRINT_DEBUG, "Entering into main loop..."); |
571 | 556 |
572 while(!terminate_ui) { | 557 while(!terminate_ui) { |
573 int64_t timediff; | |
574 struct timespec now; | |
575 | |
576 if (g_main_context_iteration(main_context, TRUE) == FALSE) | 558 if (g_main_context_iteration(main_context, TRUE) == FALSE) |
577 keyboard_activity(); | 559 keyboard_activity(); |
578 #ifdef USE_SIGWINCH | 560 #ifdef USE_SIGWINCH |
579 if (sigwinch) { | 561 if (sigwinch) { |
580 sigwinch_resize(); | 562 sigwinch_resize(); |
581 sigwinch = FALSE; | 563 sigwinch = FALSE; |
582 } | 564 } |
583 #endif | 565 #endif |
584 | 566 if (update_roster) |
585 // Compute time in ms since last buddylist/screen update | 567 scr_draw_roster(); |
586 clock_gettime(CLOCK_MONOTONIC, &now); | 568 scr_do_update(); |
587 timediff = (((now.tv_sec - last_ui_update.tv_sec) * 1.0e9) + | |
588 (now.tv_nsec - last_ui_update.tv_nsec)) / 1.0e6; | |
589 | |
590 if (timediff <= 200) { | |
591 // Trigger a timeout in 1s to make sure no refresh will be missed | |
592 if (!refresh_timeout_id) { | |
593 refresh_timeout_id = g_timeout_add_seconds_full(G_PRIORITY_DEFAULT, | |
594 1, refresh_timeout_cb, NULL, NULL); | |
595 } | |
596 } else if ((build_buddylist || update_roster)) { | |
597 // More than 200ms | |
598 if (build_buddylist || update_roster) { | |
599 if (build_buddylist) { | |
600 buddylist_build(); | |
601 update_roster = TRUE; | |
602 } | |
603 if (update_roster) { | |
604 scr_draw_roster(); | |
605 scr_do_update(); | |
606 last_ui_update = now; | |
607 } | |
608 } else { | |
609 // No roster change; minimum screen update | |
610 update_panels(); | |
611 doupdate(); | |
612 } | |
613 } | |
614 } | 569 } |
615 | 570 |
616 g_source_destroy(mc_source); | 571 g_source_destroy(mc_source); |
617 g_source_unref(mc_source); | 572 g_source_unref(mc_source); |
618 } | 573 } |