Changeset 1c6c3e1d in mainline for uspace/lib/ui/src/menu.c


Ignore:
Timestamp:
2023-10-22T17:55:33Z (17 months ago)
Author:
Jiří Zárevúcky <zarevucky.jiri@…>
Branches:
ticket/834-toolchain-update
Children:
350ec74
Parents:
315d487 (diff), 133461c (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge branch 'master' into ticket

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/ui/src/menu.c

    r315d487 r1c6c3e1d  
    3535
    3636#include <adt/list.h>
     37#include <ctype.h>
    3738#include <errno.h>
    3839#include <gfx/color.h>
     
    4445#include <str.h>
    4546#include <uchar.h>
     47#include <ui/ui.h>
    4648#include <ui/accel.h>
    4749#include <ui/control.h>
     
    4951#include <ui/popup.h>
    5052#include <ui/menu.h>
    51 #include <ui/menubar.h>
    5253#include <ui/menuentry.h>
    5354#include <ui/resource.h>
    5455#include <ui/window.h>
    55 #include "../private/menubar.h"
    5656#include "../private/menu.h"
    5757#include "../private/resource.h"
     
    7878/** Create new menu.
    7979 *
     80 * @param parent Parent window
    8081 * @param mbar Menu bar
    81  * @param caption Caption
    8282 * @param rmenu Place to store pointer to new menu
    8383 * @return EOK on success, ENOMEM if out of memory
    8484 */
    85 errno_t ui_menu_create(ui_menu_bar_t *mbar, const char *caption,
    86     ui_menu_t **rmenu)
     85errno_t ui_menu_create(ui_window_t *parent, ui_menu_t **rmenu)
    8786{
    8887        ui_menu_t *menu;
     
    9291                return ENOMEM;
    9392
    94         menu->caption = str_dup(caption);
    95         if (menu->caption == NULL) {
    96                 free(menu);
    97                 return ENOMEM;
    98         }
    99 
    100         menu->mbar = mbar;
    101         list_append(&menu->lmenus, &mbar->menus);
     93        menu->parent = parent;
    10294        list_initialize(&menu->entries);
    10395
     
    124116        }
    125117
    126         list_remove(&menu->lmenus);
    127118        free(menu->caption);
    128119        free(menu);
    129120}
    130121
    131 /** Get first menu in menu bar.
    132  *
    133  * @param mbar Menu bar
    134  * @return First menu or @c NULL if there is none
    135  */
    136 ui_menu_t *ui_menu_first(ui_menu_bar_t *mbar)
    137 {
    138         link_t *link;
    139 
    140         link = list_first(&mbar->menus);
    141         if (link == NULL)
    142                 return NULL;
    143 
    144         return list_get_instance(link, ui_menu_t, lmenus);
    145 }
    146 
    147 /** Get next menu in menu bar.
    148  *
    149  * @param cur Current menu
    150  * @return Next menu or @c NULL if @a cur is the last one
    151  */
    152 ui_menu_t *ui_menu_next(ui_menu_t *cur)
    153 {
    154         link_t *link;
    155 
    156         link = list_next(&cur->lmenus, &cur->mbar->menus);
    157         if (link == NULL)
    158                 return NULL;
    159 
    160         return list_get_instance(link, ui_menu_t, lmenus);
    161 }
    162 
    163 /** Get last menu in menu bar.
    164  *
    165  * @param mbar Menu bar
    166  * @return Last menu or @c NULL if there is none
    167  */
    168 ui_menu_t *ui_menu_last(ui_menu_bar_t *mbar)
    169 {
    170         link_t *link;
    171 
    172         link = list_last(&mbar->menus);
    173         if (link == NULL)
    174                 return NULL;
    175 
    176         return list_get_instance(link, ui_menu_t, lmenus);
    177 }
    178 
    179 /** Get previous menu in menu bar.
    180  *
    181  * @param cur Current menu
    182  * @return Previous menu or @c NULL if @a cur is the fist one
    183  */
    184 ui_menu_t *ui_menu_prev(ui_menu_t *cur)
    185 {
    186         link_t *link;
    187 
    188         link = list_prev(&cur->lmenus, &cur->mbar->menus);
    189         if (link == NULL)
    190                 return NULL;
    191 
    192         return list_get_instance(link, ui_menu_t, lmenus);
    193 }
    194 
    195 /** Get menu caption.
    196  *
    197  * @param menu Menu
    198  * @return Caption (owned by @a menu)
    199  */
    200 const char *ui_menu_caption(ui_menu_t *menu)
    201 {
    202         return menu->caption;
     122/** Set menu callbacks.
     123 *
     124 * @param menu Menu
     125 * @param cb Callbacks
     126 * @param arg Callback argument
     127 */
     128void ui_menu_set_cb(ui_menu_t *menu, ui_menu_cb_t *cb, void *arg)
     129{
     130        menu->cb = cb;
     131        menu->arg = arg;
    203132}
    204133
     
    212141    ui_menu_geom_t *geom)
    213142{
    214         ui_resource_t *res;
    215143        gfx_coord2_t edim;
    216144        gfx_coord_t frame_w;
    217145        gfx_coord_t frame_h;
    218 
    219         res = ui_window_get_res(menu->mbar->window);
     146        ui_resource_t *res;
     147
     148        res = ui_window_get_res(menu->parent);
    220149
    221150        if (res->textmode) {
     
    241170}
    242171
    243 /** Get menu rectangle.
    244  *
    245  * @param menu Menu
    246  * @param spos Starting position (top-left corner)
    247  * @param rect Place to store menu rectangle
    248  */
    249 void ui_menu_get_rect(ui_menu_t *menu, gfx_coord2_t *spos, gfx_rect_t *rect)
    250 {
    251         ui_menu_geom_t geom;
    252 
    253         ui_menu_get_geom(menu, spos, &geom);
    254         *rect = geom.outer_rect;
    255 }
    256 
    257 /** Get menu accelerator character.
    258  *
    259  * @param menu Menu
    260  * @return Accelerator character (lowercase) or the null character if
    261  *         the menu has no accelerator.
    262  */
    263 char32_t ui_menu_get_accel(ui_menu_t *menu)
    264 {
    265         return ui_accel_get(menu->caption);
    266 }
    267 
    268172/** Get UI resource from menu.
    269173 *
     
    304208        params.idev_id = idev_id;
    305209
    306         rc = ui_popup_create(menu->mbar->ui, menu->mbar->window, &params,
    307             &popup);
     210        rc = ui_popup_create(ui_window_get_ui(menu->parent), menu->parent,
     211            &params, &popup);
    308212        if (rc != EOK)
    309213                return rc;
     
    503407                /* Press outside menu - close it */
    504408                if (event->type == POS_PRESS)
    505                         ui_menu_bar_deactivate(menu->mbar);
     409                        ui_menu_close_req(menu);
    506410        }
    507411
     
    524428        if (event->type == KEY_PRESS && (event->mods & KM_ALT) != 0 &&
    525429            (event->mods & (KM_CTRL | KM_SHIFT)) == 0 && event->c != '\0')
    526                 ui_menu_bar_press_accel(menu->mbar, event->c, event->kbd_id);
     430                ui_menu_press_accel(menu, event->c, event->kbd_id);
    527431
    528432        return ui_claimed;
     
    615519        switch (event->key) {
    616520        case KC_ESCAPE:
    617                 ui_menu_bar_deactivate(menu->mbar);
     521                ui_menu_close_req(menu);
    618522                break;
    619523        case KC_LEFT:
    620                 ui_menu_bar_left(menu->mbar, event->kbd_id);
     524                ui_menu_left(menu, event->kbd_id);
    621525                break;
    622526        case KC_RIGHT:
    623                 ui_menu_bar_right(menu->mbar, event->kbd_id);
     527                ui_menu_right(menu, event->kbd_id);
    624528                break;
    625529        case KC_UP:
     
    630534                break;
    631535        case KC_ENTER:
    632                 if (menu->selected != NULL)
     536                if (menu->selected != NULL &&
     537                    !ui_menu_entry_is_disabled(menu->selected))
    633538                        ui_menu_entry_activate(menu->selected);
    634539                break;
     
    638543                        while (mentry != NULL) {
    639544                                c = ui_menu_entry_get_accel(mentry);
    640                                 if (c == event->c && menu->selected != NULL) {
     545                                if (c == (char32_t)tolower(event->c) &&
     546                                    !ui_menu_entry_is_disabled(mentry)) {
    641547                                        ui_menu_entry_activate(mentry);
    642548                                        break;
     
    658564        ui_menu_t *menu = (ui_menu_t *)arg;
    659565
    660         /* Deactivate menu bar, close menu */
    661         ui_menu_bar_deactivate(menu->mbar);
     566        /* Forward close request to caller */
     567        ui_menu_close_req(menu);
    662568}
    663569
     
    691597}
    692598
     599/** Send menu left event.
     600 *
     601 * @param menu Menu
     602 * @param idev_id Input device ID
     603 */
     604void ui_menu_left(ui_menu_t *menu, sysarg_t idev_id)
     605{
     606        if (menu->cb != NULL && menu->cb->left != NULL)
     607                menu->cb->left(menu, menu->arg, idev_id);
     608}
     609
     610/** Send menu right event.
     611 *
     612 * @param menu Menu
     613 * @param idev_id Input device ID
     614 */
     615void ui_menu_right(ui_menu_t *menu, sysarg_t idev_id)
     616{
     617        if (menu->cb != NULL && menu->cb->right != NULL)
     618                menu->cb->right(menu, menu->arg, idev_id);
     619}
     620
     621/** Send menu close request event.
     622 *
     623 * @param menu Menu
     624 */
     625void ui_menu_close_req(ui_menu_t *menu)
     626{
     627        if (menu->cb != NULL && menu->cb->close_req != NULL)
     628                menu->cb->close_req(menu, menu->arg);
     629}
     630
     631/** Send menu accelerator key press event.
     632 *
     633 * @param menu Menu
     634 * @param c Character
     635 * @param kbd_id Keyboard ID
     636 */
     637void ui_menu_press_accel(ui_menu_t *menu, char32_t c, sysarg_t kbd_id)
     638{
     639        if (menu->cb != NULL && menu->cb->press_accel != NULL)
     640                menu->cb->press_accel(menu, menu->arg, c, kbd_id);
     641}
     642
    693643/** @}
    694644 */
Note: See TracChangeset for help on using the changeset viewer.