| 711 |
return -1; |
return -1; |
| 712 |
} |
} |
| 713 |
|
|
| 714 |
moveto(p_menu_item->r_row, p_menu_item->r_col - 2); |
moveto(p_menu_set->menu_item_r_row[menu_item_pos], p_menu_set->menu_item_r_col[menu_item_pos] - 2); |
| 715 |
outc(show ? '>' : ' '); |
outc(show ? '>' : ' '); |
| 716 |
iflush(); |
iflush(); |
| 717 |
|
|
| 773 |
iflush(); |
iflush(); |
| 774 |
} |
} |
| 775 |
|
|
| 776 |
for (int16_t i = 0; i < p_menu->item_count; i++) |
for (menu_item_pos = 0; menu_item_pos < p_menu->item_count; menu_item_pos++) |
| 777 |
{ |
{ |
| 778 |
menu_item_id = p_menu->items[i]; |
menu_item_id = p_menu->items[menu_item_pos]; |
| 779 |
p_menu_item = get_menu_item_by_id(p_menu_set, menu_item_id); |
p_menu_item = get_menu_item_by_id(p_menu_set, menu_item_id); |
| 780 |
|
|
| 781 |
if (p_menu_item->row != 0) |
if (p_menu_item->row != 0) |
| 789 |
|
|
| 790 |
if (checkpriv(&BBS_priv, 0, p_menu_item->priv) == 0 || checklevel(&BBS_priv, p_menu_item->level) == 0) |
if (checkpriv(&BBS_priv, 0, p_menu_item->priv) == 0 || checklevel(&BBS_priv, p_menu_item->level) == 0) |
| 791 |
{ |
{ |
| 792 |
p_menu_item->display = 0; |
p_menu_set->menu_item_display[menu_item_pos] = 0; |
| 793 |
p_menu_item->r_row = 0; |
p_menu_set->menu_item_r_row[menu_item_pos] = 0; |
| 794 |
p_menu_item->r_col = 0; |
p_menu_set->menu_item_r_col[menu_item_pos] = 0; |
| 795 |
} |
} |
| 796 |
else |
else |
| 797 |
{ |
{ |
| 798 |
p_menu_item->display = 1; |
p_menu_set->menu_item_display[menu_item_pos] = 1; |
| 799 |
|
|
| 800 |
if (!menu_selectable) |
if (!menu_selectable) |
| 801 |
{ |
{ |
| 802 |
p_menu_set->menu_item_pos[p_menu_set->choose_step] = i; |
p_menu_set->menu_item_pos[p_menu_set->choose_step] = menu_item_pos; |
| 803 |
menu_selectable = 1; |
menu_selectable = 1; |
| 804 |
} |
} |
| 805 |
|
|
| 806 |
p_menu_item->r_row = row; |
p_menu_set->menu_item_r_row[menu_item_pos] = row; |
| 807 |
p_menu_item->r_col = col; |
p_menu_set->menu_item_r_col[menu_item_pos] = col; |
| 808 |
|
|
| 809 |
moveto(row, col); |
moveto(row, col); |
| 810 |
prints("%s", p_menu_item->text); |
prints("%s", p_menu_item->text); |
| 906 |
return -1; |
return -1; |
| 907 |
} |
} |
| 908 |
|
|
| 909 |
if (!p_menu_item->display || p_menu_item->priv != 0 || p_menu_item->level != 0) |
if (!p_menu_set->menu_item_display[menu_item_pos] || p_menu_item->priv != 0 || p_menu_item->level != 0) |
| 910 |
{ |
{ |
| 911 |
menu_item_pos--; |
menu_item_pos--; |
| 912 |
} |
} |
| 935 |
log_error("get_menu_item_by_id(%d) return NULL pointer\n", menu_item_id); |
log_error("get_menu_item_by_id(%d) return NULL pointer\n", menu_item_id); |
| 936 |
return -1; |
return -1; |
| 937 |
} |
} |
| 938 |
} while (!p_menu_item->display); |
} while (!p_menu_set->menu_item_display[menu_item_pos]); |
| 939 |
p_menu_set->menu_item_pos[p_menu_set->choose_step] = menu_item_pos; |
p_menu_set->menu_item_pos[p_menu_set->choose_step] = menu_item_pos; |
| 940 |
display_menu_cursor(p_menu_set, 1); |
display_menu_cursor(p_menu_set, 1); |
| 941 |
break; |
break; |
| 955 |
log_error("get_menu_item_by_id(%d) return NULL pointer\n", menu_item_id); |
log_error("get_menu_item_by_id(%d) return NULL pointer\n", menu_item_id); |
| 956 |
return -1; |
return -1; |
| 957 |
} |
} |
| 958 |
} while (!p_menu_item->display); |
} while (!p_menu_set->menu_item_display[menu_item_pos]); |
| 959 |
|
p_menu_set->menu_item_pos[p_menu_set->choose_step] = menu_item_pos; |
| 960 |
|
display_menu_cursor(p_menu_set, 1); |
| 961 |
|
break; |
| 962 |
|
case KEY_HOME: |
| 963 |
|
case KEY_PGUP: |
| 964 |
|
display_menu_cursor(p_menu_set, 0); |
| 965 |
|
menu_item_pos = 0; |
| 966 |
|
while (menu_item_pos < p_menu->item_count - 1) |
| 967 |
|
{ |
| 968 |
|
menu_item_id = p_menu->items[menu_item_pos]; |
| 969 |
|
p_menu_item = get_menu_item_by_id(p_menu_set, menu_item_id); |
| 970 |
|
if (p_menu_item == NULL) |
| 971 |
|
{ |
| 972 |
|
log_error("get_menu_item_by_id(%d) return NULL pointer\n", menu_item_id); |
| 973 |
|
return -1; |
| 974 |
|
} |
| 975 |
|
|
| 976 |
|
if (p_menu_set->menu_item_display[menu_item_pos]) |
| 977 |
|
{ |
| 978 |
|
break; |
| 979 |
|
} |
| 980 |
|
|
| 981 |
|
menu_item_pos++; |
| 982 |
|
} |
| 983 |
|
p_menu_set->menu_item_pos[p_menu_set->choose_step] = menu_item_pos; |
| 984 |
|
display_menu_cursor(p_menu_set, 1); |
| 985 |
|
break; |
| 986 |
|
case KEY_END: |
| 987 |
|
case KEY_PGDN: |
| 988 |
|
display_menu_cursor(p_menu_set, 0); |
| 989 |
|
menu_item_pos = p_menu->item_count - 1; |
| 990 |
|
while (menu_item_pos > 0) |
| 991 |
|
{ |
| 992 |
|
menu_item_id = p_menu->items[menu_item_pos]; |
| 993 |
|
p_menu_item = get_menu_item_by_id(p_menu_set, menu_item_id); |
| 994 |
|
if (p_menu_item == NULL) |
| 995 |
|
{ |
| 996 |
|
log_error("get_menu_item_by_id(%d) return NULL pointer\n", menu_item_id); |
| 997 |
|
return -1; |
| 998 |
|
} |
| 999 |
|
|
| 1000 |
|
if (p_menu_set->menu_item_display[menu_item_pos]) |
| 1001 |
|
{ |
| 1002 |
|
break; |
| 1003 |
|
} |
| 1004 |
|
|
| 1005 |
|
menu_item_pos--; |
| 1006 |
|
} |
| 1007 |
p_menu_set->menu_item_pos[p_menu_set->choose_step] = menu_item_pos; |
p_menu_set->menu_item_pos[p_menu_set->choose_step] = menu_item_pos; |
| 1008 |
display_menu_cursor(p_menu_set, 1); |
display_menu_cursor(p_menu_set, 1); |
| 1009 |
break; |
break; |
| 1010 |
default: |
default: |
| 1011 |
if (isalnum(key)) |
if (isalnum(key)) |
| 1012 |
{ |
{ |
| 1013 |
for (int16_t i = 0; i < p_menu->item_count; i++) |
for (menu_item_pos = 0; menu_item_pos < p_menu->item_count; menu_item_pos++) |
| 1014 |
{ |
{ |
| 1015 |
menu_item_id = p_menu->items[i]; |
menu_item_id = p_menu->items[menu_item_pos]; |
| 1016 |
p_menu_item = get_menu_item_by_id(p_menu_set, menu_item_id); |
p_menu_item = get_menu_item_by_id(p_menu_set, menu_item_id); |
| 1017 |
if (p_menu_item == NULL) |
if (p_menu_item == NULL) |
| 1018 |
{ |
{ |
| 1020 |
return -1; |
return -1; |
| 1021 |
} |
} |
| 1022 |
|
|
| 1023 |
if (toupper(key) == toupper(p_menu_item->name[0]) && p_menu_item->display) |
if (toupper(key) == toupper(p_menu_item->name[0]) && p_menu_set->menu_item_display[menu_item_pos]) |
| 1024 |
{ |
{ |
| 1025 |
display_menu_cursor(p_menu_set, 0); |
display_menu_cursor(p_menu_set, 0); |
| 1026 |
p_menu_set->menu_item_pos[p_menu_set->choose_step] = i; |
p_menu_set->menu_item_pos[p_menu_set->choose_step] = menu_item_pos; |
| 1027 |
display_menu_cursor(p_menu_set, 1); |
display_menu_cursor(p_menu_set, 1); |
| 1028 |
return 0; |
return 0; |
| 1029 |
} |
} |
| 1063 |
int load_menu_shm(MENU_SET *p_menu_set) |
int load_menu_shm(MENU_SET *p_menu_set) |
| 1064 |
{ |
{ |
| 1065 |
// Mount shared memory |
// Mount shared memory |
| 1066 |
|
if (p_menu_set->p_reserved != NULL) |
| 1067 |
|
{ |
| 1068 |
|
log_error("Menu is already loaded\n"); |
| 1069 |
|
return -1; |
| 1070 |
|
} |
| 1071 |
|
|
| 1072 |
p_menu_set->p_reserved = shmat(p_menu_set->shmid, NULL, SHM_RDONLY); |
p_menu_set->p_reserved = shmat(p_menu_set->shmid, NULL, SHM_RDONLY); |
| 1073 |
if (p_menu_set->p_reserved == (void *)-1) |
if (p_menu_set->p_reserved == (void *)-1) |
| 1074 |
{ |
{ |
| 1075 |
log_error("shmat() error (%d)\n", errno); |
log_error("shmat() error (%d)\n", errno); |
| 1076 |
return -3; |
return -2; |
| 1077 |
} |
} |
| 1078 |
p_menu_set->p_menu_pool = p_menu_set->p_reserved + MENU_SET_RESERVED_LENGTH; |
p_menu_set->p_menu_pool = p_menu_set->p_reserved + MENU_SET_RESERVED_LENGTH; |
| 1079 |
p_menu_set->p_menu_item_pool = p_menu_set->p_menu_pool + sizeof(MENU) * MAX_MENUS; |
p_menu_set->p_menu_item_pool = p_menu_set->p_menu_pool + sizeof(MENU) * MAX_MENUS; |
| 1108 |
p_menu_set->p_menu_screen_buf = NULL; |
p_menu_set->p_menu_screen_buf = NULL; |
| 1109 |
p_menu_set->p_menu_screen_buf_free = NULL; |
p_menu_set->p_menu_screen_buf_free = NULL; |
| 1110 |
|
|
| 1111 |
if (shmdt(p_menu_set->p_reserved) == -1) |
if (p_menu_set->p_reserved != NULL && shmdt(p_menu_set->p_reserved) == -1) |
| 1112 |
{ |
{ |
| 1113 |
log_error("shmdt() error (%d)\n", errno); |
log_error("shmdt() error (%d)\n", errno); |
| 1114 |
return -1; |
return -1; |
| 1115 |
} |
} |
|
|
|
| 1116 |
p_menu_set->p_reserved = NULL; |
p_menu_set->p_reserved = NULL; |
| 1117 |
|
|
| 1118 |
return 0; |
return 0; |