From 910901a4f0abe565e5c1d12a480784e90a4bcd6c Mon Sep 17 00:00:00 2001
From: Frederic Culot <calcurse@culot.org>
Date: Tue, 25 Nov 2008 20:48:58 +0000
Subject: User-defined keys are now saved to file.

---
 src/custom.c |  7 ++----
 src/io.c     | 76 ++++++++++++++++++++++++++++++++++++++++++++----------------
 src/keys.c   | 15 +++++++++++-
 src/keys.h   |  3 ++-
 4 files changed, 74 insertions(+), 27 deletions(-)

(limited to 'src')

diff --git a/src/custom.c b/src/custom.c
index d532ebb..a1defe5 100755
--- a/src/custom.c
+++ b/src/custom.c
@@ -1,4 +1,4 @@
-/*	$calcurse: custom.c,v 1.26 2008/11/23 20:38:56 culot Exp $	*/
+/*	$calcurse: custom.c,v 1.27 2008/11/25 20:48:58 culot Exp $	*/
 
 /*
  * Calcurse - text-based organizer
@@ -964,14 +964,13 @@ custom_keys_config_bar (void)
   binding_t info  = {_("Key info"), KEY_GENERIC_HELP};
   binding_t add   = {_("Add key"),  KEY_ADD_ITEM};
   binding_t del   = {_("Del key"),  KEY_DEL_ITEM};
-  binding_t edit  = {_("Edit key"), KEY_EDIT_ITEM};
   binding_t up    = {_("Up"),       KEY_MOVE_UP};
   binding_t down  = {_("Down"),     KEY_MOVE_DOWN};
   binding_t left  = {_("Prev Key"), KEY_MOVE_LEFT};
   binding_t right = {_("Next Key"), KEY_MOVE_RIGHT};
     
   binding_t *binding[] = {
-    &quit, &info, &add, &del, &edit, &up, &down, &left, &right
+    &quit, &info, &add, &del, &up, &down, &left, &right
   };
   int binding_size = sizeof (binding) / sizeof (binding[0]);
 
@@ -1085,8 +1084,6 @@ custom_keys_config (void)
           if (selelm > 0)
             selelm--;
           break;
-        case KEY_EDIT_ITEM:
-          break;
         case KEY_GENERIC_QUIT:
           wins_scrollwin_delete (&kwin);
           return;
diff --git a/src/io.c b/src/io.c
index cdfa819..84787c9 100755
--- a/src/io.c
+++ b/src/io.c
@@ -1,4 +1,4 @@
-/*	$calcurse: io.c,v 1.42 2008/11/16 17:42:53 culot Exp $	*/
+/*	$calcurse: io.c,v 1.43 2008/11/25 20:48:58 culot Exp $	*/
 
 /*
  * Calcurse - text-based organizer
@@ -47,13 +47,25 @@
 #define ICALDATEFMT      "%Y%m%d"
 #define ICALDATETIMEFMT  "%Y%m%dT%H%M%S"
 
-typedef enum
-{
+typedef enum {
   PROGRESS_BAR_SAVE,
   PROGRESS_BAR_LOAD,
   PROGRESS_BAR_EXPORT
 } progress_bar_t;
 
+enum {
+  PROGRESS_BAR_CONF,
+  PROGRESS_BAR_TODO,
+  PROGRESS_BAR_APTS,
+  PROGRESS_BAR_KEYS
+};
+
+enum {
+  PROGRESS_BAR_EXPORT_EVENTS,
+  PROGRESS_BAR_EXPORT_APOINTS,
+  PROGRESS_BAR_EXPORT_TODO
+};
+
 typedef enum {
   ICAL_VEVENT,
   ICAL_VTODO,
@@ -123,50 +135,59 @@ static void
 progress_bar (progress_bar_t type, int progress)
 {
 #define SLEEPTIME	125000
-#define STEPS		3
-#define LABELENGTH	15
-
-  int i, step;
+#define NBFILES		4
+#define NBEXPORTED      3
+#define LABELENGTH      15
+  int i, step, steps;
   char *mesg_sav = _("Saving...");
   char *mesg_load = _("Loading...");
   char *mesg_export = _("Exporting...");
+  char *error_msg = _("Internal error while displaying progress bar");
   char *barchar = "|";
-  char file[STEPS][LABELENGTH] = {
+  char *file[NBFILES] = {
     "[    conf    ]",
     "[    todo    ]",
-    "[    apts    ]"
+    "[    apts    ]",
+    "[    keys    ]"
   };
-  char data[STEPS][LABELENGTH] = {
+  char *data[NBEXPORTED] = {
     "[   events   ]",
     "[appointments]",
     "[    todo    ]"
   };
-  int ipos = LABELENGTH + 2;
-  int epos[STEPS];
+  int ipos =  LABELENGTH + 2;
+  int epos[NBFILES];
 
   /* progress bar length init. */
   ipos = LABELENGTH + 2;
-  step = floor (col / (STEPS + 1));
-  for (i = 0; i < STEPS - 1; i++)
+  steps = (type == PROGRESS_BAR_EXPORT) ? NBEXPORTED : NBFILES;
+  step = floor (col / (steps + 1));
+  for (i = 0; i < steps - 1; i++)
     epos[i] = (i + 2) * step;
