From 7ff22e9b3f906b6f775e199d6cde73d8ee18d1d5 Mon Sep 17 00:00:00 2001
From: Frederic Culot <calcurse@culot.org>
Date: Mon, 8 Dec 2008 19:17:06 +0000
Subject: color configuration menu adapted to handle user-defined key bindings

---
 src/custom.c | 64 ++++++++++++++++++++++++++++++++++++------------------------
 src/day.c    | 14 ++++++-------
 src/io.c     |  7 +++----
 src/keys.c   | 45 +++++++++++++++++++++++++++++++++---------
 src/keys.h   |  7 +++++--
 src/recur.c  |  4 ++--
 src/todo.c   |  4 ++--
 src/utils.c  |  6 ++----
 8 files changed, 96 insertions(+), 55 deletions(-)

(limited to 'src')

diff --git a/src/custom.c b/src/custom.c
index 1c3217e..6263008 100755
--- a/src/custom.c
+++ b/src/custom.c
@@ -1,4 +1,4 @@
-/*	$calcurse: custom.c,v 1.28 2008/12/07 09:20:38 culot Exp $	*/
+/*	$calcurse: custom.c,v 1.29 2008/12/08 19:17:07 culot Exp $	*/
 
 /*
  * Calcurse - text-based organizer
@@ -432,6 +432,26 @@ custom_confwin_init (window_t *confwin, char *label)
     }
 }
 
+static void
+custom_color_config_bar (void)
+{
+  binding_t quit    = {_("Exit"),     KEY_GENERIC_QUIT};
+  binding_t select  = {_("Select"),   KEY_GENERIC_SELECT};
+  binding_t nocolor = {_("No color"), KEY_GENERIC_CANCEL};
+  binding_t up      = {_("Up"),       KEY_MOVE_UP};
+  binding_t down    = {_("Down"),     KEY_MOVE_DOWN};
+  binding_t left    = {_("Left"),     KEY_MOVE_LEFT};
+  binding_t right   = {_("Right"),    KEY_MOVE_RIGHT};
+
+  
+  binding_t *binding[] = {
+    &quit, &nocolor, &up, &down, &left, &right, &select
+  };
+  int binding_size = sizeof (binding) / sizeof (binding[0]);
+
+  keys_display_bindings_bar (win[STA].p, binding, 0, binding_size);
+}
+
 /* 
  * Used to display available colors in color configuration menu.
  * This is useful for window resizing.
@@ -444,7 +464,6 @@ display_color_config (window_t *cwin, int *mark_fore, int *mark_back,
 #define DEFAULTCOLOR		255
 #define DEFAULTCOLOR_EXT	-1
 #define CURSOR			(32 | A_REVERSE)
-#define SPACE			32
 #define MARK			88
 
   char *fore_txt = _("Foreground");
@@ -452,9 +471,6 @@ display_color_config (window_t *cwin, int *mark_fore, int *mark_back,
   char *default_txt = _("(terminal's default)");
   char *bar = "          ";
   char *box = "[ ]";
-  char *choose_color_1 = _("Use 'X' or SPACE to select a color, "
-			   "'H/L' 'J/K' or arrow keys to move");
-  char *choose_color_2 = _("('0' for no color, 'Q' to exit) :");
   char label[BUFSIZ];
   const unsigned Y = 3;
   const unsigned XOFST = 5;
@@ -559,7 +575,7 @@ display_color_config (window_t *cwin, int *mark_fore, int *mark_back,
     }
 
   mvwaddch (cwin->p, pos[cursor][YPOS], pos[cursor][XPOS] + 1, CURSOR);
-  status_mesg (choose_color_1, choose_color_2);
+  custom_color_config_bar ();
   wnoutrefresh (win[STA].p);
   wnoutrefresh (cwin->p);
   doupdate ();
@@ -585,7 +601,7 @@ custom_color_config (void)
   display_color_config (&conf_win, &mark_fore, &mark_back, cursor,
 			need_reset, theme_changed);
 
-  while ((ch = wgetch (win[STA].p)) != 'q')
+  while ((ch = keys_getch (win[STA].p)) != KEY_GENERIC_QUIT)
     {
       need_reset = 0;
       theme_changed = 0;
@@ -599,9 +615,7 @@ custom_color_config (void)
 	  need_reset = 1;
 	  break;
 
-	case SPACE:
-	case 'X':
-	case 'x':
+	case KEY_GENERIC_SELECT:
 	  colorize = true;
 	  need_reset = 1;
 	  theme_changed = 1;
@@ -611,35 +625,27 @@ custom_color_config (void)
 	    mark_fore = cursor;
 	  break;
 
-	case KEY_DOWN:
-	case 'J':
-	case 'j':
+	case KEY_MOVE_DOWN:
 	  if (cursor < SIZE - 1)
 	    ++cursor;
 	  break;
 
-	case KEY_UP:
-	case 'K':
-	case 'k':
+	case KEY_MOVE_UP:
 	  if (cursor > 0)
 	    --cursor;
 	  break;
 
-	case KEY_LEFT:
-	case 'H':
-	case 'h':
+	case KEY_MOVE_LEFT:
 	  if (cursor > NBUSERCOLORS)
 	    cursor -= (NBUSERCOLORS + 1);
 	  break;
 
-	case KEY_RIGHT:
-	case 'L':
-	case 'l':
+	case KEY_MOVE_RIGHT:
 	  if (cursor <= NBUSERCOLORS)
 	    cursor += (NBUSERCOLORS + 1);
 	  break;
 
-	case '0':
+	case KEY_GENERIC_CANCEL:
 	  colorize = false;
 	  need_reset = 1;
 	  break;
@@ -1073,7 +1079,9 @@ custom_keys_config (void)
               delwin (grabwin);              
             }
           while (used);
-          selelm++;
+          nbrowelm++;          
+          if (selelm < nbrowelm - 1)
+            selelm++;
 #undef WINROW
 #undef WINCOL
           break;
@@ -1081,10 +1089,16 @@ custom_keys_config (void)
           keystr = keys_action_nkey (selrow, selelm);
           keyval = keys_str2int (keystr);
           keys_remove_binding (keyval, selrow);
-          if (selelm > 0)
+          nbrowelm--;
+          if (selelm > 0 && selelm <= nbrowelm)
             selelm--;
           break;
         case KEY_GENERIC_QUIT:
+          if (keys_check_missing_bindings () != 0)
+            {
+              ERROR_MSG (_("Some actions do not have any associated "
+                           "key bindings!"));              
+            }
           wins_scrollwin_delete (&kwin);
           return;
 	}
diff --git a/src/day.c b/src/day.c
index 640f69f..4b0e067 100755
--- a/src/day.c
+++ b/src/day.c
@@ -1,4 +1,4 @@
-/*	$calcurse: day.c,v 1.39 2008/12/07 09:20:38 culot Exp $	*/
+/*	$calcurse: day.c,v 1.40 2008/12/08 19:17:07 culot Exp $	*/
 
 /*
  * Calcurse - text-based organizer
@@ -736,7 +736,7 @@ day_edit_item (conf_t *conf)
     case RECUR_EVNT:
       re = recur_get_event (date, day_item_nb (date, item_num, RECUR_EVNT));
       status_mesg (_("Edit: (1)Description or (2)Repetition?"), "[1/2] ");
-      while (ch != '1' && ch != '2' && ch != KEY_GENERIC_ESCAPE)
+      while (ch != '1' && ch != '2' && ch != KEY_GENERIC_CANCEL)
 	ch = wgetch (win[STA].p);
       switch (ch)
 	{
@@ -759,7 +759,7 @@ day_edit_item (conf_t *conf)
       status_mesg (_("Edit: (1)Start time, (2)End time, "
 		     "(3)Description or (4)Repetition?"), "[1/2/3/4] ");
       while (ch != STRT && ch != END && ch != DESC &&
-	     ch != REPT && ch != KEY_GENERIC_ESCAPE)
+	     ch != REPT && ch != KEY_GENERIC_CANCEL)
 	ch = wgetch (win[STA].p);
       switch (ch)
 	{
@@ -775,7 +775,7 @@ day_edit_item (conf_t *conf)
 	case REPT:
 	  update_rept (&ra->rpt, ra->start, conf);
 	  break;
-	case KEY_GENERIC_ESCAPE:
+	case KEY_GENERIC_CANCEL:
 	  return;
 	}
       break;
@@ -783,7 +783,7 @@ day_edit_item (conf_t *conf)
       a = apoint_get (date, day_item_nb (date, item_num, APPT));
       status_mesg (_("Edit: (1)Start time, (2)End time "
 		     "or (3)Description?"), "[1/2/3] ");
-      while (ch != STRT && ch != END && ch != DESC && ch != KEY_GENERIC_ESCAPE)
+      while (ch != STRT && ch != END && ch != DESC && ch != KEY_GENERIC_CANCEL)
 	ch = wgetch (win[STA].p);
       switch (ch)
 	{
@@ -796,7 +796,7 @@ day_edit_item (conf_t *conf)
 	case DESC:
 	  update_desc (&a->mesg);
 	  break;
-	case KEY_GENERIC_ESCAPE:
+	case KEY_GENERIC_CANCEL:
 	  return;
 	}
       break;
@@ -852,7 +852,7 @@ day_erase_item (long date, int item_number, erase_flag_e flag)
     {
       if (flag == ERASE_FORCE_ONLY_NOTE)
 	ch = 'a';
-      while ((ch != 'a') && (ch != 'o') && (ch != KEY_GENERIC_ESCAPE))
+      while ((ch != 'a') && (ch != 'o') && (ch != KEY_GENERIC_CANCEL))
 	{
 	  status_mesg (erase_warning, erase_choice);
 	  ch = wgetch (win[STA].p);
diff --git a/src/io.c b/src/io.c
index cc56b97..de3950b 100755
--- a/src/io.c
+++ b/src/io.c
@@ -1,4 +1,4 @@
-/*	$calcurse: io.c,v 1.45 2008/12/07 09:20:38 culot Exp $	*/
+/*	$calcurse: io.c,v 1.46 2008/12/08 19:17:07 culot Exp $	*/
 
 /*
  * Calcurse - text-based organizer
@@ -1707,7 +1707,6 @@ ical_unformat_line (char *line)
 static char *
 ical_unfold_content (FILE *fd, char *line, unsigned *lineno)
 {
-  const int CHAR_SPACE = 32;
   char *content;
   int c;
 
@@ -1718,7 +1717,7 @@ ical_unfold_content (FILE *fd, char *line, unsigned *lineno)
   for (;;)
     {
       c = getc (fd);
-      if (c == CHAR_SPACE || c == TAB)
+      if (c == SPACE || c == TAB)
         {
           char buf[BUFSIZ];
           
@@ -2703,7 +2702,7 @@ void
 io_log_print (io_file_t *log, int line, char *msg)
 {
   if (log && log->fd)
-    fprintf (log->fd, "[%d]: %s\n", line, msg);
+    fprintf (log->fd, "line %d: %s\n", line, msg);
 }
 
 void
diff --git a/src/keys.c b/src/keys.c
index c3fbde4..9b5a661 100755
--- a/src/keys.c
+++ b/src/keys.c
@@ -1,4 +1,4 @@
-/*	$calcurse: keys.c,v 1.7 2008/12/07 09:20:38 culot Exp $	*/
+/*	$calcurse: keys.c,v 1.8 2008/12/08 19:17:07 culot Exp $	*/
 
 /*
  * Calcurse - text-based organizer
@@ -50,6 +50,7 @@ static keys_e actions[MAXKEYVAL];
 
 static struct keydef_s keydef[NBKEYS] = {
   {"generic-escape", "ESC"},
+  {"generic-select", "SPC"},
   {"generic-credits", "@"},
   {"generic-help", "?"},
   {"generic-quit", "q Q"},
@@ -105,9 +106,10 @@ dump_intro (FILE *fd)
       "#\n"
       "# To define bindings which use the CONTROL key, prefix the key with "
       "'C-'.\n"
-      "# The escape and horizontal Tab key can be specified using the 'ESC'\n"
-      "# and 'TAB' keyword, respectively. Arrow keys can also be specified\n"
-      "# with the UP, DWN, LFT, RGT keywords.\n#\n"
+      "# The escape, space bar and horizontal Tab key can be specified using\n"
+      "# the 'ESC', 'SPC' and 'TAB' keyword, respectively.\n"
+      "# Arrow keys can also be specified with the UP, DWN, LFT, RGT keywords."
+      "\n#\n"
       "# A description of what each ACTION keyword is used for is available\n"
       "# from calcurse online configuration menu.\n");
 
@@ -164,8 +166,13 @@ keys_getch (WINDOW *win)
   int ch;
   
   ch = wgetch (win);
-
-  return keys_get_action (ch);
+  switch (ch)
+    {
+    case KEY_RESIZE:
+      return KEY_RESIZE;
+    default:
+      return keys_get_action (ch);
+    }
 }
 
 static void
@@ -253,6 +260,7 @@ keys_str2int (char *key)
 {
   const string_t CONTROL_KEY = STRING_BUILD ("C-");
   const string_t TAB_KEY = STRING_BUILD ("TAB");
+  const string_t SPACE_KEY = STRING_BUILD ("SPC");  
   const string_t ESCAPE_KEY = STRING_BUILD ("ESC");
   const string_t CURSES_KEY_UP = STRING_BUILD ("UP");
   const string_t CURSES_KEY_DOWN = STRING_BUILD ("DWN");
@@ -273,6 +281,8 @@ keys_str2int (char *key)
         return TAB;
       else if (!strncmp (key, ESCAPE_KEY.str, ESCAPE_KEY.len))
         return ESCAPE;
+      else if (!strncmp (key, SPACE_KEY.str, SPACE_KEY.len))
+        return SPACE;
       else if (!strncmp (key, CURSES_KEY_UP.str, CURSES_KEY_UP.len))
         return KEY_UP;
       else if (!strncmp (key, CURSES_KEY_DOWN.str, CURSES_KEY_DOWN.len))
@@ -293,6 +303,8 @@ keys_int2str (int key)
     {
     case TAB:
       return "TAB";
+    case SPACE:
+      return "SPC";
     case ESCAPE:
       return "ESC";
     case KEY_UP:
@@ -348,7 +360,7 @@ keys_action_allkeys (keys_e action)
 {
   static char keystr[BUFSIZ];
   struct key_str_s *i;
-  const char *SPACE = " ";
+  const char *CHAR_SPACE = " ";
   
   if (keys[action] == NULL)
     return NULL;
@@ -357,7 +369,7 @@ keys_action_allkeys (keys_e action)
     {
       const int MAXLEN = sizeof (keystr) - 1 - strlen (keystr);
       strncat (keystr, i->str, MAXLEN - 1);
-      strncat (keystr, SPACE, 1);
+      strncat (keystr, CHAR_SPACE, 1);
     }
 
   return keystr;
@@ -442,8 +454,10 @@ keys_popup_info (keys_e key)
   char *info[NBKEYS];
   WINDOW *infowin;
   
-  info[KEY_GENERIC_ESCAPE] =
+  info[KEY_GENERIC_CANCEL] =
     _("Cancel the ongoing action.");
+  info[KEY_GENERIC_SELECT] =
+    _("Select the highlighted item.");
   info[KEY_GENERIC_CREDITS] =
     _("Print general information about calcurse's authors, license, etc.");
   info[KEY_GENERIC_HELP] =
@@ -545,3 +559,16 @@ keys_save_bindings (FILE *fd)
   for (i = 0; i < NBKEYS; i++)
     fprintf (fd, "%s  %s\n", keydef[i].label, keys_action_allkeys (i));
 }
+
+int
+keys_check_missing_bindings (void)
+{
+  int i;
+    
+  for (i = 0; i < NBKEYS; i++)
+    {
+      if (keys[i] == 0)
+        return 1;
+    }
+  return 0;
+}
diff --git a/src/keys.h b/src/keys.h
index 6f55cbb..1ed24a4 100755
--- a/src/keys.h
+++ b/src/keys.h
@@ -1,4 +1,4 @@
-/*	$calcurse: keys.h,v 1.5 2008/11/25 20:48:58 culot Exp $	*/
+/*	$calcurse: keys.h,v 1.6 2008/12/08 19:17:07 culot Exp $	*/
 
 /*
  * Calcurse - text-based organizer
@@ -31,6 +31,7 @@
 #define CTRL(x)                 ((x) & CTRLVAL)
 #define ESCAPE		        27
 #define TAB       		9
+#define SPACE                   32
 
 #define KEYS_KEYLEN		3 /* length of each keybinding */  
 #define KEYS_LABELEN		8 /* length of command description */
