From 895dc918b7a9e6052fce8f154c4d596475143d02 Mon Sep 17 00:00:00 2001
From: Frederic Culot <calcurse@culot.org>
Date: Sat, 14 Apr 2007 18:43:03 +0000
Subject: bugfix: correct item is now highlighted when changing day inside
 appointment panel with CTRL keys sigchld_handler() created to catch zombie
 processes init_sighandler() created

---
 src/calcurse.c | 48 ++++++++++++++++++++++++++++++++++++++++++------
 1 file changed, 42 insertions(+), 6 deletions(-)

(limited to 'src')

diff --git a/src/calcurse.c b/src/calcurse.c
index d9a2033..d107ac5 100755
--- a/src/calcurse.c
+++ b/src/calcurse.c
@@ -1,4 +1,4 @@
-/*	$calcurse: calcurse.c,v 1.42 2007/04/04 19:41:00 culot Exp $	*/
+/*	$calcurse: calcurse.c,v 1.43 2007/04/14 18:43:03 culot Exp $	*/
 
 /*
  * Calcurse - text-based organizer
@@ -28,7 +28,10 @@
 #include <config.h>
 #endif /* HAVE_CONFIG_H */
 
+#include <sys/types.h>
+#include <sys/wait.h>
 #include <ncurses.h>	
+#include <signal.h>
 #include <pthread.h>
 #include <time.h>
 #include <string.h>
@@ -91,6 +94,8 @@ int which_pan = 0;
 enum window_number {CALENDAR, APPOINTMENT, TODO};
 
 /* External functions */
+static void sigchld_handler(int sig);
+static void init_sighandler(struct sigaction *sa);
 static void get_date(void);
 static void init_vars(conf_t *conf);
 static void init_wins(void);
@@ -120,6 +125,7 @@ int main(int argc, char **argv)
 	conf_t conf;
 	int ch, background, foreground;
 	int non_interactive;
+	struct sigaction sigact;
 	bool do_storage = false;
 	bool day_changed = false;
         char *no_color_support = 
@@ -147,10 +153,11 @@ int main(int argc, char **argv)
 		return (EXIT_SUCCESS);
 
 	/* Begin of interactive mode with ncurses interface. */
-	initscr();		/* start the curses mode */
-	cbreak();		/* control chars generate a signal */
-	noecho();		/* controls echoing of typed chars */
-	curs_set(0);		/* make cursor invisible */
+	init_sighandler(&sigact);	/* signal handling init */
+	initscr();			/* start the curses mode */
+	cbreak();			/* control chars generate a signal */
+	noecho();			/* controls echoing of typed chars */
+	curs_set(0);			/* make cursor invisible */
         get_date();
 	notify_init_vars();
 	get_screen_config();
@@ -198,7 +205,6 @@ int main(int argc, char **argv)
 	custom_load_conf(&conf, background, layout, nc_bar, nl_bar);
 	nb_tod = load_todo();	
 	load_app();
-	notify_catch_children();
 	if (notify_bar()) 
 		notify_start_main_thread();
 	get_screen_config();
@@ -557,6 +563,10 @@ int main(int argc, char **argv)
 			if (day_changed) {
 				sav_hilt_app = 0;
 				day_changed = !day_changed;
+				if ((which_pan == APPOINTMENT) && 
+				    (number_events_inday + number_apoints_inday
+				    != 0))
+					hilt_app = 1;
 			}
 		}
 		update_windows(which_pan, &conf);
@@ -567,6 +577,32 @@ int main(int argc, char **argv)
  * EXTERNAL FUNCTIONS
  */
 
+/* 
+ * Catch return values from children (user-defined notification commands).
+ * This is needed to avoid zombie processes running on system.
+ */
+void
+sigchld_handler(int sig)
+{
+	while (waitpid(WAIT_MYPGRP, NULL, WNOHANG) > 0)
+		;
+}
+
+/* Signal handling init. */
+void
+init_sighandler(struct sigaction *sa)
+{
+	sa->sa_handler = sigchld_handler;
+	sa->sa_flags = 0;
+	sigemptyset(&sa->sa_mask);
+
+	if (sigaction(SIGCHLD, sa, NULL) != 0) {
+		fprintf(stderr, 
+		    "FATAL ERROR: signal handling could not be initialized\n");
+		exit (EXIT_FAILURE);
+	}
+}
+
 /*
  * Variables init 
  */
-- 
cgit v1.2.3-70-g09d2