-  epos[STEPS - 1] = col - 2;
+  epos[steps - 1] = col - 2;
 
   switch (type)
     {
     case PROGRESS_BAR_SAVE:
+      EXIT_IF (progress < 0 || progress > PROGRESS_BAR_KEYS,
+               error_msg);
       status_mesg (mesg_sav, file[progress]);
       break;
     case PROGRESS_BAR_LOAD:
+      EXIT_IF (progress < 0 || progress > PROGRESS_BAR_KEYS,
+               error_msg);
       status_mesg (mesg_load, file[progress]);
       break;
     case PROGRESS_BAR_EXPORT:
+      EXIT_IF (progress < 0 || progress > PROGRESS_BAR_TODO,
+               error_msg);
       status_mesg (mesg_export, data[progress]);
       break;
     }
 
   /* Draw the progress bar. */
   mvwprintw (win[STA].p, 1, ipos, barchar);
-  mvwprintw (win[STA].p, 1, epos[STEPS - 1], barchar);
+  mvwprintw (win[STA].p, 1, epos[steps - 1], barchar);
   custom_apply_attr (win[STA].p, ATTR_HIGHEST);
   for (i = ipos + 1; i < epos[progress]; i++)
     mvwaddch (win[STA].p, 1, i, ' ' | A_REVERSE);
@@ -174,6 +195,10 @@ progress_bar (progress_bar_t type, int progress)
   wmove (win[STA].p, 0, 0);
   wrefresh (win[STA].p);
   usleep (SLEEPTIME);
+#undef SLEEPTIME
+#undef NBFILES
+#undef NBEXPORTED
+#undef LABELENGTH
 }
 
 /* Ask user for a file name to export data to. */
@@ -753,9 +778,8 @@ io_save_cal (io_mode_t mode, conf_t *conf)
     show_bar = true;
 
   /* Save the user configuration. */
-
   if (show_bar)
-    progress_bar (PROGRESS_BAR_SAVE, 0);
+    progress_bar (PROGRESS_BAR_SAVE, PROGRESS_BAR_CONF);
   data_file = fopen (path_conf, "w");
   if (data_file == NULL)
     ERROR_MSG (access_pb);
@@ -860,7 +884,7 @@ io_save_cal (io_mode_t mode, conf_t *conf)
 
   /* Save the todo data file. */
   if (show_bar)
-    progress_bar (PROGRESS_BAR_SAVE, 1);
+    progress_bar (PROGRESS_BAR_SAVE, PROGRESS_BAR_TODO);
   data_file = fopen (path_todo, "w");
   if (data_file == NULL)
     ERROR_MSG (access_pb);
@@ -882,7 +906,7 @@ io_save_cal (io_mode_t mode, conf_t *conf)
    * Recursive items are written first.
    */
   if (show_bar)
-    progress_bar (PROGRESS_BAR_SAVE, 2);
+    progress_bar (PROGRESS_BAR_SAVE, PROGRESS_BAR_APTS);
   data_file = fopen (path_apts, "w");
   if (data_file == NULL)
     ERROR_MSG (access_pb);
@@ -902,6 +926,18 @@ io_save_cal (io_mode_t mode, conf_t *conf)
       fclose (data_file);
     }
 
+  /* Save user-defined keys */
+  if (show_bar)
+    progress_bar (PROGRESS_BAR_SAVE, PROGRESS_BAR_KEYS);
+  data_file = fopen (path_keys, "w");
+  if (data_file == NULL)
+    ERROR_MSG (access_pb);
+  else
+    {
+      keys_save_bindings (data_file);
+      fclose (data_file);
+    }
+  
   /* Print a message telling data were saved */
   if (mode == IO_MODE_INTERACTIVE && !conf->skip_system_dialogs)
     {
diff --git a/src/keys.c b/src/keys.c
index bef1e9d..1c475b3 100755
--- a/src/keys.c
+++ b/src/keys.c
@@ -1,4 +1,4 @@
-/*	$calcurse: keys.c,v 1.4 2008/11/23 20:38:56 culot Exp $	*/
+/*	$calcurse: keys.c,v 1.5 2008/11/25 20:48:58 culot Exp $	*/
 
 /*
  * Calcurse - text-based organizer
@@ -512,3 +512,16 @@ keys_popup_info (keys_e key)
 #undef WINROW
 #undef WINCOL
 }
+
+void
+keys_save_bindings (FILE *fd)
+{
+  int i;
+  
+  EXIT_IF (fd == NULL, _("FATAL ERROR in keys_save_bindings: "
+                         "null file pointer."));
+  dump_intro (fd);
+  for (i = 0; i < NBKEYS; i++)
+    fprintf (fd, "%s  %s\n", keydef[i].label, keys_action_allkeys (i));
+  fclose (fd);
+}
diff --git a/src/keys.h b/src/keys.h
index 4928def..6f55cbb 100755
--- a/src/keys.h
+++ b/src/keys.h
@@ -1,4 +1,4 @@
-/*	$calcurse: keys.h,v 1.4 2008/11/23 20:38:56 culot Exp $	*/
+/*	$calcurse: keys.h,v 1.5 2008/11/25 20:48:58 culot Exp $	*/
 
 /*
  * Calcurse - text-based organizer
@@ -102,5 +102,6 @@ char   *keys_action_nkey (keys_e, int);
 char   *keys_action_allkeys (keys_e);
 void    keys_display_bindings_bar (WINDOW *, binding_t **, int, int);
 void    keys_popup_info (keys_e);
+void    keys_save_bindings (FILE *);
 
 #endif /* CALCURSE_KEYS_H */
-- 
cgit v1.2.3-70-g09d2