diff --git a/src/readline.c b/src/readline.c
index 2bfa463b..9ca7a7e7 100644
--- a/src/readline.c
+++ b/src/readline.c
@@ -21,11 +21,10 @@
You should have received a copy of the GNU General Public License
along with Grafx2; if not, see
*/
-/************************************************************************
-* *
-* READLINE (procédure permettant de saisir une chaîne de caractères) *
-* *
-************************************************************************/
+/**
+ * @file readline.c
+ * Text input GUI widget
+ */
#include
#include
@@ -89,14 +88,14 @@ extern char * X11_clipboard;
#define CURSOR_COLOR MC_Black
#define CURSOR_BACKGROUND_COLOR MC_Dark
-// remove a character from a string
+//! remove a character from a string
static void Remove_character(char * str, int position)
{
for (;str[position]!='\0';position++)
str[position]=str[position+1];
}
-// remove a character from a string
+//! remove a character from a unicode string
static void Remove_character_unicode(word * str, int position)
{
for (;str[position]!='\0';position++)
@@ -104,8 +103,8 @@ static void Remove_character_unicode(word * str, int position)
}
+//! Insert a character in string at position
static void Insert_character(char * str, char letter, int position)
-// Insert a character in str at position
{
char temp_char;
@@ -122,6 +121,7 @@ static void Insert_character(char * str, char letter, int position)
str[position]='\0';
}
+//! Insert a character in unicode string at position
static void Insert_character_unicode(word * str, word c, int position)
{
for (;;)
@@ -134,9 +134,9 @@ static void Insert_character_unicode(word * str, word c, int position)
}
}
+//! Insert a string at the start of another. Up to MAX characters only.
+//! @return actual number of chars inserted
static int Prepend_string(char* dest, const char* src, int max)
-// Insert a string at the start of another. Up to MAX characters only
-// Returns actual number of chars inserted
{
// Insert src before dest
int sized = strlen(dest);
@@ -152,9 +152,9 @@ static int Prepend_string(char* dest, const char* src, int max)
return sizes;
}
+//! Insert a unicode string at the start of another. Up to MAX characters only.
+//! @return actual number of chars inserted
static int Prepend_string_unicode(word* dest, const word* src, int max)
-// Insert a string at the start of another. Up to MAX characters only
-// Returns actual number of chars inserted
{
// Insert src before dest
int sized = Unicode_strlen(dest);
@@ -170,10 +170,11 @@ static int Prepend_string_unicode(word* dest, const word* src, int max)
return sizes;
}
-static int Valid_character(word c, int input_type)
- // returns 0 = Not allowed
- // returns 1 = Allowed
- // returns 2 = Allowed only once at start of string (for - sign in numbers)
+//! Check validy of character depending on input_type
+//! @returns 0 = Not allowed
+//! @returns 1 = Allowed
+//! @returns 2 = Allowed only once at start of string (for - sign in numbers)
+static int Valid_character(word c, enum INPUT_TYPE input_type)
{
// On va regarder si l'utilisateur le droit de se servir de cette touche
switch(input_type)
@@ -230,6 +231,7 @@ static int Valid_character(word c, int input_type)
return 0;
}
+//! remove invalid characters
static void Cleanup_string(char* str, int input_type)
{
int i,j=0;
@@ -245,6 +247,7 @@ static void Cleanup_string(char* str, int input_type)
str[j] = '\0';
}
+//! remove invalid characters
static void Cleanup_string_unicode(word* str, int input_type)
{
int i,j=0;
@@ -260,6 +263,10 @@ static void Cleanup_string_unicode(word* str, int input_type)
str[j] = 0;
}
+//! Prints the string and the cursor on screen
+//! @param x_pos, y_pos position on screen
+//! @param str the string to display
+//! @param position the cursor position
static void Display_whole_string(word x_pos,word y_pos,const char * str,byte position)
{
char cursor[2];
@@ -270,6 +277,10 @@ static void Display_whole_string(word x_pos,word y_pos,const char * str,byte pos
Print_general(x_pos+(position<<3)*Menu_factor_X,y_pos,cursor,CURSOR_COLOR,CURSOR_BACKGROUND_COLOR);
}
+//! Prints the unicode string and the cursor on screen
+//! @param x_pos, y_pos position on screen
+//! @param str_unicode the string to display
+//! @param position the cursor position
static void Display_whole_string_unicode(word x_pos,word y_pos, const word * str_unicode,byte position)
{
word cursor[2];
@@ -280,6 +291,7 @@ static void Display_whole_string_unicode(word x_pos,word y_pos, const word * str
Print_general_unicode(x_pos+(position<<3)*Menu_factor_X,y_pos,cursor,CURSOR_COLOR,CURSOR_BACKGROUND_COLOR);
}
+//! Initializes and displays the visual keyboard
void Init_virtual_keyboard(word y_pos, word keyboard_width, word keyboard_height)
{
int h_pos;
@@ -310,7 +322,11 @@ void Init_virtual_keyboard(word y_pos, word keyboard_width, word keyboard_height
}
-// Inspired from http://www.libsdl.org/projects/scrap/
+//! Get clipboard text content.
+//! Inspired from http://www.libsdl.org/projects/scrap/
+//! @param unicode NULL for pure ANSI working, or a pointer to get Unicode text data
+//! that should be free()'d by the caller
+//! @return a ANSI C string that should be free()'d by the caller
static char* getClipboard(word * * unicode)
{
#ifdef WIN32
@@ -550,6 +566,7 @@ bye:
return return_str;
}
#else
+ // mac OS without X11
return strdup(utf8_str);
#endif
}
@@ -567,7 +584,7 @@ bye:
/****************************************************************************
* Enhanced super scanf deluxe pro plus giga mieux :-) *
****************************************************************************/
-byte Readline(word x_pos,word y_pos,char * str,byte visible_size,byte input_type)
+byte Readline(word x_pos, word y_pos, char * str, byte visible_size, enum INPUT_TYPE input_type)
// Paramètres:
// x_pos, y_pos : Coordonnées de la saisie dans la fenêtre
// str : Chaîne recevant la saisie (et contenant éventuellement une valeur initiale)
@@ -589,12 +606,15 @@ byte Readline(word x_pos,word y_pos,char * str,byte visible_size,byte input_type
/****************************************************************************
* Enhanced super scanf deluxe pro plus giga mieux :-) *
****************************************************************************/
-byte Readline_ex(word x_pos,word y_pos,char * str,byte visible_size,byte max_size, byte input_type, byte decimal_places)
+byte Readline_ex(word x_pos,word y_pos,char * str,byte visible_size,byte max_size,
+ enum INPUT_TYPE input_type, byte decimal_places)
{
return Readline_ex_unicode(x_pos, y_pos, str, NULL, visible_size, max_size, input_type, decimal_places);
}
-byte Readline_ex_unicode(word x_pos,word y_pos,char * str,word * str_unicode,byte visible_size,byte max_size, byte input_type, byte decimal_places)
+byte Readline_ex_unicode(word x_pos, word y_pos, char * str, word * str_unicode,
+ byte visible_size, byte max_size,
+ enum INPUT_TYPE input_type, byte decimal_places)
// Paramètres:
// x_pos, y_pos : Coordonnées de la saisie dans la fenêtre
// str : Chaîne recevant la saisie (et contenant éventuellement une valeur initiale)
@@ -877,6 +897,7 @@ byte Readline_ex_unicode(word x_pos,word y_pos,char * str,word * str_unicode,byt
char * data = getClipboard(&data_unicode);
if (data_unicode != NULL)
{
+ // ignore ANSI data, use Unicode
Cleanup_string_unicode(data_unicode, input_type);
nb_added = Prepend_string_unicode(str_unicode + position, data_unicode, max_size - position);
free(data_unicode);
@@ -887,7 +908,7 @@ byte Readline_ex_unicode(word x_pos,word y_pos,char * str,word * str_unicode,byt
if (data == NULL)
continue;
Cleanup_string(data, input_type);
- Unicode_char_strlcpy(tmp_unicode, data, sizeof(tmp_unicode)/sizeof(word));
+ Unicode_char_strlcpy(tmp_unicode, data, sizeof(tmp_unicode)/sizeof(word)); // convert ANSI to unicode
nb_added = Prepend_string_unicode(str_unicode + position, tmp_unicode, max_size - position);
}
free(data);
diff --git a/src/readline.h b/src/readline.h
index d7dcff8f..59918427 100644
--- a/src/readline.h
+++ b/src/readline.h
@@ -42,7 +42,8 @@ enum INPUT_TYPE
/// @param visible_size Number of characters visible and editable.
/// @param input_type one of enum ::INPUT_TYPE
/// @return 0 if user cancelled (esc), 1 if accepted (return)
-byte Readline(word x_pos,word y_pos,char * str,byte visible_size,byte input_type);
+byte Readline(word x_pos, word y_pos, char * str, byte visible_size,
+ enum INPUT_TYPE input_type);
///
/// Lets the user input a line of text, exit by Esc or Return.
@@ -54,9 +55,26 @@ byte Readline(word x_pos,word y_pos,char * str,byte visible_size,byte input_type
/// @param input_type one of enum ::INPUT_TYPE
/// @param decimal_places Number of decimal places (used only with decimal type)
/// @return 0 if user cancelled (esc), 1 if accepted (return)
-byte Readline_ex(word x_pos,word y_pos,char * str,byte visible_size,byte max_size, byte input_type, byte decimal_places);
+byte Readline_ex(word x_pos, word y_pos, char * str,
+ byte visible_size, byte max_size,
+ enum INPUT_TYPE input_type, byte decimal_places);
-byte Readline_ex_unicode(word x_pos,word y_pos,char * str, word * unicode_str, byte visible_size,byte max_size, byte input_type, byte decimal_places);
+///
+/// Lets the user input a line of text, exit by Esc or Return.
+/// @param x_pos, y_pos Coordinates of input, in window coordinates before scaling.
+/// @param str The original string value. Will be modified,
+/// unless user cancels or @p unicode_str is not NULL.
+/// @param unicode_str The original unicode string value or NULL for ANSI editing.
+/// Will be modified if not NULL, unless user cancels.
+/// @param visible_size Number of characters visible.
+/// @param max_size Number of characters editable.
+/// @param input_type one of enum ::INPUT_TYPE
+/// @param decimal_places Number of decimal places (used only with decimal type)
+/// @return 0 : user cancelled (esc)
+/// @return 1 : user accepted (return)
+byte Readline_ex_unicode(word x_pos, word y_pos, char * str, word * unicode_str,
+ byte visible_size, byte max_size,
+ enum INPUT_TYPE input_type, byte decimal_places);
///
/// Converts a double to string.