Changeset 0e6e77f in mainline for uspace/lib/gui/window.c


Ignore:
Timestamp:
2020-02-28T15:44:55Z (5 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
a8eed5f
Parents:
2a515dcd
git-author:
Jiri Svoboda <jiri@…> (2020-02-26 18:26:13)
git-committer:
Jiri Svoboda <jiri@…> (2020-02-28 15:44:55)
Message:

Window resize by client request

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/gui/window.c

    r2a515dcd r0e6e77f  
    382382    sysarg_t width, sysarg_t height, window_placement_flags_t placement_flags)
    383383{
    384         display_wnd_params_t wparams;
    385         display_window_t *new_window = NULL;
    386384        gfx_bitmap_params_t params;
    387385        gfx_bitmap_alloc_t alloc;
    388386        gfx_bitmap_t *new_bitmap = NULL;
    389         gfx_context_t *new_gc = NULL;
     387        gfx_coord2_t offs;
     388        gfx_rect_t nrect;
    390389        errno_t rc;
    391390
     
    406405                return;
    407406
    408         display_wnd_params_init(&wparams);
    409         wparams.rect.p0.x = 0;
    410         wparams.rect.p0.y = 0;
    411         wparams.rect.p1.x = width;
    412         wparams.rect.p1.y = height;
    413 
    414         rc = display_window_create(win->display, &wparams, &window_cb,
    415             (void *) win, &new_window);
    416         if (rc != EOK) {
    417                 surface_destroy(new_surface);
    418                 return;
    419         }
    420 
    421         rc = display_window_get_gc(new_window, &new_gc);
    422         if (rc != EOK) {
    423                 display_window_destroy(new_window);
    424                 surface_destroy(new_surface);
    425                 return;
    426         }
    427 
    428407        params.rect.p0.x = 0;
    429408        params.rect.p0.y = 0;
     
    435414        alloc.pixels = surface_direct_access(new_surface);
    436415
    437         rc = gfx_bitmap_create(new_gc, &params, &alloc, &new_bitmap);
     416        rc = gfx_bitmap_create(win->gc, &params, &alloc, &new_bitmap);
    438417        if (rc != EOK) {
    439                 gfx_context_delete(new_gc);
    440                 display_window_destroy(new_window);
    441418                surface_destroy(new_surface);
    442419                return;
     
    447424        surface_t *old_surface = win->surface;
    448425        gfx_bitmap_t *old_bitmap = win->bitmap;
    449         display_window_t *old_window = win->dwindow;
    450         gfx_context_t *old_gc = win->gc;
    451426        win->surface = new_surface;
    452427        win->bitmap = new_bitmap;
    453         win->dwindow = new_window;
    454         win->gc = new_gc;
    455428        fibril_mutex_unlock(&win->guard);
    456429
     
    465438        fibril_mutex_unlock(&win->guard);
    466439
    467         /* Inform compositor about new surface. */
    468 #if 0
    469         errno_t rc = win_resize(win->osess, offset_x, offset_y, width, height,
    470             placement_flags, surface_direct_access(new_surface));
    471 #endif
    472         rc = EOK;
    473 
     440        /* Resize the display window. */
     441        offs.x = offset_x;
     442        offs.y = offset_y;
     443        nrect.p0.x = 0;
     444        nrect.p0.y = 0;
     445        nrect.p1.x = width;
     446        nrect.p1.y = height;
     447
     448        rc = display_window_resize(win->dwindow, &offs, &nrect);
    474449        if (rc != EOK) {
    475450                /* Rollback to old surface. Reverse all changes. */
     
    484459                win->surface = old_surface;
    485460                win->bitmap = old_bitmap;
    486                 win->dwindow = old_window;
    487                 win->gc = old_gc;
    488461                fibril_mutex_unlock(&win->guard);
    489462
     
    498471                surface_destroy(new_surface);
    499472        } else {
    500                 if (old_window != NULL)
    501                         display_window_destroy(old_window);
    502                 if (old_gc != NULL)
    503                         gfx_context_delete(old_gc);
    504473                if (old_bitmap != NULL)
    505474                        gfx_bitmap_destroy(old_bitmap);
     
    643612    window_flags_t flags, const char *caption)
    644613{
     614        display_wnd_params_t wparams;
     615
    645616        window_t *win = (window_t *) calloc(1, sizeof(window_t));
    646617        if (!win)
     
    663634        win->grab = NULL;
    664635        win->focus = NULL;
    665         win->surface = NULL;
     636
     637        /* Allocate resources for new surface. */
     638        win->surface = surface_create(100, 100, NULL, SURFACE_FLAG_SHARED);
     639        if (win->surface == NULL) {
     640                free(win);
     641                return NULL;
     642        }
    666643
    667644        errno_t rc = display_open(winreg, &win->display);
    668645        if (rc != EOK) {
     646                surface_destroy(win->surface);
     647                free(win);
     648                return NULL;
     649        }
     650
     651        /* Window dimensions are not know at this time */
     652        display_wnd_params_init(&wparams);
     653        wparams.rect.p0.x = 0;
     654        wparams.rect.p0.y = 0;
     655        wparams.rect.p1.x = 100;
     656        wparams.rect.p1.y = 100;
     657
     658        rc = display_window_create(win->display, &wparams, &window_cb,
     659            (void *) win, &win->dwindow);
     660        if (rc != EOK) {
     661                display_close(win->display);
     662                surface_destroy(win->surface);
     663                free(win);
     664                return NULL;
     665        }
     666
     667        rc = display_window_get_gc(win->dwindow, &win->gc);
     668        if (rc != EOK) {
     669                display_window_destroy(win->dwindow);
     670                display_close(win->display);
     671                surface_destroy(win->surface);
    669672                free(win);
    670673                return NULL;
Note: See TracChangeset for help on using the changeset viewer.