Ignore:
File:
1 edited

Legend:

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

    rb979ffb r8279aab  
    11/*
    2  * Copyright (c) 2026 Jiri Svoboda
     2 * Copyright (c) 2025 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    171171 * @param window Window
    172172 * @param drect Display rectangle
    173  * @param wrect Window rectangle
    174  * @param prect Parent rectangle for popup placement or @c NULL
    175  * @param placement Window placement
    176173 * @param params Window parameters
    177174 * @param pos Place to store position of top-left corner
    178175 */
    179176static void ui_window_place(ui_window_t *window, gfx_rect_t *drect,
    180     gfx_rect_t *wrect, gfx_rect_t *prect, ui_wnd_placement_t placement,
    181     gfx_coord2_t *pos)
     177    ui_wnd_params_t *params, gfx_coord2_t *pos)
    182178{
    183179        gfx_coord2_t dims;
     
    185181        gfx_rect_t below_rect;
    186182
    187         assert(placement != ui_wnd_place_default ||
     183        assert(params->placement != ui_wnd_place_default ||
    188184            ui_is_fullscreen(window->ui));
    189185
     
    191187        pos->y = 0;
    192188
    193         switch (placement) {
     189        switch (params->placement) {
    194190        case ui_wnd_place_default:
    195191        case ui_wnd_place_center:
    196                 assert(placement != ui_wnd_place_default ||
     192                assert(params->placement != ui_wnd_place_default ||
    197193                    ui_is_fullscreen(window->ui));
    198194                /* Center window */
    199                 gfx_rect_dims(wrect, &dims);
     195                gfx_rect_dims(&params->rect, &dims);
    200196                pos->x = (drect->p0.x + drect->p1.x) / 2 - dims.x / 2;
    201197                pos->y = (drect->p0.y + drect->p1.y) / 2 - dims.y / 2;
     
    203199        case ui_wnd_place_top_left:
    204200        case ui_wnd_place_full_screen:
    205                 pos->x = drect->p0.x - wrect->p0.x;
    206                 pos->y = drect->p0.y - wrect->p0.y;
     201                pos->x = drect->p0.x - params->rect.p0.x;
     202                pos->y = drect->p0.y - params->rect.p0.y;
    207203                break;
    208204        case ui_wnd_place_top_right:
    209                 pos->x = drect->p1.x - wrect->p1.x;
    210                 pos->y = drect->p0.y - wrect->p0.y;
     205                pos->x = drect->p1.x - params->rect.p1.x;
     206                pos->y = drect->p0.y - params->rect.p0.y;
    211207                break;
    212208        case ui_wnd_place_bottom_left:
    213                 pos->x = drect->p0.x - wrect->p0.x;
    214                 pos->y = drect->p1.y - wrect->p1.y;
     209                pos->x = drect->p0.x - params->rect.p0.x;
     210                pos->y = drect->p1.y - params->rect.p1.y;
    215211                break;
    216212        case ui_wnd_place_bottom_right:
    217                 pos->x = drect->p1.x - wrect->p1.x;
    218                 pos->y = drect->p1.y - wrect->p1.y;
     213                pos->x = drect->p1.x - params->rect.p1.x;
     214                pos->y = drect->p1.y - params->rect.p1.y;
    219215                break;
    220216        case ui_wnd_place_popup:
    221217                /* Compute rectangle when placed below */
    222                 below_pos.x = prect->p0.x;
    223                 below_pos.y = prect->p1.y;
    224                 gfx_rect_translate(&below_pos, wrect, &below_rect);
     218                below_pos.x = params->prect.p0.x;
     219                below_pos.y = params->prect.p1.y;
     220                gfx_rect_translate(&below_pos, &params->rect, &below_rect);
    225221
    226222                /* Does below_rect fit within the display? */
    227223                if (gfx_rect_is_inside(&below_rect, drect)) {
    228224                        /* Place popup window below parent rectangle */
    229                         pos->x = prect->p0.x - wrect->p0.x;
    230                         pos->y = prect->p1.y - wrect->p0.y;
     225                        pos->x = params->prect.p0.x - params->rect.p0.x;
     226                        pos->y = params->prect.p1.y - params->rect.p0.y;
    231227                } else {
    232228                        /* Place popup window above parent rectangle */
    233                         pos->x = prect->p0.x;
    234                         pos->y = prect->p0.y -
    235                             (wrect->p1.y - wrect->p0.y);
     229                        pos->x = params->prect.p0.x;
     230                        pos->y = params->prect.p0.y -
     231                            (params->rect.p1.y - params->rect.p0.y);
    236232                }
    237233                break;
    238234        }
    239 }
    240 
    241 static void ui_window_set_dpos(ui_window_t *window, gfx_coord2_t *dpos)
    242 {
    243         window->dpos = *dpos;
    244         if (window->xgc != NULL)
    245                 xlate_gc_set_off(window->xgc, &window->dpos);
    246235}
    247236
     
    345334        mem_gc_t *memgc = NULL;
    346335        xlate_gc_t *xgc = NULL;
    347         gfx_coord2_t dpos;
    348336        errno_t rc;
    349337
     
    396384                if (params->placement != ui_wnd_place_default) {
    397385                        /* Set initial display window position */
    398                         ui_window_place(window, &info.rect, &params->rect,
    399                             &params->prect, params->placement, &dparams.pos);
     386                        ui_window_place(window, &info.rect, params,
     387                            &dparams.pos);
    400388
    401389                        dparams.flags |= wndf_setpos;
     
    489477#endif
    490478        if (ui->display == NULL) {
    491                 ui_window_place(window, &ui->rect, &params->rect, &params->prect,
    492                     params->placement, &dpos);
    493                 ui_window_set_dpos(window, &dpos);
     479                ui_window_place(window, &ui->rect, params, &window->dpos);
     480
     481                if (window->xgc != NULL)
     482                        xlate_gc_set_off(window->xgc, &window->dpos);
    494483        }
    495484
     
    549538}
    550539
    551 /** Update window placement after screen resize (only in fullscreen UI).
    552  *
    553  * @param window UI window
    554  */
    555 void ui_window_update_placement(ui_window_t *window)
    556 {
    557         if (window->placement == ui_wnd_place_full_screen ||
    558             (window->flags & uiwf_maximized) != 0) {
    559                 /* Update size of fullscreen or maximized window. */
    560                 (void)ui_window_resize(window, &window->ui->rect);
    561                 ui_window_send_resize(window);
    562         }
    563 }
    564 
    565540/** Destroy window.
    566541 *
     
    597572        /* Need to repaint if windows are emulated */
    598573        if (ui_is_fullscreen(ui)) {
    599                 (void)ui_paint(ui);
     574                ui_paint(ui);
    600575                /* Send focus event to newly active window */
    601576                nwindow = ui_window_get_active(ui);
     
    640615        window->control = NULL;
    641616        control->elemp = NULL;
    642 }
    643 
    644 /** Get first (lowermost) window (only valid in fullscreen mode).
    645  *
    646  * @param ui User interface
    647  * @return First window
    648  */
    649 ui_window_t *ui_window_first(ui_t *ui)
    650 {
    651         link_t *link;
    652 
    653         link = list_first(&ui->windows);
    654         if (link == NULL)
    655                 return NULL;
    656 
    657         return list_get_instance(link, ui_window_t, lwindows);
    658 }
    659 
    660 /** Get next window (only valid in fullscreen mode).
    661  *
    662  * @param cur Current window
    663  * @return First window
    664  */
    665 ui_window_t *ui_window_next(ui_window_t *cur)
    666 {
    667         link_t *link;
    668 
    669         link = list_next(&cur->lwindows, &cur->ui->windows);
    670         if (link == NULL)
    671                 return NULL;
    672 
    673         return list_get_instance(link, ui_window_t, lwindows);
    674617}
    675618
     
    710653        gfx_bitmap_alloc_t app_alloc;
    711654        gfx_bitmap_alloc_t win_alloc;
    712         gfx_coord2_t dpos;
    713655        errno_t rc;
    714656
     
    786728                        break;
    787729                }
    788         } else {
    789                 /* fullscreen mode or unit tests */
    790                 switch (scop) {
    791                 case ui_wsc_resize:
    792                         break;
    793                 case ui_wsc_maximize:
    794                         window->normal_dpos = window->dpos;
    795                         dpos.x = 0;
    796                         dpos.y = 0;
    797                         ui_window_set_dpos(window, &dpos);
    798                         break;
    799                 case ui_wsc_unmaximize:
    800                         ui_window_set_dpos(window, &window->normal_dpos);
    801                         break;
    802                 }
    803730        }
    804731
     
    808735                /* Window is resized, now we can map the window bitmap again */
    809736                gfx_bitmap_params_init(&win_params);
    810                 if (window->ui->display != NULL)
    811                         win_params.flags |= bmpf_direct_output;
     737                win_params.flags |= bmpf_direct_output;
    812738                win_params.rect = nrect;
    813739
     
    838764                gfx_bitmap_destroy(window->app_bmp);
    839765                window->app_bmp = app_bmp;
    840         }
    841 
    842         switch (scop) {
    843         case ui_wsc_resize:
    844                 break;
    845         case ui_wsc_maximize:
    846                 window->flags |= uiwf_maximized;
    847                 break;
    848         case ui_wsc_unmaximize:
    849                 window->flags &= ~uiwf_maximized;
    850                 break;
    851766        }
    852767
     
    872787errno_t ui_window_resize(ui_window_t *window, gfx_rect_t *rect)
    873788{
    874         errno_t rc;
    875 
    876         rc = ui_window_size_change(window, rect, ui_wsc_resize);
    877         if (rc != EOK)
    878                 return rc;
    879 
    880         /* Need to repaint UI if windows are emulated */
    881         if (ui_is_fullscreen(window->ui))
    882                 (void)ui_paint(window->ui);
    883 
    884         return EOK;
     789        return ui_window_size_change(window, rect, ui_wsc_resize);
    885790}
    886791
     
    15841489
    15851490        window->normal_rect = old_rect;
    1586         ui_window_send_resize(window);
    1587 
    1588         /* Need to repaint UI if windows are emulated */
    1589         if (ui_is_fullscreen(window->ui))
    1590                 (void)ui_paint(window->ui);
    1591 
     1491        (void) ui_window_paint(window);
    15921492        return EOK;
    15931493}
     
    16141514        }
    16151515
    1616         ui_window_send_resize(window);
    1617 
    1618         /* Need to repaint UI if windows are emulated */
    1619         if (ui_is_fullscreen(window->ui))
    1620                 (void)ui_paint(window->ui);
    1621 
     1516        (void) ui_window_paint(window);
    16221517        return EOK;
    16231518}
Note: See TracChangeset for help on using the changeset viewer.