From 2c57964553b89df91f57a2b3cfaeda3742612df9 Mon Sep 17 00:00:00 2001
From: Frederic Culot <calcurse@culot.org>
Date: Fri, 15 Sep 2006 15:40:20 +0000
Subject: init_notify_bar(), config_notify_bar() and print_notify_options()
 created load_conf() updated to load notify-bar user settings several updates
 to take notify-bar settings into account

---
 src/calcurse.c | 189 ++++++++++++++++++++++++++++++++++++++++++++++++++++++---
 1 file changed, 179 insertions(+), 10 deletions(-)

(limited to 'src')

diff --git a/src/calcurse.c b/src/calcurse.c
index 4b2401f..3085194 100755
--- a/src/calcurse.c
+++ b/src/calcurse.c
@@ -1,4 +1,4 @@
-/*	$calcurse: calcurse.c,v 1.17 2006/09/14 14:52:37 culot Exp $	*/
+/*	$calcurse: calcurse.c,v 1.18 2006/09/15 15:40:20 culot Exp $	*/
 
 /*
  * Calcurse - text-based organizer
@@ -29,6 +29,7 @@
 #endif /* HAVE_CONFIG_H */
 
 #include <ncurses.h>	
+#include <pthread.h>
 #include <time.h>
 #include <string.h>
 #include <stdlib.h>
@@ -97,6 +98,7 @@ enum window_number {CALENDAR, APPOINTMENT, TODO};
 /* External functions */
 void get_date(void);
 void init_vars(int colr);
+void init_notify_bar(void);
 void init_wins(void), reinit_wins(void);
 void add_item(void);
 void load_conf(void);
@@ -106,8 +108,8 @@ void update_app_panel(int yeat, int month, int day);
 void store_day(int year, int month, int day, bool day_changed);
 void get_screen_config(void);
 void update_windows(int surrounded_window);
-void general_config(void);
-void print_general_options(WINDOW *win);
+void general_config(void), config_notify_bar(void);
+void print_general_options(WINDOW *win), print_notify_options(WINDOW *win);
 void print_option_incolor(WINDOW *win, bool option, int pos_x, int pos_y);
 void del_item(void);
 
@@ -153,6 +155,7 @@ int main(int argc, char **argv)
 	noecho();		/* controls echoing of typed chars */
 	curs_set(0);		/* make cursor invisible */
         get_date();
+	init_notify_bar();
 	get_screen_config();
 	
         /* Check if terminal supports color. */
@@ -191,7 +194,7 @@ int main(int argc, char **argv)
 	custom_init_attr(colr);
 	nb_tod = load_todo(colr);	
 	load_app();
-	notify_check_next_app();
+	if (notify_bar()) notify_start_main_thread();
 	get_screen_config();
         reinit_wins();
         startup_screen(skip_system_dialogs, no_data_file, colr);
@@ -304,6 +307,10 @@ int main(int argc, char **argv)
 				case 'g':
 					general_config();
 					break;
+				case 'N':
+				case 'n':
+					config_notify_bar();
+					break;
 				}
                                 reinit_wins();
 				erase_window_part(swin, 0, 0, nc_bar, nl_bar);
@@ -551,6 +558,22 @@ void init_vars(int colr)
 	custom_init_attr(colr);
 }
 
+/* Notify-bar init */
+void init_notify_bar(void)
+{
+	char *time_format = "%T";
+	char *date_format = "%a %F";
+
+	nbar = (struct nbar_s *) malloc(sizeof(struct nbar_s));
+	nbar->datefmt = (char *) malloc(sizeof(char));
+	nbar->timefmt = (char *) malloc(sizeof(char));
+	pthread_mutex_init(&nbar->mutex, NULL);
+	nbar->show = 1;
+	nbar->cntdwn = 300; 
+	strncpy(nbar->datefmt, date_format, strlen(date_format) + 1); 
+	strncpy(nbar->timefmt, time_format, strlen(time_format) + 1);
+}
+
 /* 
  * Update all of the three windows and put a border around the
  * selected window.
@@ -580,7 +603,7 @@ void update_windows(int surrounded_window)
 			 sel_year, sel_day, day, month, year,
                          week_begins_on_monday);
 	status_bar(surrounded_window, colr, nc_bar, nl_bar);
-	notify_update_bar();
+	if (notify_bar()) notify_update_bar();
         wmove(swin, 0, 0);
 	doupdate();
 }
@@ -596,8 +619,12 @@ void get_screen_config(void)
 	/* fixed values for status, notification bars and calendar */
 	nl_bar = 2; nc_bar = col;
 	y_bar = row - nl_bar; x_bar = 0;
