Changeset c9927c66 in mainline for uspace/lib/ui/src/window.c


Ignore:
Timestamp:
2021-06-10T13:22:33Z (4 years ago)
Author:
jxsvoboda <5887334+jxsvoboda@…>
Branches:
master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
9e84d2c
Parents:
c68c18b9
git-author:
Jiri Svoboda <jiri@…> (2021-05-27 17:00:30)
git-committer:
jxsvoboda <5887334+jxsvoboda@…> (2021-06-10 13:22:33)
Message:

Set menu popup position based on parent window position

Added a method for getting the position of a display window.
This is then combined with the menu bar entry rectangle (which is
relative to the parent window) to compute a screen-relative
rectangle close to which the popup should be placed.

File:
1 edited

Legend:

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

    rc68c18b9 rc9927c66  
    109109}
    110110
     111static errno_t ui_window_place(ui_window_t *window, display_t *display,
     112    display_info_t *info, ui_wnd_params_t *params)
     113{
     114        gfx_coord2_t pos;
     115        errno_t rc;
     116
     117        assert(params->placement != ui_wnd_place_default);
     118
     119        pos.x = 0;
     120        pos.y = 0;
     121        switch (params->placement) {
     122        case ui_wnd_place_default:
     123                assert(false);
     124        case ui_wnd_place_top_left:
     125        case ui_wnd_place_full_screen:
     126                pos.x = info->rect.p0.x - params->rect.p0.x;
     127                pos.y = info->rect.p0.y - params->rect.p0.y;
     128                break;
     129        case ui_wnd_place_top_right:
     130                pos.x = info->rect.p1.x - params->rect.p1.x;
     131                pos.y = info->rect.p0.y - params->rect.p0.y;
     132                break;
     133        case ui_wnd_place_bottom_left:
     134                pos.x = info->rect.p0.x - params->rect.p0.x;
     135                pos.y = info->rect.p1.y - params->rect.p1.y;
     136                break;
     137        case ui_wnd_place_bottom_right:
     138                pos.x = info->rect.p1.x - params->rect.p1.x;
     139                pos.y = info->rect.p1.y - params->rect.p1.y;
     140                break;
     141        case ui_wnd_place_popup:
     142                /* Place popup window below parent rectangle */
     143                pos.x = params->prect.p0.x;
     144                pos.y = params->prect.p1.y;
     145                break;
     146        }
     147
     148        rc = display_window_move(window->dwindow, &pos);
     149        if (rc != EOK)
     150                goto error;
     151
     152        return EOK;
     153error:
     154        return rc;
     155}
     156
    111157/** Create new window.
    112158 *
     
    121167        ui_window_t *window;
    122168        display_info_t info;
    123         gfx_coord2_t pos;
    124169        gfx_coord2_t scr_dims;
    125170        display_wnd_params_t dparams;
    126         display_window_t *dwindow = NULL;
    127171        gfx_context_t *gc = NULL;
    128172        ui_resource_t *res = NULL;
     
    159203
    160204                rc = display_window_create(ui->display, &dparams, &dwnd_cb,
    161                     (void *) window, &dwindow);
     205                    (void *) window, &window->dwindow);
    162206                if (rc != EOK)
    163207                        goto error;
    164208
    165209                if (params->placement != ui_wnd_place_default) {
    166                         pos.x = 0;
    167                         pos.y = 0;
    168 
    169                         switch (params->placement) {
    170                         case ui_wnd_place_default:
    171                                 assert(false);
    172                         case ui_wnd_place_top_left:
    173                         case ui_wnd_place_full_screen:
    174                                 pos.x = info.rect.p0.x - params->rect.p0.x;
    175                                 pos.y = info.rect.p0.y - params->rect.p0.y;
    176                                 break;
    177                         case ui_wnd_place_top_right:
    178                                 pos.x = info.rect.p1.x - params->rect.p1.x;
    179                                 pos.y = info.rect.p0.y - params->rect.p0.y;
    180                                 break;
    181                         case ui_wnd_place_bottom_left:
    182                                 pos.x = info.rect.p0.x - params->rect.p0.x;
    183                                 pos.y = info.rect.p1.y - params->rect.p1.y;
    184                                 break;
    185                         case ui_wnd_place_bottom_right:
    186                                 pos.x = info.rect.p1.x - params->rect.p1.x;
    187                                 pos.y = info.rect.p1.y - params->rect.p1.y;
    188                                 break;
    189                         }
    190 
    191                         rc = display_window_move(dwindow, &pos);
     210                        rc = ui_window_place(window, ui->display, &info,
     211                            params);
    192212                        if (rc != EOK)
    193213                                goto error;
    194214                }
    195215
    196                 rc = display_window_get_gc(dwindow, &gc);
     216                rc = display_window_get_gc(window->dwindow, &gc);
    197217                if (rc != EOK)
    198218                        goto error;
     
    265285
    266286        window->ui = ui;
    267         window->dwindow = dwindow;
    268287        window->rect = dparams.rect;
    269288
     
    286305        if (dgc != NULL)
    287306                dummygc_destroy(dgc);
    288         if (dwindow != NULL)
    289                 display_window_destroy(dwindow);
    290307        free(window);
    291308        return rc;
     
    536553{
    537554        return window->gc;
     555}
     556
     557/** Get window position.
     558 *
     559 * @param window Window
     560 * @param pos Place to store position
     561 * @return EOK on success or an error code
     562 */
     563errno_t ui_window_get_pos(ui_window_t *window, gfx_coord2_t *pos)
     564{
     565        errno_t rc;
     566
     567        if (window->dwindow != NULL) {
     568                rc = display_window_get_pos(window->dwindow, pos);
     569                if (rc != EOK)
     570                        return rc;
     571        } else {
     572                pos->x = 0;
     573                pos->y = 0;
     574        }
     575
     576        return EOK;
    538577}
    539578
Note: See TracChangeset for help on using the changeset viewer.