Changeset 62fbb7e in mainline for uspace/lib


Ignore:
Timestamp:
2014-01-16T20:43:22Z (12 years ago)
Author:
Martin Decky <martin@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
6a3d0c7
Parents:
ba02baa
Message:

refactor window placement logic and introduce logical window placement flags

  • The original setup of window position during creation (window_open()) was quite useless, because the window had no surface yet.
  • Now the window position can be optinally set using window_resize() and various logical placement flags are available.
  • A separate window_move() routine could be introduced eventually if needed, but for the initial setup of the window the combination of window position and size works fine.
Location:
uspace/lib
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/c/generic/io/window.c

    rba02baa r62fbb7e  
    4040#include <stdio.h>
    4141
    42 int win_register(async_sess_t *sess, service_id_t *in, service_id_t *out,
    43     sysarg_t x_offset, sysarg_t y_offset)
     42int win_register(async_sess_t *sess, service_id_t *in, service_id_t *out)
    4443{
    4544        async_exch_t *exch = async_exchange_begin(sess);
    46         int ret = async_req_2_2(exch, WINDOW_REGISTER, x_offset, y_offset, in, out);
     45        int ret = async_req_0_2(exch, WINDOW_REGISTER, in, out);
    4746        async_exchange_end(exch);
    48 
     47       
    4948        return ret;
    5049}
     
    9291}
    9392
    94 int win_resize(async_sess_t *sess, sysarg_t width, sysarg_t height, void *cells)
     93int win_resize(async_sess_t *sess, sysarg_t x, sysarg_t y, sysarg_t width,
     94    sysarg_t height, window_placement_flags_t placement_flags, void *cells)
    9595{
    9696        async_exch_t *exch = async_exchange_begin(sess);
    97 
     97       
    9898        ipc_call_t answer;
    99         aid_t req = async_send_2(exch, WINDOW_RESIZE, width, height, &answer);
    100 
     99        aid_t req = async_send_5(exch, WINDOW_RESIZE, x, y, width, height,
     100            (sysarg_t) placement_flags, &answer);
     101       
    101102        int rc = async_share_out_start(exch, cells, AS_AREA_READ | AS_AREA_CACHEABLE);
    102 
     103       
    103104        async_exchange_end(exch);
    104 
     105       
    105106        sysarg_t ret;
    106107        async_wait_for(req, &ret);
    107 
    108         if (rc != EOK) {
     108       
     109        if (rc != EOK)
    109110                return rc;
    110         } else if (ret != EOK) {
     111        else if (ret != EOK)
    111112                return ret;
    112         } else {
    113                 return EOK;
    114         }
     113       
     114        return EOK;
    115115}
    116116
  • uspace/lib/c/include/io/window.h

    rba02baa r62fbb7e  
    4343#include <io/pos_event.h>
    4444
     45typedef enum {
     46        GF_EMPTY = 0,
     47        GF_MOVE_X = 1,
     48        GF_MOVE_Y = 2,
     49        GF_RESIZE_X = 4,
     50        GF_RESIZE_Y = 8,
     51        GF_SCALE_X = 16,
     52        GF_SCALE_Y = 32
     53} window_grab_flags_t;
     54
     55typedef enum {
     56        WINDOW_PLACEMENT_ANY = 0,
     57        WINDOW_PLACEMENT_CENTER_X = 1,
     58        WINDOW_PLACEMENT_CENTER_Y = 2,
     59        WINDOW_PLACEMENT_CENTER =
     60            WINDOW_PLACEMENT_CENTER_X | WINDOW_PLACEMENT_CENTER_Y,
     61        WINDOW_PLACEMENT_LEFT = 4,
     62        WINDOW_PLACEMENT_RIGHT = 8,
     63        WINDOW_PLACEMENT_TOP = 16,
     64        WINDOW_PLACEMENT_BOTTOM = 32,
     65        WINDOW_PLACEMENT_ABSOLUTE_X = 64,
     66        WINDOW_PLACEMENT_ABSOLUTE_Y = 128,
     67        WINDOW_PLACEMENT_ABSOLUTE =
     68            WINDOW_PLACEMENT_ABSOLUTE_X | WINDOW_PLACEMENT_ABSOLUTE_Y
     69} window_placement_flags_t;
     70
    4571typedef struct {
    4672        sysarg_t object;
    4773        sysarg_t slot;
    4874        sysarg_t argument;
    49 } sig_event_t;
     75} signal_event_t;
    5076
    5177typedef struct {
     78        sysarg_t offset_x;
     79        sysarg_t offset_y;
    5280        sysarg_t width;
    5381        sysarg_t height;
    54 } rsz_event_t;
     82        window_placement_flags_t placement_flags;
     83} resize_event_t;
    5584
    5685typedef enum {
     
    6998        kbd_event_t kbd;
    7099        pos_event_t pos;
    71         sig_event_t sig;
    72         rsz_event_t rsz;
     100        signal_event_t signal;
     101        resize_event_t resize;
    73102} window_event_data_t;
    74103
     
    79108} window_event_t;
    80109
    81 typedef enum {
    82         GF_EMPTY = 0,
    83         GF_MOVE_X = 1,
    84         GF_MOVE_Y = 2,
    85         GF_RESIZE_X = 4,
    86         GF_RESIZE_Y = 8,
    87         GF_SCALE_X = 16,
    88         GF_SCALE_Y = 32
    89 } window_grab_flags_t;
    90 
    91 extern int win_register(async_sess_t *, service_id_t *, service_id_t *, sysarg_t, sysarg_t);
     110extern int win_register(async_sess_t *, service_id_t *, service_id_t *);
    92111
    93112extern int win_get_event(async_sess_t *, window_event_t *);
     
    95114extern int win_damage(async_sess_t *, sysarg_t, sysarg_t, sysarg_t, sysarg_t);
    96115extern int win_grab(async_sess_t *, sysarg_t, sysarg_t);
    97 extern int win_resize(async_sess_t *, sysarg_t, sysarg_t, void *);
     116extern int win_resize(async_sess_t *, sysarg_t, sysarg_t, sysarg_t, sysarg_t,
     117    window_placement_flags_t, void *);
    98118extern int win_close(async_sess_t *);
    99119extern int win_close_request(async_sess_t *);
  • uspace/lib/gui/connection.c

    rba02baa r62fbb7e  
    210210                        link_initialize(&event->link);
    211211                        event->type = ET_SIGNAL_EVENT;
    212                         event->data.sig.object = (sysarg_t) cur->widget;
    213                         event->data.sig.slot = (sysarg_t) cur->slot;
    214                         event->data.sig.argument = (sysarg_t) data_copy;
     212                        event->data.signal.object = (sysarg_t) cur->widget;
     213                        event->data.signal.slot = (sysarg_t) cur->slot;
     214                        event->data.signal.argument = (sysarg_t) data_copy;
    215215                        prodcons_produce(&cur->widget->window->events, &event->link);
    216216                } else {
  • uspace/lib/gui/window.c

    rba02baa r62fbb7e  
    352352}
    353353
    354 static void handle_signal_event(window_t *win, sig_event_t event)
     354static void handle_signal_event(window_t *win, signal_event_t event)
    355355{
    356356        widget_t *widget = (widget_t *) event.object;
     
    363363}
    364364
    365 static void handle_resize(window_t *win, sysarg_t width, sysarg_t height)
    366 {
    367         int rc;
    368         surface_t *old_surface;
    369         surface_t *new_surface;
    370 
     365static void handle_resize(window_t *win, sysarg_t offset_x, sysarg_t offset_y,
     366    sysarg_t width, sysarg_t height, window_placement_flags_t placement_flags)
     367{
    371368        if (width < 2 * border_thickness + header_min_width) {
    372369                win_damage(win->osess, 0, 0, 0, 0);
    373370                return;
    374371        }
    375 
     372       
    376373        if (height < 2 * border_thickness + header_height) {
    377374                win_damage(win->osess, 0, 0, 0, 0);
    378375                return;
    379376        }
    380 
     377       
    381378        /* Allocate resources for new surface. */
    382         new_surface = surface_create(width, height, NULL, SURFACE_FLAG_SHARED);
    383         if (!new_surface) {
     379        surface_t *new_surface = surface_create(width, height, NULL,
     380            SURFACE_FLAG_SHARED);
     381        if (!new_surface)
    384382                return;
    385         }
    386 
     383       
    387384        /* Switch new and old surface. */
    388385        fibril_mutex_lock(&win->guard);
    389         old_surface = win->surface;
     386        surface_t *old_surface = win->surface;
    390387        win->surface = new_surface;
    391388        fibril_mutex_unlock(&win->guard);
    392 
    393         /* Let all widgets in the tree alter their position and size. Widgets might
    394          * also paint themselves onto the new surface. */
     389       
     390        /*
     391         * Let all widgets in the tree alter their position and size.
     392         * Widgets might also paint themselves onto the new surface.
     393         */
    395394        win->root.rearrange(&win->root, 0, 0, width, height);
    396 
     395       
    397396        fibril_mutex_lock(&win->guard);
    398397        surface_reset_damaged_region(win->surface);
    399398        fibril_mutex_unlock(&win->guard);
    400 
     399       
    401400        /* Inform compositor about new surface. */
    402         rc = win_resize(win->osess,
    403                 width, height, surface_direct_access(new_surface));
    404 
     401        int rc = win_resize(win->osess, offset_x, offset_y, width, height,
     402            placement_flags, surface_direct_access(new_surface));
     403       
    405404        if (rc != EOK) {
    406405                /* Rollback to old surface. Reverse all changes. */
    407 
     406               
    408407                sysarg_t old_width = 0;
    409408                sysarg_t old_height = 0;
    410                 if (old_surface) {
     409                if (old_surface)
    411410                        surface_get_resolution(old_surface, &old_width, &old_height);
    412                 }
    413 
     411               
    414412                fibril_mutex_lock(&win->guard);
    415413                new_surface = win->surface;
    416414                win->surface = old_surface;
    417415                fibril_mutex_unlock(&win->guard);
    418 
     416               
    419417                win->root.rearrange(&win->root, 0, 0, old_width, old_height);
    420418               
     
    424422                        fibril_mutex_unlock(&win->guard);
    425423                }
    426 
     424               
    427425                surface_destroy(new_surface);
    428                 return;
    429         }
    430 
    431         /* Finally deallocate old surface. */
    432         if (old_surface) {
    433                 surface_destroy(old_surface);
     426        } else {
     427                /* Deallocate old surface. */
     428                if (old_surface)
     429                        surface_destroy(old_surface);
    434430        }
    435431}
     
    513509                        break;
    514510                case ET_SIGNAL_EVENT:
    515                         handle_signal_event(win, event->data.sig);
     511                        handle_signal_event(win, event->data.signal);
    516512                        break;
    517513                case ET_WINDOW_RESIZE:
    518                         handle_resize(win, event->data.rsz.width, event->data.rsz.height);
     514                        handle_resize(win, event->data.resize.offset_x,
     515                            event->data.resize.offset_y, event->data.resize.width,
     516                            event->data.resize.height, event->data.resize.placement_flags);
    519517                        break;
    520518                case ET_WINDOW_FOCUS:
     
    590588
    591589window_t *window_open(const char *winreg, bool is_main, bool is_decorated,
    592     const char *caption, sysarg_t x_offset, sysarg_t y_offset)
     590    const char *caption)
    593591{
    594592        window_t *win = (window_t *) malloc(sizeof(window_t));
     
    630628        service_id_t in_dsid;
    631629        service_id_t out_dsid;
    632         rc = win_register(reg_sess, &in_dsid, &out_dsid, x_offset, y_offset);
     630        rc = win_register(reg_sess, &in_dsid, &out_dsid);
    633631        async_hangup(reg_sess);
    634632        if (rc != EOK) {
     
    658656}
    659657
    660 void window_resize(window_t *win, sysarg_t width, sysarg_t height)
     658void window_resize(window_t *win, sysarg_t offset_x, sysarg_t offset_y,
     659    sysarg_t width, sysarg_t height, window_placement_flags_t placement_flags)
    661660{
    662661        window_event_t *event = (window_event_t *) malloc(sizeof(window_event_t));
     
    664663                link_initialize(&event->link);
    665664                event->type = ET_WINDOW_RESIZE;
    666                 event->data.rsz.width = width;
    667                 event->data.rsz.height = height;
     665                event->data.resize.offset_x = offset_x;
     666                event->data.resize.offset_y = offset_y;
     667                event->data.resize.width = width;
     668                event->data.resize.height = height;
     669                event->data.resize.placement_flags = placement_flags;
    668670                prodcons_produce(&win->events, &event->link);
    669671        }
  • uspace/lib/gui/window.h

    rba02baa r62fbb7e  
    6666 * If the window is declared as main, its closure causes termination of the
    6767 * whole application. Note that opened window does not have any surface yet. */
    68 extern window_t *window_open(const char *, bool, bool, const char *, sysarg_t,
    69     sysarg_t);
     68extern window_t *window_open(const char *, bool, bool, const char *);
    7069
    7170/**
     
    7473 * and to paint themselves on the new surface (top-bottom order). Should be
    7574 * called also after opening new window to obtain surface. */
    76 extern void window_resize(window_t *, sysarg_t, sysarg_t);
     75extern void window_resize(window_t *, sysarg_t, sysarg_t, sysarg_t, sysarg_t,
     76    window_placement_flags_t);
    7777
    7878/**
Note: See TracChangeset for help on using the changeset viewer.