Ignore:
File:
1 edited

Legend:

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

    r112f70a r5d380b6  
    3535
    3636#include <adt/list.h>
    37 #include <ctype.h>
    3837#include <errno.h>
    3938#include <gfx/color.h>
     
    4544#include <str.h>
    4645#include <uchar.h>
    47 #include <ui/ui.h>
    4846#include <ui/accel.h>
    4947#include <ui/control.h>
     
    5149#include <ui/popup.h>
    5250#include <ui/menu.h>
     51#include <ui/menubar.h>
    5352#include <ui/menuentry.h>
    5453#include <ui/resource.h>
    5554#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
    8180 * @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_window_t *parent, ui_menu_t **rmenu)
     85errno_t ui_menu_create(ui_menu_bar_t *mbar, const char *caption,
     86    ui_menu_t **rmenu)
    8687{
    8788        ui_menu_t *menu;
     
    9192                return ENOMEM;
    9293
    93         menu->parent = parent;
     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);
    94102        list_initialize(&menu->entries);
    95103
     
    116124        }
    117125
     126        list_remove(&menu->lmenus);
    118127        free(menu->caption);
    119128        free(menu);
    120129}
    121130
    122 /** Set menu callbacks.
    123  *
    124  * @param menu Menu
    125  * @param cb Callbacks
    126  * @param arg Callback argument
    127  */
    128 void ui_menu_set_cb(ui_menu_t *menu, ui_menu_cb_t *cb, void *arg)
    129 {
    130         menu->cb = cb;
    131         menu->arg = arg;
     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 */
     136ui_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 */
     152ui_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 */
     168ui_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 */
     184ui_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 */
     200const char *ui_menu_caption(ui_menu_t *menu)
     201{
     202        return menu->caption;
    132203}
    133204
     
    141212    ui_menu_geom_t *geom)
    142213{
     214        ui_resource_t *res;
    143215        gfx_coord2_t edim;
    144216        gfx_coord_t frame_w;
    145217        gfx_coord_t frame_h;
    146         ui_resource_t *res;
    147 
    148         res = ui_window_get_res(menu->parent);
     218
     219        res = ui_window_get_res(menu->mbar->window);
    149220
    150221        if (res->textmode) {
     
    170241}
    171242
     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 */
     249void 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 */
     263char32_t ui_menu_get_accel(ui_menu_t *menu)
     264{
     265        return ui_accel_get(menu->caption);
     266}
     267
    172268/** Get UI resource from menu.
    173269 *
     
    208304        params.idev_id = idev_id;
    209305
    210         rc = ui_popup_create(ui_window_get_ui(menu->parent), menu->parent,
    211             &params, &popup);
     306        rc = ui_popup_create(menu->mbar->ui, menu->mbar->window, &params,
     307            &popup);
    212308        if (rc != EOK)
    213309                return rc;
     
    407503                /* Press outside menu - close it */
    408504                if (event->type == POS_PRESS)
    409                         ui_menu_close_req(menu);
     505                        ui_menu_bar_deactivate(menu->mbar);
    410506        }
    411507
     
    428524        if (event->type == KEY_PRESS && (event->mods & KM_ALT) != 0 &&
    429525            (event->mods & (KM_CTRL | KM_SHIFT)) == 0 && event->c != '\0')
    430                 ui_menu_press_accel(menu, event->c, event->kbd_id);
     526                ui_menu_bar_press_accel(menu->mbar, event->c, event->kbd_id);
    431527
    432528        return ui_claimed;
     
    519615        switch (event->key) {
    520616        case KC_ESCAPE:
    521                 ui_menu_close_req(menu);
     617                ui_menu_bar_deactivate(menu->mbar);
    522618                break;
    523619        case KC_LEFT:
    524                 ui_menu_left(menu, event->kbd_id);
     620                ui_menu_bar_left(menu->mbar, event->kbd_id);
    525621                break;
    526622        case KC_RIGHT:
    527                 ui_menu_right(menu, event->kbd_id);
     623                ui_menu_bar_right(menu->mbar, event->kbd_id);
    528624                break;
    529625        case KC_UP:
     
    534630                break;
    535631        case KC_ENTER:
    536                 if (menu->selected != NULL &&
    537                     !ui_menu_entry_is_disabled(menu->selected))
     632                if (menu->selected != NULL)
    538633                        ui_menu_entry_activate(menu->selected);
    539634                break;
     
    543638                        while (mentry != NULL) {
    544639                                c = ui_menu_entry_get_accel(mentry);
    545                                 if (c == (char32_t)tolower(event->c) &&
    546                                     !ui_menu_entry_is_disabled(mentry)) {
     640                                if (c == event->c && menu->selected != NULL) {
    547641                                        ui_menu_entry_activate(mentry);
    548642                                        break;
     
    564658        ui_menu_t *menu = (ui_menu_t *)arg;
    565659
    566         /* Forward close request to caller */
    567         ui_menu_close_req(menu);
     660        /* Deactivate menu bar, close menu */
     661        ui_menu_bar_deactivate(menu->mbar);
    568662}
    569663
     
    597691}
    598692
    599 /** Send menu left event.
    600  *
    601  * @param menu Menu
    602  * @param idev_id Input device ID
    603  */
    604 void 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  */
    615 void 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  */
    625 void 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  */
    637 void 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 
    643693/** @}
    644694 */
Note: See TracChangeset for help on using the changeset viewer.