NULL terminate strncpy destination string
[dockapps/wmnotify.git] / src / wmnotify.c
index 8847a24..df37276 100644 (file)
@@ -4,19 +4,7 @@
  * Copyright (C) 2003 Hugo Villeneuve (hugo@hugovil.com)
  * based on WMPop3 by Scott Holden (scotth@thezone.net)
  *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
+ * This file is released under the GPLv2
  */
 
 /* Define filename_M */
 #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;
@@ -70,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);
@@ -173,7 +161,7 @@ static void ExecuteCommand(char *argv[])
 }
 
 
-/* single-click --> Checking mail */
+/* Single-click callback */
 static void SingleClick(void)
 {
        int status;
@@ -182,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);
@@ -195,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);
 }
 
 
@@ -267,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,
@@ -379,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;
@@ -418,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.
@@ -441,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)
@@ -475,13 +480,22 @@ 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);
 
        /* Initializing and creating a DockApp window. */
-       InitDockAppWindow(argc, argv, wmnotify_xpm,
-                         wmnotify_infos.display_arg,
-                         wmnotify_infos.geometry_arg);
+       InitDockAppWindow(argc, argv, wmnotify_xpm);
 
        /* Starting thread for periodically checking for new mail. */
        status = pthread_create(&timer_thread, NULL, TimerThread, NULL);