#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;
/* 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);
}
-/* single-click --> Checking mail */
+/* Single-click callback */
static void SingleClick(void)
{
int status;
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);
}
-/* 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);
}
}
}
+/*
+ * 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,
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;
}
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.
*/
(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);