4 * Copyright (c) 2014 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 "-"
42 struct menu_data *menu;
51 char key_buffer[MENU_DATA_SIZE];
52 int flag_pid_display = 1;
55 static void _show_prompt (void)
57 msgn ("(%5d) >> ", get_tid ());
60 static void _show_reserved_menu (void)
62 msg (ANSI_COLOR_DARKGRAY HR_SINGLE2 ANSI_COLOR_NORMAL);
63 msg (ANSI_COLOR_DARKGRAY " [ " ANSI_COLOR_NORMAL "%s" ANSI_COLOR_DARKGRAY
64 " ] " ANSI_COLOR_NORMAL "Previous menu " , DEFAULT_MENU_PREV);
65 msg (ANSI_COLOR_DARKGRAY " [ " ANSI_COLOR_NORMAL "%s" ANSI_COLOR_DARKGRAY
66 " ] " ANSI_COLOR_NORMAL "Show Menu " , DEFAULT_MENU_MENU);
67 msg (ANSI_COLOR_DARKGRAY " [ " ANSI_COLOR_NORMAL "%s" ANSI_COLOR_DARKGRAY
68 " ] " ANSI_COLOR_NORMAL "Quit " , DEFAULT_MENU_QUIT);
71 static void _show_input_ok (void)
76 static void _show_menu (MManager *m, struct menu_data menu[])
80 struct menu_data *item;
81 char title_buf[256] = { 0, };
89 len = g_queue_get_length (m->title_stack);
90 msgn (ANSI_COLOR_YELLOW " Main");
92 for (i = 0; i < len; i++) {
93 msgn (ANSI_COLOR_NORMAL " >> " ANSI_COLOR_YELLOW "%s",
94 (char *) g_queue_peek_nth (m->title_stack, i));
97 msg (ANSI_COLOR_NORMAL);
105 if (item->key == NULL)
108 if (!g_strcmp0 (item->key, "-")) {
111 else if (!g_strcmp0 (item->key, "_")) {
112 msg (ANSI_COLOR_DARKGRAY HR_SINGLE2 ANSI_COLOR_NORMAL);
115 item->callback (m, item);
121 else if (!g_strcmp0 (item->key, "*")) {
122 msg (" %s", item->title);
124 item->callback (m, item);
127 msgn (ANSI_COLOR_DARKGRAY " [" ANSI_COLOR_NORMAL "%3s"
128 ANSI_COLOR_DARKGRAY "] " ANSI_COLOR_NORMAL, item->key);
131 memset (title_buf, 0, 256);
133 snprintf (title_buf, MAX_TITLE, "%s", item->title);
135 if (strlen (item->title) >= MAX_TITLE) {
136 title_buf[MAX_TITLE - 2] = '.';
137 title_buf[MAX_TITLE - 1] = '.';
142 msg ("%s " ANSI_COLOR_LIGHTBLUE "(%s)" ANSI_COLOR_NORMAL,
143 title_buf, item->data);
145 else if (!g_strcmp0 (item->key, "*")) {
149 msg ("%s", title_buf);
152 if (item->sub_menu) {
153 msg ("\e[1A\e[%dC >", POS_MORE);
161 _show_reserved_menu();
168 static void _show_item_data_input_msg (struct menu_data *item)
172 msg (" Input [%s] data ", item->title);
174 msg (" current = [%s]", item->data);
178 static void _move_menu (MManager *mm, struct menu_data menu[], char *key)
180 struct menu_data *item;
186 if (!g_strcmp0 (DEFAULT_MENU_PREV, key)) {
187 if (g_queue_get_length (mm->stack) > 0) {
188 mm->menu = g_queue_pop_tail (mm->stack);
189 g_queue_pop_tail (mm->title_stack);
192 _show_menu (mm, mm->menu);
193 mm->buf = key_buffer;
197 else if (!g_strcmp0 (DEFAULT_MENU_MENU, key)) {
198 _show_menu (mm, mm->menu);
201 else if (!g_strcmp0 (DEFAULT_MENU_QUIT, key)) {
202 g_main_loop_quit (mm->mainloop);
205 else if (!g_strcmp0 (DEFAULT_MENU_NONE, key)) {
211 int ret = RET_SUCCESS;
213 if (item->key == NULL)
216 if (!g_strcmp0 (item->key, key)) {
217 if (item->callback) {
218 ret = item->callback (mm, item);
222 if(RET_SUCCESS == ret) {
223 if (item->sub_menu) {
224 g_queue_push_tail (mm->stack, mm->menu);
225 g_queue_push_tail (mm->title_stack, (gpointer *)item->title);
227 mm->menu = item->sub_menu;
228 _show_menu (mm, mm->menu);
229 mm->buf = key_buffer;
233 _show_item_data_input_msg (item);
234 mm->buf = item->data;
247 MManager *menu_manager_new (struct menu_data items[], GMainLoop *mainloop)
251 mm = calloc (sizeof (struct menu_manager), 1);
255 mm->stack = g_queue_new();
256 mm->title_stack = g_queue_new();
258 mm->mainloop = mainloop;
263 int menu_manager_run (MManager *mm)
265 _show_menu (mm, mm->menu);
267 mm->buf = key_buffer;
272 int menu_manager_set_user_data (MManager *mm, void *user_data)
277 mm->user_data = user_data;
282 void *menu_manager_ref_user_data (MManager *mm)
287 return mm->user_data;
290 gboolean on_menu_manager_keyboard (GIOChannel *src, GIOCondition con,
294 char local_buf[MENU_DATA_SIZE + 1] = { 0, };
296 if (fgets (local_buf, MENU_DATA_SIZE, stdin) == NULL)
299 if (strlen (local_buf) > 0) {
300 if (local_buf[strlen (local_buf) - 1] == '\n')
301 local_buf[strlen (local_buf) - 1] = '\0';
304 if (mm->buf == key_buffer) {
305 if (strlen (local_buf) < 1) {
310 _move_menu (mm, mm->menu, local_buf);
314 memset (mm->buf, 0, MENU_DATA_SIZE);
315 memcpy (mm->buf, local_buf, MENU_DATA_SIZE);
318 mm->buf = key_buffer;
319 _move_menu (mm, mm->menu, (char *)DEFAULT_MENU_MENU);
327 return syscall (__NR_gettid);
332 flag_pid_display = 0;
337 flag_pid_display = 1;
342 return flag_pid_display;
345 static void _hex_dump(const char *pad, int size, const void *data)
347 char buf[255] = {0, };
353 msg("%sno data", pad);
356 p = (unsigned char *)data;
358 snprintf(buf, 255, "%s%04X: ", pad, 0);
359 for (i = 0; i<size; i++) {
360 snprintf(hex, 4, "%02X ", p[i]);
363 if ((i + 1) % 8 == 0) {
364 if ((i + 1) % 16 == 0) {
367 snprintf(buf, 255, "%s%04X: ", pad, i + 1);
378 void menu_print_dump(int data_len, void *data)
384 msg(" \tlen=%d", data_len);
385 _hex_dump(" ", data_len, data);