-	nl_not = 1; nc_not = col;
-	y_not = y_bar - 1; x_not = 0;
+	if (notify_bar()) {
+		nl_not = 1; nc_not = col;
+		y_not = y_bar - 1; x_not = 0;
+	} else {
+		nl_not = nc_not = y_not = x_not = 0;
+	}
 	nl_cal = 12;
 	nc_cal = 30;
 
@@ -707,7 +734,7 @@ void reinit_wins(void)
         delwin(twin);
         get_screen_config();
         init_wins();
-	notify_reinit_bar(nl_not, nc_not, y_not, x_not);
+	if (notify_bar()) notify_reinit_bar(nl_not, nc_not, y_not, x_not);
         update_windows(which_pan);
 }
 
@@ -717,10 +744,11 @@ void general_config(void)
 	WINDOW *conf_win;
 	char label[80];
 	char *number_str = _("Enter an option number to change its value [Q to quit] ");
-	int ch;
+	int ch, win_row;
 
 	clear();
-	conf_win = newwin(row - 2, col, 0, 0);
+	win_row = (notify_bar()) ? row - 3 : row - 2;
+	conf_win = newwin(win_row, col, 0, 0);
 	box(conf_win, 0, 0);
 	sprintf(label, _("CalCurse %s | general options"), VERSION);
 	win_show(conf_win, label);
@@ -755,6 +783,78 @@ void general_config(void)
 	delwin(conf_win);
 }
 
+/* Configuration for the notify-bar */
+void config_notify_bar(void)
+{
+	WINDOW *conf_win;
+	char label[80];
+	char buf[MAX_LENGTH];
+	char *number_str = _("Enter an option number to change its value [Q to quit] ");
+	char *date_str = 
+		_("Enter the date format (see 'man 3 strftime' for possible formats) ");
+	char *time_str = 
+		_("Enter the time format (see 'man 3 strftime' for possible formats) ");
+	char *count_str = 
+		_("Enter the number of seconds from which to warn before an appointment");
+	int ch = 0 , win_row, change_win = 1;
+
+	win_row = (notify_bar()) ? row - 3 : row - 2;
+	sprintf(label, _("CalCurse %s | notify-bar options"), VERSION);
+	while (ch != 'q') {
+		if (change_win) {
+			clear();
+			conf_win = newwin(win_row, col, 0, 0);
+			box(conf_win, 0, 0);
+			win_show(conf_win, label);
+		}
+		status_mesg(number_str, "");
+		print_notify_options(conf_win);
+		ch = wgetch(swin);
+
+		switch (ch) {
+		case '1':	
+			pthread_mutex_lock(&nbar->mutex);
+			nbar->show = !nbar->show;
+			pthread_mutex_unlock(&nbar->mutex);
+			notify_stop_main_thread();
+			if (notify_bar()) {
+				notify_start_main_thread();
+				win_row = row - 3;
+			} else {
+				win_row = row - 2;
+			}
+			delwin(conf_win);
+			change_win = 1;
+			break;
+		case '2':
+			status_mesg(date_str, "");
+			getstring(swin, colr, buf, 0, 1);
+			pthread_mutex_lock(&nbar->mutex);
+			strncpy(nbar->datefmt, buf, strlen(buf) + 1);
+			pthread_mutex_unlock(&nbar->mutex);
+			change_win = 0;
+			break;
+		case '3':
+			status_mesg(time_str, "");
+			getstring(swin, colr, buf, 0, 1);
+			pthread_mutex_lock(&nbar->mutex);
+			strncpy(nbar->timefmt, buf, strlen(buf) + 1);
+			pthread_mutex_unlock(&nbar->mutex);
+			change_win = 0;
+			break;
+                case '4':
+			status_mesg(count_str, "");
+			getstring(swin, colr, buf, 0, 1);
+			pthread_mutex_lock(&nbar->mutex);
+			nbar->cntdwn = atoi(buf);
+			pthread_mutex_unlock(&nbar->mutex);
+			change_win = 0;
+                        break;
+		}
+	}
+	delwin(conf_win);
+}
+
 /* prints the general options */
 void print_general_options(WINDOW *win)
 {
@@ -810,6 +910,52 @@ void print_general_options(WINDOW *win)
 	doupdate();
 }
 
