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 /** Text Input Management (Single 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_system.h"
28 #include "gx_widget.h"
29 #include "gx_single_line_text_input.h"
30 #include "gx_utility.h"
31
32 /**************************************************************************/
33 /* */
34 /* FUNCTION RELEASE */
35 /* */
36 /* _gx_single_line_text_input_keydown_process PORTABLE C */
37 /* 6.1 */
38 /* AUTHOR */
39 /* */
40 /* Kenneth Maxwell, Microsoft Corporation */
41 /* */
42 /* DESCRIPTION */
43 /* */
44 /* This function processes key-down events for the single line text */
45 /* input widget. */
46 /* */
47 /* INPUT */
48 /* */
49 /* text_input Single-line text input widget */
50 /* control block */
51 /* event_ptr Pointer to GX_EVENT structure */
52 /* */
53 /* OUTPUT */
54 /* */
55 /* None */
56 /* */
57 /* CALLS */
58 /* */
59 /* _gx_widget_event_process Default widget event process */
60 /* _gx_widget_event_generate Create a event and send it to */
61 /* parent */
62 /* _gx_single_line_text_input_home Process the home key */
63 /* _gx_single_line_text_input_end Process the end key */
64 /* _gx_single_line_text_input_backspace Process the backspace key */
65 /* _gx_single_line_text_input_character_delete */
66 /* Delete a character */
67 /* _gx_single_line_text_input_left_arrow */
68 /* Process the left arrow key */
69 /* _gx_single_line_text_input_right_arrow */
70 /* Process the right arrow key */
71 /* _gx_single_line_text_input_character_insert */
72 /* Insert a charcter */
73 /* */
74 /* CALLED BY */
75 /* */
76 /* _gx_single_line_text_input_event_process */
77 /* Single line text input widget */
78 /* event process routine */
79 /* */
80 /* RELEASE HISTORY */
81 /* */
82 /* DATE NAME DESCRIPTION */
83 /* */
84 /* 05-19-2020 Kenneth Maxwell Initial Version 6.0 */
85 /* 09-30-2020 Kenneth Maxwell Modified comment(s), */
86 /* resulting in version 6.1 */
87 /* */
88 /**************************************************************************/
_gx_single_line_text_input_keydown_process(GX_SINGLE_LINE_TEXT_INPUT * text_input,GX_EVENT * event_ptr)89 VOID _gx_single_line_text_input_keydown_process(GX_SINGLE_LINE_TEXT_INPUT *text_input, GX_EVENT *event_ptr)
90 {
91 GX_WIDGET *widget = (GX_WIDGET *)text_input;
92 USHORT key_value;
93 GX_UBYTE utf8_str[10];
94 UINT utf8_size;
95
96 /* Process relative to the value of key. */
97 switch (event_ptr -> gx_event_payload.gx_event_ushortdata[0])
98 {
99 case GX_KEY_HOME:
100 _gx_single_line_text_input_home(text_input);
101 break;
102
103 case GX_KEY_END:
104 _gx_single_line_text_input_end(text_input);
105 break;
106
107 case GX_KEY_BACKSPACE:
108 _gx_single_line_text_input_backspace(text_input);
109 break;
110
111 case GX_KEY_DELETE:
112 _gx_single_line_text_input_character_delete(text_input);
113 break;
114
115 case GX_KEY_LEFT_ARROW:
116 _gx_single_line_text_input_left_arrow(text_input);
117 break;
118
119 case GX_KEY_RIGHT_ARROW:
120 _gx_single_line_text_input_right_arrow(text_input);
121 break;
122
123 case GX_KEY_SELECT:
124 if (text_input -> gx_single_line_text_input_was_modified)
125 {
126 _gx_widget_event_generate(widget, GX_EVENT_TEXT_EDITED, 0);
127 text_input -> gx_single_line_text_input_was_modified = GX_FALSE;
128 }
129 break;
130 case GX_KEY_SPACE:
131 utf8_str[0] = ' ';
132 utf8_size = 1;
133 _gx_single_line_text_input_character_insert(text_input, utf8_str, utf8_size);
134 break;
135
136 default:
137 key_value = event_ptr -> gx_event_payload.gx_event_ushortdata[0];
138
139 if ((key_value <= 0x1f) ||
140 ((key_value >= 0x1b01) && key_value <= 0x1b14))
141 {
142 _gx_widget_event_process((GX_WIDGET *)text_input, event_ptr);
143 return;
144 }
145
146 /* If the key value is displayable, insert the value to the text input. */
147 if (key_value <= 0x7e)
148 {
149 utf8_str[0] = (GX_UBYTE)key_value;
150 utf8_size = 1;
151 _gx_single_line_text_input_character_insert(text_input, utf8_str, utf8_size);
152 }
153 #ifdef GX_UTF8_SUPPORT
154 else
155 {
156 _gx_utility_unicode_to_utf8(key_value, utf8_str, &utf8_size);
157
158 /* Insert a utf8 string to input buffer. */
159 _gx_single_line_text_input_character_insert(text_input, utf8_str, utf8_size);
160 }
161 #endif
162 break;
163 }
164 }
165
166