@@ -38,7 +39,8 @@
 
 typedef enum
   {
-    KEY_GENERIC_ESCAPE,
+    KEY_GENERIC_CANCEL,
+    KEY_GENERIC_SELECT,
     KEY_GENERIC_CREDITS,
     KEY_GENERIC_HELP,
     KEY_GENERIC_QUIT,
@@ -103,5 +105,6 @@ 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 *);
+int     keys_check_missing_bindings (void);
 
 #endif /* CALCURSE_KEYS_H */
diff --git a/src/recur.c b/src/recur.c
index f6c46e8..56adf1e 100755
--- a/src/recur.c
+++ b/src/recur.c
@@ -1,4 +1,4 @@
-/*	$calcurse: recur.c,v 1.40 2008/12/07 09:20:38 culot Exp $	*/
+/*	$calcurse: recur.c,v 1.41 2008/12/08 19:17:07 culot Exp $	*/
 
 /*
  * Calcurse - text-based organizer
@@ -694,7 +694,7 @@ recur_repeat_item (conf_t *conf)
     }
 
   while ((ch != 'D') && (ch != 'W') && (ch != 'M')
-	 && (ch != 'Y') && (ch != KEY_GENERIC_ESCAPE))
+	 && (ch != 'Y') && (ch != KEY_GENERIC_CANCEL))
     {
       status_mesg (mesg_type_1, mesg_type_2);
       ch = wgetch (win[STA].p);
diff --git a/src/todo.c b/src/todo.c
index 6f17729..6da9c42 100755
--- a/src/todo.c
+++ b/src/todo.c
@@ -1,4 +1,4 @@
-/*	$calcurse: todo.c,v 1.25 2008/12/07 09:20:38 culot Exp $	*/
+/*	$calcurse: todo.c,v 1.26 2008/12/08 19:17:07 culot Exp $	*/
 
 /*
  * Calcurse - text-based organizer
@@ -274,7 +274,7 @@ todo_delete (conf_t *conf)
   if (has_note == 0)
     answer = 't';
 
-  while (answer != 't' && answer != 'n' && answer != KEY_GENERIC_ESCAPE)
+  while (answer != 't' && answer != 'n' && answer != KEY_GENERIC_CANCEL)
     {
       status_mesg (erase_warning, erase_choice);
       answer = wgetch (win[STA].p);
diff --git a/src/utils.c b/src/utils.c
index 31a4bf4..b04f023 100755
--- a/src/utils.c
+++ b/src/utils.c
@@ -1,4 +1,4 @@
-/*	$calcurse: utils.c,v 1.55 2008/12/07 09:20:38 culot Exp $	*/
+/*	$calcurse: utils.c,v 1.56 2008/12/08 19:17:07 culot Exp $	*/
 
 /*
  * Calcurse - text-based organizer
@@ -226,9 +226,7 @@ showcursor (WINDOW *win, int y, int pos, char *str, int l, int offset)
 
   nc = str + pos;
   wmove (win, y, pos - offset);
-#define SPACE 32
   (pos >= l) ? waddch (win, SPACE | A_REVERSE) : waddch (win, *nc | A_REVERSE);
-#undef SPACE
 }
 
 /* Print the string at the desired position. */
@@ -368,7 +366,7 @@ getstring (WINDOW *win, char *str, int l, int x, int y)
 	    newpos++;
 	  break;
 
-	case KEY_GENERIC_ESCAPE:	/* cancel editing */
+	case KEY_GENERIC_CANCEL:	/* cancel editing */
 	  return (GETSTRING_ESC);
 	  break;
 
-- 
cgit v1.2.3-70-g09d2