Ignore:
File:
1 edited

Legend:

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

    r1543d4c r5d380b6  
    3535
    3636#include <adt/list.h>
    37 #include <ctype.h>
    3837#include <errno.h>
    3938#include <gfx/color.h>
     
    4645#include <ui/control.h>
    4746#include <ui/paint.h>
     47#include <ui/menu.h>
    4848#include <ui/menubar.h>
    49 #include <ui/menudd.h>
    50 #include <ui/wdecor.h>
    5149#include <ui/window.h>
    5250#include "../private/menubar.h"
    5351#include "../private/resource.h"
    54 #include "../private/wdecor.h"
    55 #include "../private/window.h"
    5652
    5753enum {
     
    9995        mbar->ui = ui;
    10096        mbar->window = window;
    101         list_initialize(&mbar->menudds);
    102 
    103         if (window->mbar == NULL)
    104                 window->mbar = mbar;
    105 
     97        list_initialize(&mbar->menus);
    10698        *rmbar = mbar;
    10799        return EOK;
     
    114106void ui_menu_bar_destroy(ui_menu_bar_t *mbar)
    115107{
    116         ui_menu_dd_t *mdd;
     108        ui_menu_t *menu;
    117109
    118110        if (mbar == NULL)
    119111                return;
    120112
    121         if (mbar->window->mbar == mbar)
    122                 mbar->window->mbar = NULL;
    123 
    124         /* Destroy menu drop-downs */
    125         mdd = ui_menu_dd_first(mbar);
    126         while (mdd != NULL) {
    127                 ui_menu_dd_destroy(mdd);
    128                 mdd = ui_menu_dd_first(mbar);
     113        /* Destroy menus */
     114        menu = ui_menu_first(mbar);
     115        while (menu != NULL) {
     116                ui_menu_destroy(menu);
     117                menu = ui_menu_first(mbar);
    129118        }
    130119
     
    166155        gfx_rect_t rect;
    167156        gfx_color_t *bg_color;
    168         ui_menu_dd_t *mdd;
     157        ui_menu_t *menu;
    169158        const char *caption;
    170159        gfx_coord_t width;
     
    200189        fmt.valign = gfx_valign_top;
    201190
    202         mdd = ui_menu_dd_first(mbar);
    203         while (mdd != NULL) {
    204                 caption = ui_menu_dd_caption(mdd);
     191        menu = ui_menu_first(mbar);
     192        while (menu != NULL) {
     193                caption = ui_menu_caption(menu);
    205194                width = ui_text_width(res->font, caption) + 2 * hpad;
    206195                tpos.x = pos.x + hpad;
     
    211200                rect.p1.y = mbar->rect.p1.y;
    212201
    213                 if (mdd == mbar->selected) {
     202                if (menu == mbar->selected) {
    214203                        fmt.color = res->wnd_sel_text_color;
    215204                        fmt.hgl_color = res->wnd_sel_text_hgl_color;
     
    234223
    235224                pos.x += width;
    236                 mdd = ui_menu_dd_next(mdd);
     225                menu = ui_menu_next(menu);
    237226        }
    238227
     
    252241 *
    253242 * @param mbar Menu bar
    254  * @param mdd Menu drop-down to select (or deselect if selected) or @c NULL
     243 * @param menu Menu to select (or deselect if selected) or @c NULL
    255244 * @param openup Open menu even if not currently open
    256245 * @param idev_id Input device ID associated with the selecting seat
    257246 */
    258 void ui_menu_bar_select(ui_menu_bar_t *mbar, ui_menu_dd_t *mdd, bool openup,
     247void ui_menu_bar_select(ui_menu_bar_t *mbar, ui_menu_t *menu, bool openup,
    259248    sysarg_t idev_id)
    260249{
    261         ui_menu_dd_t *old_mdd;
     250        ui_menu_t *old_menu;
    262251        gfx_rect_t rect;
    263252        bool was_open;
    264253
    265         old_mdd = mbar->selected;
    266 
    267         mbar->selected = mdd;
    268 
    269         /* Close previously open menu drop-down */
    270         if (old_mdd != NULL && ui_menu_dd_is_open(old_mdd)) {
     254        old_menu = mbar->selected;
     255
     256        mbar->selected = menu;
     257
     258        /* Close previously open menu */
     259        if (old_menu != NULL && ui_menu_is_open(old_menu)) {
    271260                was_open = true;
    272                 (void) ui_menu_dd_close(old_mdd);
     261                (void) ui_menu_close(old_menu);
    273262        } else {
    274263                was_open = false;
     
    281270                if (openup || was_open) {
    282271                        /*
    283                          * Open the newly selected menu drop-down if either
    284                          * the old menu drop-down was open or @a openup was
     272                         * Open the newly selected menu if either
     273                         * the old menu was open or @a openup was
    285274                         * specified.
    286275                         */
    287                         (void) ui_menu_dd_open(mbar->selected, &rect, idev_id);
     276                        (void) ui_menu_open(mbar->selected, &rect, idev_id);
    288277                }
    289 
    290                 mbar->active = true;
    291         } else {
    292                 mbar->active = false;
    293         }
    294 }
    295 
    296 /** Select first drop-down.
    297  *
    298  * @param mbar Menu bar
    299  * @param openup @c true to open drop-down if it was not open
    300  * @param idev_id Input device ID
    301  */
    302 void ui_menu_bar_select_first(ui_menu_bar_t *mbar, bool openup,
    303     sysarg_t idev_id)
    304 {
    305         ui_menu_dd_t *mdd;
    306 
    307         mdd = ui_menu_dd_first(mbar);
    308         ui_menu_bar_select(mbar, mdd, openup, idev_id);
    309 }
    310 
    311 /** Select last drop-down.
    312  *
    313  * @param mbar Menu bar
    314  * @param openup @c true to open drop-down if it was not open
    315  * @param idev_id Input device ID
    316  */
    317 void ui_menu_bar_select_last(ui_menu_bar_t *mbar, bool openup,
    318     sysarg_t idev_id)
    319 {
    320         ui_menu_dd_t *mdd;
    321 
    322         mdd = ui_menu_dd_last(mbar);
    323         ui_menu_bar_select(mbar, mdd, openup, idev_id);
    324 }
    325 
    326 /** Select system menu.
    327  *
    328  * @param mbar Menu bar
    329  * @param openup @c true to open drop-down if it was not open
    330  * @param idev_id Input device ID
    331  */
    332 void ui_menu_bar_select_sysmenu(ui_menu_bar_t *mbar, bool openup,
    333     sysarg_t idev_id)
    334 {
    335         ui_wdecor_sysmenu_hdl_set_active(mbar->window->wdecor, true);
    336 
    337         if (openup)
    338                 ui_window_send_sysmenu(mbar->window, idev_id);
     278        }
    339279}
    340280
     
    349289void ui_menu_bar_left(ui_menu_bar_t *mbar, sysarg_t idev_id)
    350290{
    351         ui_menu_dd_t *nmdd;
    352         bool sel_sysmenu = false;
    353         bool was_open;
     291        ui_menu_t *nmenu;
    354292
    355293        if (mbar->selected == NULL)
    356294                return;
    357295
    358         nmdd = ui_menu_dd_prev(mbar->selected);
    359         if (nmdd == NULL) {
    360                 if ((mbar->window->wdecor->style & ui_wds_sysmenu_hdl) != 0) {
    361                         sel_sysmenu = true;
    362                 } else {
    363                         nmdd = ui_menu_dd_last(mbar);
    364                 }
    365         }
    366 
    367         was_open = mbar->selected != NULL &&
    368             ui_menu_dd_is_open(mbar->selected);
    369 
    370         if (nmdd != mbar->selected)
    371                 ui_menu_bar_select(mbar, nmdd, false, idev_id);
    372 
    373         /*
    374          * Only open sysmenu *after* closing the previous menu, avoid
    375          * having multiple popup windows at the same time.
    376          */
    377         if (sel_sysmenu)
    378                 ui_menu_bar_select_sysmenu(mbar, was_open, idev_id);
     296        nmenu = ui_menu_prev(mbar->selected);
     297        if (nmenu == NULL)
     298                nmenu = ui_menu_last(mbar);
     299
     300        if (nmenu != mbar->selected)
     301                ui_menu_bar_select(mbar, nmenu, false, idev_id);
    379302}
    380303
     
    389312void ui_menu_bar_right(ui_menu_bar_t *mbar, sysarg_t idev_id)
    390313{
    391         ui_menu_dd_t *nmdd;
    392         bool sel_sysmenu = false;
    393         bool was_open;
     314        ui_menu_t *nmenu;
    394315
    395316        if (mbar->selected == NULL)
    396317                return;
    397318
    398         nmdd = ui_menu_dd_next(mbar->selected);
    399         if (nmdd == NULL) {
    400                 if ((mbar->window->wdecor->style & ui_wds_sysmenu_hdl) != 0) {
    401                         sel_sysmenu = true;
    402                 } else {
    403                         nmdd = ui_menu_dd_first(mbar);
    404                 }
    405         }
    406 
    407         was_open = mbar->selected != NULL &&
    408             ui_menu_dd_is_open(mbar->selected);
    409 
    410         if (nmdd != mbar->selected)
    411                 ui_menu_bar_select(mbar, nmdd, false, idev_id);
    412 
    413         /*
    414          * Only open sysmenu *after* closing the previous menu, avoid
    415          * having multiple popup windows at the same time.
    416          */
    417         if (sel_sysmenu)
    418                 ui_menu_bar_select_sysmenu(mbar, was_open, idev_id);
     319        nmenu = ui_menu_next(mbar->selected);
     320        if (nmenu == NULL)
     321                nmenu = ui_menu_first(mbar);
     322
     323        if (nmenu != mbar->selected)
     324                ui_menu_bar_select(mbar, nmenu, false, idev_id);
    419325}
    420326
     
    449355
    450356        if (event->key == KC_ENTER || event->key == KC_DOWN) {
    451                 if (mbar->selected != NULL &&
    452                     !ui_menu_dd_is_open(mbar->selected)) {
     357                if (mbar->selected != NULL && !ui_menu_is_open(mbar->selected)) {
    453358                        ui_menu_bar_entry_rect(mbar, mbar->selected,
    454359                            &rect);
    455                         ui_menu_dd_open(mbar->selected, &rect, event->kbd_id);
     360                        ui_menu_open(mbar->selected, &rect, event->kbd_id);
    456361                }
    457362
     
    459364        }
    460365
    461         if (event->c != '\0' && !ui_menu_dd_is_open(mbar->selected)) {
     366        if (event->c != '\0' && !ui_menu_is_open(mbar->selected)) {
    462367                /* Check if it is an accelerator. */
    463368                ui_menu_bar_press_accel(mbar, event->c, event->kbd_id);
     
    502407void ui_menu_bar_press_accel(ui_menu_bar_t *mbar, char32_t c, sysarg_t kbd_id)
    503408{
    504         ui_menu_dd_t *mdd;
     409        ui_menu_t *menu;
    505410        char32_t maccel;
    506411
    507         mdd = ui_menu_dd_first(mbar);
    508         while (mdd != NULL) {
    509                 maccel = ui_menu_dd_get_accel(mdd);
    510                 if ((char32_t)tolower(c) == maccel) {
    511                         ui_menu_bar_select(mbar, mdd, true, kbd_id);
     412        menu = ui_menu_first(mbar);
     413        while (menu != NULL) {
     414                maccel = ui_menu_get_accel(menu);
     415                if (c == maccel) {
     416                        ui_menu_bar_select(mbar, menu, true, kbd_id);
    512417                        return;
    513418                }
    514419
    515                 mdd = ui_menu_dd_next(mdd);
     420                menu = ui_menu_next(menu);
    516421        }
    517422}
     
    528433        gfx_coord2_t pos;
    529434        gfx_rect_t rect;
    530         ui_menu_dd_t *mdd;
     435        ui_menu_t *menu;
    531436        const char *caption;
    532437        gfx_coord_t width;
     
    549454        pos_id = event->pos_id;
    550455
    551         mdd = ui_menu_dd_first(mbar);
    552         while (mdd != NULL) {
    553                 caption = ui_menu_dd_caption(mdd);
     456        menu = ui_menu_first(mbar);
     457        while (menu != NULL) {
     458                caption = ui_menu_caption(menu);
    554459                width = ui_text_width(res->font, caption) + 2 * hpad;
    555460
     
    563468                        mbar->active = true;
    564469
    565                         /* Open the menu, if not already open. */
    566                         if (mdd != mbar->selected)
    567                                 ui_menu_bar_select(mbar, mdd, true, pos_id);
     470                        /* Open the menu, close if already open. */
     471                        if (menu == mbar->selected)
     472                                ui_menu_bar_select(mbar, NULL, false, pos_id);
     473                        else
     474                                ui_menu_bar_select(mbar, menu, true, pos_id);
    568475
    569476                        return ui_claimed;
     
    571478
    572479                pos.x += width;
    573                 mdd = ui_menu_dd_next(mdd);
     480                menu = ui_menu_next(menu);
    574481        }
    575482
     
    580487 *
    581488 * @param mbar Menu bar
    582  * @param mdd Menu drop-down whose entry's rectangle is to be returned
     489 * @param menu Menu whose entry's rectangle is to be returned
    583490 * @param rrect Place to store entry rectangle
    584491 */
    585 void ui_menu_bar_entry_rect(ui_menu_bar_t *mbar, ui_menu_dd_t *mdd,
     492void ui_menu_bar_entry_rect(ui_menu_bar_t *mbar, ui_menu_t *menu,
    586493    gfx_rect_t *rrect)
    587494{
     
    589496        gfx_coord2_t pos;
    590497        gfx_rect_t rect;
    591         ui_menu_dd_t *cur;
     498        ui_menu_t *cur;
    592499        const char *caption;
    593500        gfx_coord_t width;
     
    604511        pos = mbar->rect.p0;
    605512
    606         cur = ui_menu_dd_first(mbar);
     513        cur = ui_menu_first(mbar);
    607514        while (cur != NULL) {
    608                 caption = ui_menu_dd_caption(cur);
     515                caption = ui_menu_caption(cur);
    609516                width = ui_text_width(res->font, caption) + 2 * hpad;
    610517
     
    613520                rect.p1.y = mbar->rect.p1.y;
    614521
    615                 if (cur == mdd) {
     522                if (cur == menu) {
    616523                        *rrect = rect;
    617524                        return;
     
    619526
    620527                pos.x += width;
    621                 cur = ui_menu_dd_next(cur);
     528                cur = ui_menu_next(cur);
    622529        }
    623530
     
    637544        mbar->active = true;
    638545        if (mbar->selected == NULL)
    639                 mbar->selected = ui_menu_dd_first(mbar);
     546                mbar->selected = ui_menu_first(mbar);
    640547
    641548        (void) ui_menu_bar_paint(mbar);
    642549}
    643550
    644 /** Deactivate menu bar.
    645  *
    646  * @param mbar Menu bar
    647  */
    648551void ui_menu_bar_deactivate(ui_menu_bar_t *mbar)
    649552{
    650553        ui_menu_bar_select(mbar, NULL, false, 0);
     554        mbar->active = false;
    651555}
    652556
Note: See TracChangeset for help on using the changeset viewer.