+/* prints options related to the notify-bar */
+void print_notify_options(WINDOW *win)
+{
+	int x_pos, y_pos;
+	char *option1 = _("notify-bar_show = ");
+	char *option2 = _("notify-bar_date = ");
+	char *option3 = _("notify-bar_clock = ");
+        char *option4 = _("notify-bar_warning = ");
+
+	x_pos = 3;
+	y_pos = 4;
+
+	pthread_mutex_lock(&nbar->mutex);
+	mvwprintw(win, y_pos, x_pos, "[1] %s      ", option1);
+	print_option_incolor(win, nbar->show, y_pos,
+			     x_pos + 4 + strlen(option1));
+	mvwprintw(win, y_pos + 1, x_pos,
+		 _("(if set to YES, notify-bar will be displayed)"));
+
+	mvwprintw(win, y_pos + 3, x_pos, "[2] %s      ", option2);
+	custom_apply_attr(win, ATTR_HIGHEST);
+	mvwprintw(win, y_pos + 3, x_pos + 4 + strlen(option2), "%s", nbar->datefmt);
+	custom_remove_attr(win, ATTR_HIGHEST);
+	mvwprintw(win, y_pos + 4, x_pos,
+		 _("(Format of the date to be displayed inside notify-bar)"));
+
+	mvwprintw(win, y_pos + 6, x_pos, "[3] %s      ", option3);
+	custom_apply_attr(win, ATTR_HIGHEST);
+	mvwprintw(win, y_pos + 6, x_pos + 4 + strlen(option3), "%s", nbar->timefmt);
+	custom_remove_attr(win, ATTR_HIGHEST);
+	mvwprintw(win, y_pos + 7, x_pos,
+		 _("(Format of the time to be displayed inside notify-bar)"));
+        
+	mvwprintw(win, y_pos + 9, x_pos, "[4] %s      ", option4);
+	custom_apply_attr(win, ATTR_HIGHEST);
+	mvwprintw(win, y_pos + 9, x_pos + 4 + strlen(option4), "%d", nbar->cntdwn);
+	custom_remove_attr(win, ATTR_HIGHEST);
+	mvwprintw(win, y_pos + 10, x_pos,
+		 _("(Warn user if he has an appointment within next 'notify-bar_warning' seconds)"));
+
+	pthread_mutex_unlock(&nbar->mutex);
+	wmove(swin, 1, 0);
+	wnoutrefresh(win);
+	doupdate();
+}
+
 /* print the option value with appropriate color */
 void print_option_incolor(WINDOW *win, bool option, int pos_y, int pos_x)
 {
@@ -1145,6 +1291,7 @@ void load_conf(void)
 		wgetch(swin);
 	}
 	var = 0;
+	pthread_mutex_lock(&nbar->mutex);
 	for (;;) {
 		if (fgets(buf, 99, data_file) == NULL) {
 			break;
@@ -1181,6 +1328,19 @@ void load_conf(void)
 		} else if (var == 8) {
 			layout = atoi(e_conf);
 			var = 0;
+		} else if (var == 9) {
+			nbar->show = 
+				fill_config_var(e_conf);
+			var = 0;
+		} else if (var == 10) {
+			strncpy(nbar->datefmt, e_conf, strlen(e_conf) + 1);
+			var = 0;
+		} else if (var == 11) {
+			strncpy(nbar->timefmt, e_conf, strlen(e_conf) + 1);
+			var = 0;
+		} else if (var == 12) {
+			nbar->cntdwn = atoi(e_conf);
+			var = 0;
 		}
 		if (strncmp(e_conf, "auto_save=", 10) == 0)
 			var = 1;
@@ -1198,8 +1358,17 @@ void load_conf(void)
 			var = 7;
 		else if (strncmp(e_conf, "layout=", 7) == 0)
 			var = 8;
+		else if (strncmp(e_conf, "notify-bar_show=", 16) ==0)
+			var = 9;
+		else if (strncmp(e_conf, "notify-bar_date=", 16) ==0)
+			var = 10;
+		else if (strncmp(e_conf, "notify-bar_clock=", 17) ==0)
+			var = 11;
+		else if (strncmp(e_conf, "notify-bar_warning=", 19) ==0)
+			var = 12;
 	}
 	fclose(data_file);
+	pthread_mutex_unlock(&nbar->mutex);
 	erase_window_part(swin, 0, 0, nc_bar, nl_bar);
 }
 
-- 
cgit v1.2.3-70-g09d2