1 /***************************************************************************
2  * Copyright (c) 2024 Microsoft Corporation
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the MIT License which is available at
6  * https://opensource.org/licenses/MIT.
7  *
8  * SPDX-License-Identifier: MIT
9  **************************************************************************/
10 
11 
12 /**************************************************************************/
13 /**************************************************************************/
14 /**                                                                       */
15 /** GUIX Component                                                        */
16 /**                                                                       */
17 /**   Multi Line Text Input Management (Multi Line Text Input)            */
18 /**                                                                       */
19 /**************************************************************************/
20 
21 #define GX_SOURCE_CODE
22 
23 
24 /* Include necessary system files.  */
25 
26 #include "gx_api.h"
27 #include "gx_multi_line_text_input.h"
28 #include "gx_utility.h"
29 #include "gx_window.h"
30 #include "gx_system.h"
31 #include "gx_multi_line_text_view.h"
32 
33 /**************************************************************************/
34 /*                                                                        */
35 /*  FUNCTION                                               RELEASE        */
36 /*                                                                        */
37 /*    _gx_multi_line_text_input_keydown_process           PORTABLE C      */
38 /*                                                           6.1          */
39 /*  AUTHOR                                                                */
40 /*                                                                        */
41 /*    Kenneth Maxwell, Microsoft Corporation                              */
42 /*                                                                        */
43 /*  DESCRIPTION                                                           */
44 /*                                                                        */
45 /*    This function processes events for the specified text input widget. */
46 /*                                                                        */
47 /*  INPUT                                                                 */
48 /*                                                                        */
49 /*    input                                 Multi line text input         */
50 /*                                            control block               */
51 /*    event_ptr                             Incoming event to process     */
52 /*                                                                        */
53 /*  OUTPUT                                                                */
54 /*                                                                        */
55 /*    None                                                                */
56 /*                                                                        */
57 /*  CALLS                                                                 */
58 /*                                                                        */
59 /*    _gx_multi_line_text_input_backspace   Process the backspace key     */
60 /*    _gx_multi_line_text_input_delete      Process the delete key        */
61 /*    _gx_multi_line_text_input_left_arrow  Process the left arrow key    */
62 /*    _gx_multi_line_text_input_right_arrow Process the right arrow key   */
63 /*    _gx_multi_line_text_input_up_arrow    Process the up arrow key      */
64 /*    _gx_multi_line_text_input_down_arrow  Process the down arrow key    */
65 /*    _gx_multi_line_text_input_char_insert                               */
66 /*                                          Insert a character            */
67 /*    _gx_multi_line_text_input_home        Process the HOME key          */
68 /*    _gx_multi_line_text_input_end         Process the END key           */
69 /*    _gx_utility_unicode_to_utf8           Parse a unicode to utf8 string*/
70 /*    _gx_window_event_process              Default window event process  */
71 /*                                                                        */
72 /*  CALLED BY                                                             */
73 /*                                                                        */
74 /*    _gx_multi_line_text_input_event_process                             */
75 /*                                                                        */
76 /*  RELEASE HISTORY                                                       */
77 /*                                                                        */
78 /*    DATE              NAME                      DESCRIPTION             */
79 /*                                                                        */
80 /*  05-19-2020     Kenneth Maxwell          Initial Version 6.0           */
81 /*  09-30-2020     Kenneth Maxwell          Modified comment(s),          */
82 /*                                            resulting in version 6.1    */
83 /*                                                                        */
84 /**************************************************************************/
_gx_multi_line_text_input_keydown_process(GX_MULTI_LINE_TEXT_INPUT * input,GX_EVENT * event_ptr)85 UINT  _gx_multi_line_text_input_keydown_process(GX_MULTI_LINE_TEXT_INPUT *input, GX_EVENT *event_ptr)
86 {
87 UINT      status;
88 USHORT    key_value;
89 GX_UBYTE  utf8_str[10];
90 GX_STRING string;
91 
92     switch (event_ptr -> gx_event_payload.gx_event_ushortdata[0])
93     {
94     case GX_KEY_BACKSPACE:
95         status = _gx_multi_line_text_input_backspace(input);
96         break;
97 
98     case GX_KEY_DELETE:
99         status = _gx_multi_line_text_input_delete(input);
100         break;
101 
102     case GX_KEY_LEFT_ARROW:
103         status = _gx_multi_line_text_input_left_arrow(input);
104         break;
105 
106     case GX_KEY_RIGHT_ARROW:
107         status = _gx_multi_line_text_input_right_arrow(input);
108         break;
109 
110     case GX_KEY_UP_ARROW:
111         status = _gx_multi_line_text_input_up_arrow(input);
112         break;
113 
114     case GX_KEY_DOWN_ARROW:
115         status = _gx_multi_line_text_input_down_arrow(input);
116         break;
117 
118     case GX_KEY_CARRIAGE_RETURN:
119     case GX_KEY_LINE_FEED:
120         utf8_str[0] = (GX_UBYTE)event_ptr -> gx_event_payload.gx_event_ushortdata[0];
121         string.gx_string_ptr = (GX_CHAR *)utf8_str;
122         string.gx_string_length = 1;
123         status = _gx_multi_line_text_input_char_insert_ext(input, &string);
124         break;
125 
126     case GX_KEY_SPACE:
127         utf8_str[0] = ' ';
128         string.gx_string_ptr = (GX_CHAR *)utf8_str;
129         string.gx_string_length = 1;
130         status = _gx_multi_line_text_input_char_insert_ext(input, &string);
131         break;
132 
133     case GX_KEY_HOME:
134         status = _gx_multi_line_text_input_home(input);
135         break;
136 
137     case GX_KEY_END:
138         status = _gx_multi_line_text_input_end(input);
139         break;
140 
141     default:
142         key_value = event_ptr -> gx_event_payload.gx_event_ushortdata[0];
143 
144         if ((key_value <= 0x1f) ||
145             ((key_value >= 0x1b01) && key_value <= 0x1b14))
146         {
147             return _gx_window_event_process((GX_WINDOW *)input, event_ptr);
148         }
149 
150         if (key_value <= 0x7e)
151         {
152             utf8_str[0] = (GX_UBYTE)key_value;
153             string.gx_string_ptr = (GX_CHAR *)utf8_str;
154             string.gx_string_length = 1;
155             status = _gx_multi_line_text_input_char_insert_ext(input, &string);
156         }
157 #ifdef GX_UTF8_SUPPORT
158         else
159         {
160 
161             _gx_utility_unicode_to_utf8(key_value, utf8_str, &string.gx_string_length);
162 
163             string.gx_string_ptr = (GX_CHAR *)utf8_str;
164 
165             /* Insert a utf8 string to input buffer. */
166             status = _gx_multi_line_text_input_char_insert_ext(input, &string);
167         }
168 #endif
169         break;
170     }
171 
172     return status;
173 }
174 
175