Changeset 26edcd6 in mainline


Ignore:
Timestamp:
2026-02-18T16:29:36Z (42 hours ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
master
Children:
39f67f1
Parents:
2c12135
git-author:
Jiri Svoboda <jiri@…> (2026-02-18 18:29:31)
git-committer:
Jiri Svoboda <jiri@…> (2026-02-18 16:29:36)
Message:

Reposition windows with placement other than fullscreen.

Except popup windows, we cannot automatically fix those.

Location:
uspace/lib/ui
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/ui/private/window.h

    r2c12135 r26edcd6  
    11/*
    2  * Copyright (c) 2025 Jiri Svoboda
     2 * Copyright (c) 2026 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    136136extern errno_t ui_window_size_change(ui_window_t *, gfx_rect_t *,
    137137    ui_wnd_sc_op_t);
     138extern void ui_window_update_placement(ui_window_t *);
    138139extern ui_window_t *ui_window_get_active(ui_t *);
    139140extern ui_window_t *ui_window_first(ui_t *);
  • uspace/lib/ui/src/ui.c

    r2c12135 r26edcd6  
    337337        ui->rect = *rect;
    338338
    339         /* Resize all fullscreen windows */
     339        /* Reposition/resize windows */
    340340        wnd = ui_window_first(ui);
    341341        while (wnd != NULL) {
    342                 if (wnd->placement == ui_wnd_place_full_screen) {
    343                         (void)ui_window_resize(wnd, rect);
    344                         ui_window_send_resize(wnd);
    345                 }
    346 
     342                ui_window_update_placement(wnd);
    347343                wnd = ui_window_next(wnd);
    348344        }
    349345
     346        /*
     347         * XXX Resizing cleared console GC so we need to repaint the
     348         * background.
     349         */
    350350        (void)ui_paint(ui);
    351351}
  • uspace/lib/ui/src/window.c

    r2c12135 r26edcd6  
    11/*
    2  * Copyright (c) 2025 Jiri Svoboda
     2 * Copyright (c) 2026 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
    173176 * @param params Window parameters
    174177 * @param pos Place to store position of top-left corner
    175178 */
    176179static void ui_window_place(ui_window_t *window, gfx_rect_t *drect,
    177     ui_wnd_params_t *params, gfx_coord2_t *pos)
     180    gfx_rect_t *wrect, gfx_rect_t *prect, ui_wnd_placement_t placement,
     181    gfx_coord2_t *pos)
    178182{
    179183        gfx_coord2_t dims;
     
    181185        gfx_rect_t below_rect;
    182186
    183         assert(params->placement != ui_wnd_place_default ||
     187        assert(placement != ui_wnd_place_default ||
    184188            ui_is_fullscreen(window->ui));
    185189
     
    187191        pos->y = 0;
    188192
    189         switch (params->placement) {
     193        switch (placement) {
    190194        case ui_wnd_place_default:
    191195        case ui_wnd_place_center:
    192                 assert(params->placement != ui_wnd_place_default ||
     196                assert(placement != ui_wnd_place_default ||
    193197                    ui_is_fullscreen(window->ui));
    194198                /* Center window */
    195                 gfx_rect_dims(&params->rect, &dims);
     199                gfx_rect_dims(wrect, &dims);
    196200                pos->x = (drect->p0.x + drect->p1.x) / 2 - dims.x / 2;
    197201                pos->y = (drect->p0.y + drect->p1.y) / 2 - dims.y / 2;
     
    199203        case ui_wnd_place_top_left:
    200204        case ui_wnd_place_full_screen:
    201                 pos->x = drect->p0.x - params->rect.p0.x;
    202                 pos->y = drect->p0.y - params->rect.p0.y;
     205                pos->x = drect->p0.x - wrect->p0.x;
     206                pos->y = drect->p0.y - wrect->p0.y;
    203207                break;
    204208        case ui_wnd_place_top_right:
    205                 pos->x = drect->p1.x - params->rect.p1.x;
    206                 pos->y = drect->p0.y - params->rect.p0.y;
     209                pos->x = drect->p1.x - wrect->p1.x;
     210                pos->y = drect->p0.y - wrect->p0.y;
    207211                break;
    208212        case ui_wnd_place_bottom_left:
    209                 pos->x = drect->p0.x - params->rect.p0.x;
    210                 pos->y = drect->p1.y - params->rect.p1.y;
     213                pos->x = drect->p0.x - wrect->p0.x;
     214                pos->y = drect->p1.y - wrect->p1.y;
    211215                break;
    212216        case ui_wnd_place_bottom_right:
    213                 pos->x = drect->p1.x - params->rect.p1.x;
    214                 pos->y = drect->p1.y - params->rect.p1.y;
     217                pos->x = drect->p1.x - wrect->p1.x;
     218                pos->y = drect->p1.y - wrect->p1.y;
    215219                break;
    216220        case ui_wnd_place_popup:
    217221                /* Compute rectangle when placed below */
    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);
     222                below_pos.x = prect->p0.x;
     223                below_pos.y = prect->p1.y;
     224                gfx_rect_translate(&below_pos, wrect, &below_rect);
    221225
    222226                /* Does below_rect fit within the display? */
    223227                if (gfx_rect_is_inside(&below_rect, drect)) {
    224228                        /* Place popup window below parent rectangle */
    225                         pos->x = params->prect.p0.x - params->rect.p0.x;
    226                         pos->y = params->prect.p1.y - params->rect.p0.y;
     229                        pos->x = prect->p0.x - wrect->p0.x;
     230                        pos->y = prect->p1.y - wrect->p0.y;
    227231                } else {
    228232                        /* Place popup window above parent rectangle */
    229                         pos->x = params->prect.p0.x;
    230                         pos->y = params->prect.p0.y -
    231                             (params->rect.p1.y - params->rect.p0.y);
     233                        pos->x = prect->p0.x;
     234                        pos->y = prect->p0.y -
     235                            (wrect->p1.y - wrect->p0.y);
    232236                }
    233237                break;
     
    384388                if (params->placement != ui_wnd_place_default) {
    385389                        /* Set initial display window position */
    386                         ui_window_place(window, &info.rect, params,
    387                             &dparams.pos);
     390                        ui_window_place(window, &info.rect, &params->rect,
     391                            &params->prect, params->placement, &dparams.pos);
    388392
    389393                        dparams.flags |= wndf_setpos;
     
    477481#endif
    478482        if (ui->display == NULL) {
    479                 ui_window_place(window, &ui->rect, params, &window->dpos);
     483                ui_window_place(window, &ui->rect, &params->rect, &params->prect,
     484                    params->placement, &window->dpos);
    480485
    481486                if (window->xgc != NULL)
     
    536541        free(window);
    537542        return rc;
     543}
     544
     545/** Update window placement after screen resize (only in fullscreen UI).
     546 *
     547 * @param window UI window
     548 */
     549void ui_window_update_placement(ui_window_t *window)
     550{
     551        if (window->placement != ui_wnd_place_popup)
     552                ui_window_place(window, &window->ui->rect, &window->rect,
     553                    NULL, window->placement, &window->dpos);
     554
     555        if (window->xgc != NULL)
     556                xlate_gc_set_off(window->xgc, &window->dpos);
     557
     558        if (window->placement == ui_wnd_place_full_screen) {
     559                (void)ui_window_resize(window, &window->ui->rect);
     560                ui_window_send_resize(window);
     561        }
    538562}
    539563
Note: See TracChangeset for help on using the changeset viewer.