X-Git-Url: http://gitweb.hugovil.com/?a=blobdiff_plain;f=src%2Fwmnotify.c;h=df37276b2095446e06bb3568945a1e7001ddfbda;hb=44915ef56ef12a7440032daaaec403d58fe1b20e;hp=fec7d103070be399900157586f294f5ef3a2713b;hpb=bb08ff6bf7ea7a57f9db153451fb3073d236faaa;p=dockapps%2Fwmnotify.git diff --git a/src/wmnotify.c b/src/wmnotify.c index fec7d10..df37276 100644 --- a/src/wmnotify.c +++ b/src/wmnotify.c @@ -41,16 +41,13 @@ #include "wmnotify.h" -/* - * Set in DoubleClick() to stop the new mail animation when the mail client is - * opened. - */ +/* Set to 1 to stop the new mail animation when the mail client is opened. */ static bool animation_stop; static int animation_image = MAILBOX_FULL; /* - * Set in response to signal sent by SingleClick() to force mail check. Also set + * Set in response to single or double-click to force mail check. Also set * to true at startup to force initial check. */ static bool manual_check = true; @@ -58,13 +55,16 @@ static bool manual_check = true; /* Used to signal TimerThread to quit. Inactive for now. */ static bool quit; -static int double_click_notif; +static int start_mail_client_notif; + +static int single_click_sig; +static int double_click_sig; /* TimerThread ID */ static pthread_t timer_thread; -inline void ErrorLocation(const char *file, int line) +void ErrorLocation(const char *file, int line) { fprintf(stderr, " Error in file \"%s\" at line #%d\n", file, line); @@ -161,7 +161,7 @@ static void ExecuteCommand(char *argv[]) } -/* single-click --> Checking mail */ +/* Single-click callback */ static void SingleClick(void) { int status; @@ -170,7 +170,7 @@ static void SingleClick(void) printf("%s: SingleClick() Entry\n", PACKAGE); /* Sending a signal to awake the TimerThread() thread. */ - status = pthread_kill(timer_thread, SIGUSR1); + status = pthread_kill(timer_thread, single_click_sig); if (status != EXIT_SUCCESS) { fprintf(stderr, "%s: pthread_kill() error (%d)\n", PACKAGE, status); @@ -183,50 +183,25 @@ static void SingleClick(void) } -/* Double-click --> Starting external mail client. */ +/* Double-click callback */ static void DoubleClick(void) { int status; - if (wmnotify_infos.mail_client_argv[0] != NULL) { - /* Starting external mail client. */ - ExecuteCommand(wmnotify_infos.mail_client_argv); - - double_click_notif = true; - - /* - * Sending a signal to awake the TimerThread() thread. This was - * previously done with a mutex variable (animation_stop), but - * this caused a bug when the following sequence was - * encountered: - * -The user double-click to start the external mail client - * -A new E-mail is received shortly after that - * -The user exit the external mail client - * -The user manually check for new E-mail - * -The audio notification sound is played, but no animation - * image is displayed. - * This was because setting the mutex variable 'animation_stop' - * didn't awakened the TimerThread(), but single-clicking - * awakened it. Since the 'animation_stop' variable was still - * set to true, no animation occured. - */ - status = pthread_kill(timer_thread, SIGUSR2); - if (status != EXIT_SUCCESS) { - fprintf(stderr, "%s: pthread_kill() error (%d)\n", - PACKAGE, status); - ErrorLocation(__FILE__, __LINE__); - exit(EXIT_FAILURE); - } - - DisplayExecuteCommandNotification(); - sleep(1); - DisplayClosedMailbox(); + if (wmnotify_infos.debug) + printf("%s: DoubleClick() Entry\n", PACKAGE); - double_click_notif = false; - } else { - fprintf(stderr, "%s: Warning: No email-client defined.\n", - PACKAGE); + /* Sending a signal to awake the TimerThread() thread. */ + status = pthread_kill(timer_thread, double_click_sig); + if (status != EXIT_SUCCESS) { + fprintf(stderr, "%s: pthread_kill() error (%d)\n", PACKAGE, + status); + ErrorLocation(__FILE__, __LINE__); + exit(EXIT_FAILURE); } + + if (wmnotify_infos.debug) + printf("%s: DoubleClick() Exit\n", PACKAGE); } @@ -255,17 +230,56 @@ static void CatchChildTerminationSignal(int signal) } } +/* + * Sending of a signal to awake the TimerThread() thread: This was + * previously done with a mutex variable (animation_stop), but + * this caused a bug when the following sequence was + * encountered: + * -The user double-click to start the external mail client + * -A new E-mail is received shortly after that + * -The user exit the external mail client + * -The user manually check for new E-mail + * -The audio notification sound is played, but no animation + * image is displayed. + * This was because setting the mutex variable 'animation_stop' + * didn't awakened the TimerThread(), but single-clicking + * awakened it. Since the 'animation_stop' variable was still + * set to true, no animation occured. + */ +static void +start_mail_client(void) +{ + if (wmnotify_infos.mail_client_argv[0] != NULL) { + if (wmnotify_infos.debug) + printf("%s: Starting mail client\n", PACKAGE); + + /* Starting external mail client. */ + ExecuteCommand(wmnotify_infos.mail_client_argv); + + start_mail_client_notif = true; + + DisplayExecuteCommandNotification(); + sleep(1); + DisplayClosedMailbox(); + + start_mail_client_notif = false; + } else { + fprintf(stderr, "%s: Warning: No email-client defined.\n", + PACKAGE); + } +} static void CatchTimerSignal(int signal) { switch (signal) { case SIGUSR1: - /* Catching the signal sent by the SingleClick() function. */ + /* Catching the signal to manually check mail. */ manual_check = true; break; case SIGUSR2: - /* Catching the signal sent by the DoubleClick() function. */ + /* Catching the signal to start mail client. */ animation_stop = true; + start_mail_client(); break; default: fprintf(stderr, @@ -367,6 +381,9 @@ static void *TimerThread(void *arg) if (wmnotify_infos.debug) printf("%s: Timer thread iteration.\n", PACKAGE); + if (manual_check && wmnotify_infos.debug) + printf("%s: Manual check requested\n", PACKAGE); + if ((manual_check == true) || (counter == 0)) { new_messages = CheckForNewMail(manual_check); manual_check = false; @@ -406,7 +423,7 @@ static void *TimerThread(void *arg) } animation_running = false; animation_stop = false; - if (double_click_notif == false) { + if (start_mail_client_notif == false) { /* * Before exiting, be sure to put NO MAIL image * back in place. @@ -429,10 +446,10 @@ static void *TimerThread(void *arg) NewMailAnimation(); (void) usleep(NEW_MAIL_ANIMATION_DURATION); counter--; - } - if (wmnotify_infos.debug) - printf("%s: counter = %d\n", PACKAGE, counter); + if (wmnotify_infos.debug) + printf("%s: counter = %d\n", PACKAGE, counter); + } } /* end while */ if (wmnotify_infos.debug) @@ -463,6 +480,17 @@ int main(int argc, char *argv[]) */ (void) signal(SIGCHLD, CatchChildTerminationSignal); + if (wmnotify_infos.mailcheck_single_click) + { + single_click_sig = SIGUSR1; + double_click_sig = SIGUSR2; + } + else + { + single_click_sig = SIGUSR2; + double_click_sig = SIGUSR1; + } + /* Initialize callback function pointers. */ ProcessXlibEventsInit(SingleClick, DoubleClick);