2 * Telephony test application
4 * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
6 * Contact: Ja-young Gu <jygu@samsung.com>
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
25 #include <sys/types.h>
27 #include <asm/unistd.h>
29 #include <sys/syscall.h>
33 #define DEFAULT_MENU_MENU "m"
34 #define DEFAULT_MENU_PREV "p"
35 #define DEFAULT_MENU_QUIT "q"
36 #define DEFAULT_MENU_NONE "-"
43 struct menu_data *menu;
52 char key_buffer[MENU_DATA_SIZE];
53 int flag_pid_display = 1;
56 static void _show_prompt (void)
58 msgn ("(%5d) >> ", get_tid ());
61 static void _show_reserved_menu (void)
63 msg (ANSI_COLOR_DARKGRAY HR_SINGLE2 ANSI_COLOR_NORMAL);
64 msg (ANSI_COLOR_DARKGRAY " [ " ANSI_COLOR_NORMAL "%s" ANSI_COLOR_DARKGRAY
65 " ] " ANSI_COLOR_NORMAL "Previous menu " , DEFAULT_MENU_PREV);
66 msg (ANSI_COLOR_DARKGRAY " [ " ANSI_COLOR_NORMAL "%s" ANSI_COLOR_DARKGRAY
67 " ] " ANSI_COLOR_NORMAL "Show Menu " , DEFAULT_MENU_MENU);
68 msg (ANSI_COLOR_DARKGRAY " [ " ANSI_COLOR_NORMAL "%s" ANSI_COLOR_DARKGRAY
69 " ] " ANSI_COLOR_NORMAL "Quit " , DEFAULT_MENU_QUIT);
72 static void _show_input_ok (void)
77 static void _show_menu (MManager *m, struct menu_data menu[])
81 struct menu_data *item;
82 char title_buf[256] = { 0, };
90 len = g_queue_get_length (m->title_stack);
91 msgn (ANSI_COLOR_YELLOW " Main");
93 for (i = 0; i < len; i++) {
94 msgn (ANSI_COLOR_NORMAL " >> " ANSI_COLOR_YELLOW "%s",
95 (char *) g_queue_peek_nth (m->title_stack, i));
98 msg (ANSI_COLOR_NORMAL);
106 if (item->key == NULL)
109 if (!g_strcmp0 (item->key, "-")) {
112 else if (!g_strcmp0 (item->key, "_")) {
113 msg (ANSI_COLOR_DARKGRAY HR_SINGLE2 ANSI_COLOR_NORMAL);
116 item->callback (m, item);
122 else if (!g_strcmp0 (item->key, "*")) {
123 msg (" %s", item->title);
125 item->callback (m, item);
128 msgn (ANSI_COLOR_DARKGRAY " [" ANSI_COLOR_NORMAL "%3s"
129 ANSI_COLOR_DARKGRAY "] " ANSI_COLOR_NORMAL, item->key);
132 memset (title_buf, 0, 256);
134 snprintf (title_buf, MAX_TITLE, "%s", item->title);
136 if (strlen (item->title) >= MAX_TITLE) {
137 title_buf[MAX_TITLE - 2] = '.';
138 title_buf[MAX_TITLE - 1] = '.';
143 msg ("%s " ANSI_COLOR_LIGHTBLUE "(%s)" ANSI_COLOR_NORMAL,
144 title_buf, item->data);
146 else if (!g_strcmp0 (item->key, "*")) {
150 msg ("%s", title_buf);
153 if (item->sub_menu) {
154 msg ("\e[1A\e[%dC >", POS_MORE);
162 _show_reserved_menu();
169 static void _show_item_data_input_msg (struct menu_data *item)
173 msg (" Input [%s] data ", item->title);
175 msg (" current = [%s]", item->data);
179 static void _move_menu (MManager *mm, struct menu_data menu[], char *key)
181 struct menu_data *item;
187 if (!g_strcmp0 (DEFAULT_MENU_PREV, key)) {
188 if (g_queue_get_length (mm->stack) > 0) {
189 mm->menu = g_queue_pop_tail (mm->stack);
190 g_queue_pop_tail (mm->title_stack);
193 _show_menu (mm, mm->menu);
194 mm->buf = key_buffer;
198 else if (!g_strcmp0 (DEFAULT_MENU_MENU, key)) {
199 _show_menu (mm, mm->menu);
202 else if (!g_strcmp0 (DEFAULT_MENU_QUIT, key)) {
203 g_main_loop_quit (mm->mainloop);
206 else if (!g_strcmp0 (DEFAULT_MENU_NONE, key)) {
213 if (item->key == NULL)
216 if (!g_strcmp0 (item->key, key)) {
217 if (item->sub_menu) {
218 g_queue_push_tail (mm->stack, mm->menu);
219 g_queue_push_tail (mm->title_stack, item->title);
221 mm->menu = item->sub_menu;
222 _show_menu (mm, mm->menu);
223 mm->buf = key_buffer;
226 if (item->callback) {
227 item->callback (mm, item);
232 _show_item_data_input_msg (item);
233 mm->buf = item->data;
245 MManager *menu_manager_new (struct menu_data items[], GMainLoop *mainloop)
249 mm = calloc (sizeof (struct menu_manager), 1);
253 mm->stack = g_queue_new();
254 mm->title_stack = g_queue_new();
256 mm->mainloop = mainloop;
261 int menu_manager_run (MManager *mm)
263 _show_menu (mm, mm->menu);
265 mm->buf = key_buffer;
270 int menu_manager_set_user_data (MManager *mm, void *user_data)
275 mm->user_data = user_data;
280 void *menu_manager_ref_user_data (MManager *mm)
285 return mm->user_data;
288 gboolean on_menu_manager_keyboard (GIOChannel *src, GIOCondition con,
292 char local_buf[MENU_DATA_SIZE + 1] = { 0, };
294 if (fgets (local_buf, MENU_DATA_SIZE, stdin) == NULL)
297 if (strlen (local_buf) > 0) {
298 if (local_buf[strlen (local_buf) - 1] == '\n')
299 local_buf[strlen (local_buf) - 1] = '\0';
302 if (mm->buf == key_buffer) {
303 if (strlen (local_buf) < 1) {
308 _move_menu (mm, mm->menu, local_buf);
312 memset (mm->buf, 0, MENU_DATA_SIZE);
313 memcpy (mm->buf, local_buf, MENU_DATA_SIZE);
316 mm->buf = key_buffer;
317 _move_menu (mm, mm->menu, DEFAULT_MENU_MENU);
325 return syscall (__NR_gettid);
330 flag_pid_display = 0;
335 flag_pid_display = 1;
340 return flag_pid_display;