Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/hid/compositor/compositor.c

    r62fbb7e r67472b9b  
    5858
    5959#include <event.h>
    60 #include <device/graph_dev.h>
     60#include <graph_iface.h>
    6161#include <io/keycode.h>
    6262#include <io/mode.h>
     
    7272#include <codec/tga.h>
    7373
     74#include "images.h"
    7475#include "compositor.h"
    7576
     
    161162static void input_disconnect(void);
    162163
     164
    163165static pointer_t *input_pointer(input_t *input)
    164166{
     
    166168}
    167169
    168 static pointer_t *pointer_create(void)
     170static pointer_t *pointer_create()
    169171{
    170172        pointer_t *p = (pointer_t *) malloc(sizeof(pointer_t));
    171         if (!p)
     173        if (!p) {
    172174                return NULL;
    173        
     175        }
     176
    174177        link_initialize(&p->link);
    175178        p->pos.x = coord_origin;
     
    183186        p->state = 0;
    184187        cursor_init(&p->cursor, CURSOR_DECODER_EMBEDDED, NULL);
    185        
     188
    186189        /* Ghost window for transformation animation. */
    187190        transform_identity(&p->ghost.transform);
     
    196199        p->accum_ghost.x = 0;
    197200        p->accum_ghost.y = 0;
    198        
     201
    199202        return p;
    200203}
     
    208211}
    209212
    210 static window_t *window_create(void)
     213static window_t *window_create(sysarg_t x_offset, sysarg_t y_offset)
    211214{
    212215        window_t *win = (window_t *) malloc(sizeof(window_t));
    213         if (!win)
     216        if (!win) {
    214217                return NULL;
    215        
     218        }
     219
    216220        link_initialize(&win->link);
    217221        atomic_set(&win->ref_cnt, 0);
    218222        prodcons_initialize(&win->queue);
    219223        transform_identity(&win->transform);
    220         transform_translate(&win->transform, coord_origin, coord_origin);
    221         win->dx = coord_origin;
    222         win->dy = coord_origin;
     224        transform_translate(&win->transform,
     225            coord_origin + x_offset, coord_origin + y_offset);
     226        win->dx = coord_origin + x_offset;
     227        win->dy = coord_origin + y_offset;
    223228        win->fx = 1;
    224229        win->fy = 1;
     
    226231        win->opacity = 255;
    227232        win->surface = NULL;
    228        
     233
    229234        return win;
    230235}
     
    289294    sysarg_t *x_out, sysarg_t *y_out, sysarg_t *w_out, sysarg_t *h_out)
    290295{
    291         if ((w_in > 0) && (h_in > 0)) {
     296        if (w_in > 0 && h_in > 0) {
    292297                sysarg_t x[4];
    293298                sysarg_t y[4];
    294                
    295299                comp_coord_from_client(x_in, y_in, win_trans, &x[0], &y[0]);
    296300                comp_coord_from_client(x_in + w_in - 1, y_in, win_trans, &x[1], &y[1]);
    297301                comp_coord_from_client(x_in + w_in - 1, y_in + h_in - 1, win_trans, &x[2], &y[2]);
    298302                comp_coord_from_client(x_in, y_in + h_in - 1, win_trans, &x[3], &y[3]);
    299                
    300303                (*x_out) = x[0];
    301304                (*y_out) = y[0];
    302305                (*w_out) = x[0];
    303306                (*h_out) = y[0];
    304                
    305                 for (unsigned int i = 1; i < 4; ++i) {
     307                for (int i = 1; i < 4; ++i) {
    306308                        (*x_out) = (x[i] < (*x_out)) ? x[i] : (*x_out);
    307309                        (*y_out) = (y[i] < (*y_out)) ? y[i] : (*y_out);
     
    309311                        (*h_out) = (y[i] > (*h_out)) ? y[i] : (*h_out);
    310312                }
    311                
    312313                (*w_out) = (*w_out) - (*x_out) + 1;
    313314                (*h_out) = (*h_out) - (*y_out) + 1;
     
    320321}
    321322
    322 static void comp_update_viewport_bound_rect(void)
     323static void comp_restrict_pointers(void)
    323324{
    324325        fibril_mutex_lock(&viewport_list_mtx);
    325        
     326
    326327        sysarg_t x_res = coord_origin;
    327328        sysarg_t y_res = coord_origin;
    328329        sysarg_t w_res = 0;
    329330        sysarg_t h_res = 0;
    330        
     331
    331332        if (!list_empty(&viewport_list)) {
    332333                viewport_t *vp = (viewport_t *) list_first(&viewport_list);
     
    335336                surface_get_resolution(vp->surface, &w_res, &h_res);
    336337        }
    337        
     338
    338339        list_foreach(viewport_list, link, viewport_t, vp) {
    339340                sysarg_t w_vp, h_vp;
    340341                surface_get_resolution(vp->surface, &w_vp, &h_vp);
    341                 rectangle_union(x_res, y_res, w_res, h_res,
     342                rectangle_union(
     343                    x_res, y_res, w_res, h_res,
    342344                    vp->pos.x, vp->pos.y, w_vp, h_vp,
    343345                    &x_res, &y_res, &w_res, &h_res);
    344346        }
    345        
     347
    346348        viewport_bound_rect.x = x_res;
    347349        viewport_bound_rect.y = y_res;
    348350        viewport_bound_rect.w = w_res;
    349351        viewport_bound_rect.h = h_res;
    350        
     352
    351353        fibril_mutex_unlock(&viewport_list_mtx);
    352 }
    353 
    354 static void comp_restrict_pointers(void)
    355 {
    356         comp_update_viewport_bound_rect();
    357        
     354
    358355        fibril_mutex_lock(&pointer_list_mtx);
    359        
     356
    360357        list_foreach(pointer_list, link, pointer_t, ptr) {
    361358                ptr->pos.x = ptr->pos.x > viewport_bound_rect.x ? ptr->pos.x : viewport_bound_rect.x;
     
    366363                    ptr->pos.y : viewport_bound_rect.y + viewport_bound_rect.h;
    367364        }
    368        
     365
    369366        fibril_mutex_unlock(&pointer_list_mtx);
    370367}
     
    645642}
    646643
    647 static void comp_recalc_transform(window_t *win)
    648 {
    649         transform_t translate;
    650         transform_identity(&translate);
    651         transform_translate(&translate, win->dx, win->dy);
    652        
    653         transform_t scale;
    654         transform_identity(&scale);
    655         if ((win->fx != 1) || (win->fy != 1))
    656                 transform_scale(&scale, win->fx, win->fy);
    657        
    658         transform_t rotate;
    659         transform_identity(&rotate);
    660         if (win->angle != 0)
    661                 transform_rotate(&rotate, win->angle);
    662        
    663         transform_t transform;
    664         transform_t temp;
    665         transform_identity(&transform);
    666         temp = transform;
    667         transform_multiply(&transform, &temp, &translate);
    668         temp = transform;
    669         transform_multiply(&transform, &temp, &rotate);
    670         temp = transform;
    671         transform_multiply(&transform, &temp, &scale);
    672        
    673         win->transform = transform;
    674 }
    675 
    676644static void comp_window_resize(window_t *win, ipc_callid_t iid, ipc_call_t *icall)
    677645{
     646        int rc;
     647
    678648        ipc_callid_t callid;
    679649        size_t size;
    680650        unsigned int flags;
    681        
     651
    682652        /* Start sharing resized window with client. */
    683653        if (!async_share_out_receive(&callid, &size, &flags)) {
     
    685655                return;
    686656        }
    687        
    688657        void *new_cell_storage;
    689         int rc = async_share_out_finalize(callid, &new_cell_storage);
     658        rc = async_share_out_finalize(callid, &new_cell_storage);
    690659        if ((rc != EOK) || (new_cell_storage == AS_MAP_FAILED)) {
    691660                async_answer_0(iid, ENOMEM);
    692661                return;
    693662        }
    694        
     663
    695664        /* Create new surface for the resized window. */
    696         surface_t *new_surface = surface_create(IPC_GET_ARG3(*icall),
    697             IPC_GET_ARG4(*icall), new_cell_storage, SURFACE_FLAG_SHARED);
     665        surface_t *new_surface = surface_create(
     666            IPC_GET_ARG1(*icall), IPC_GET_ARG2(*icall),
     667            new_cell_storage, SURFACE_FLAG_SHARED);
    698668        if (!new_surface) {
    699669                as_area_destroy(new_cell_storage);
     
    701671                return;
    702672        }
    703        
    704         sysarg_t offset_x = IPC_GET_ARG1(*icall);
    705         sysarg_t offset_y = IPC_GET_ARG2(*icall);
    706         window_placement_flags_t placement_flags =
    707             (window_placement_flags_t) IPC_GET_ARG5(*icall);
    708        
    709         comp_update_viewport_bound_rect();
    710        
     673
    711674        /* Switch new surface with old surface and calculate damage. */
    712675        fibril_mutex_lock(&window_list_mtx);
    713        
     676
    714677        sysarg_t old_width = 0;
    715678        sysarg_t old_height = 0;
    716        
    717679        if (win->surface) {
    718680                surface_get_resolution(win->surface, &old_width, &old_height);
    719681                surface_destroy(win->surface);
    720682        }
    721        
     683
    722684        win->surface = new_surface;
    723        
     685
    724686        sysarg_t new_width = 0;
    725687        sysarg_t new_height = 0;
    726688        surface_get_resolution(win->surface, &new_width, &new_height);
    727        
    728         if (placement_flags & WINDOW_PLACEMENT_CENTER_X)
    729                 win->dx = viewport_bound_rect.x + viewport_bound_rect.w / 2 -
    730                     new_width / 2;
    731        
    732         if (placement_flags & WINDOW_PLACEMENT_CENTER_Y)
    733                 win->dy = viewport_bound_rect.y + viewport_bound_rect.h / 2 -
    734                     new_height / 2;
    735        
    736         if (placement_flags & WINDOW_PLACEMENT_LEFT)
    737                 win->dx = viewport_bound_rect.x;
    738        
    739         if (placement_flags & WINDOW_PLACEMENT_TOP)
    740                 win->dy = viewport_bound_rect.y;
    741        
    742         if (placement_flags & WINDOW_PLACEMENT_RIGHT)
    743                 win->dx = viewport_bound_rect.x + viewport_bound_rect.w -
    744                     new_width;
    745        
    746         if (placement_flags & WINDOW_PLACEMENT_BOTTOM)
    747                 win->dy = viewport_bound_rect.y + viewport_bound_rect.h -
    748                     new_height;
    749        
    750         if (placement_flags & WINDOW_PLACEMENT_ABSOLUTE_X)
    751                 win->dx = coord_origin + offset_x;
    752        
    753         if (placement_flags & WINDOW_PLACEMENT_ABSOLUTE_Y)
    754                 win->dy = coord_origin + offset_y;
    755        
    756         /* Transform the window and calculate damage. */
    757         sysarg_t x1;
    758         sysarg_t y1;
    759         sysarg_t width1;
    760         sysarg_t height1;
    761        
    762         comp_coord_bounding_rect(0, 0, old_width, old_height, win->transform,
    763             &x1, &y1, &width1, &height1);
    764        
    765         comp_recalc_transform(win);
    766        
    767         sysarg_t x2;
    768         sysarg_t y2;
    769         sysarg_t width2;
    770         sysarg_t height2;
    771        
    772         comp_coord_bounding_rect(0, 0, new_width, new_height, win->transform,
    773             &x2, &y2, &width2, &height2);
    774        
    775         sysarg_t x;
    776         sysarg_t y;
    777         sysarg_t width;
    778         sysarg_t height;
    779        
    780         rectangle_union(x1, y1, width1, height1, x2, y2, width2, height2,
    781             &x, &y, &width, &height);
    782        
     689
     690        sysarg_t x, y;
     691        sysarg_t width = old_width > new_width ? old_width : new_width;
     692        sysarg_t height = old_height > new_height ? old_height : new_height;
     693        comp_coord_bounding_rect(0, 0, width, height, win->transform, &x, &y, &width, &height);
     694
    783695        fibril_mutex_unlock(&window_list_mtx);
    784        
     696
    785697        comp_damage(x, y, width, height);
    786        
     698
    787699        async_answer_0(iid, EOK);
    788700}
     
    791703{
    792704        fibril_mutex_lock(&window_list_mtx);
    793        
     705
    794706        list_foreach(window_list, link, window_t, window) {
    795707                if (window == target) {
     
    799711                }
    800712        }
    801        
     713
    802714        fibril_mutex_unlock(&window_list_mtx);
    803715        free(event);
     
    807719{
    808720        fibril_mutex_lock(&window_list_mtx);
    809        
    810721        window_t *win = (window_t *) list_first(&window_list);
    811         if (win)
     722        if (win) {
    812723                prodcons_produce(&win->queue, &event->link);
    813         else
     724        } else {
    814725                free(event);
    815        
     726        }
    816727        fibril_mutex_unlock(&window_list_mtx);
    817728}
     
    890801                        fibril_mutex_lock(&window_list_mtx);
    891802
    892                         window_t *win = window_create();
     803                        window_t *win = window_create(IPC_GET_ARG1(call), IPC_GET_ARG2(call));
    893804                        if (!win) {
    894805                                async_answer_2(callid, ENOMEM, 0, 0);
     
    12621173}
    12631174
     1175static void comp_recalc_transform(window_t *win)
     1176{
     1177        transform_t translate;
     1178        transform_identity(&translate);
     1179        transform_translate(&translate, win->dx, win->dy);
     1180
     1181        transform_t scale;
     1182        transform_identity(&scale);
     1183        if (win->fx != 1 || win->fy != 1) {
     1184                transform_scale(&scale, win->fx, win->fy);
     1185        }
     1186
     1187        transform_t rotate;
     1188        transform_identity(&rotate);
     1189        if (win->angle != 0) {
     1190                transform_rotate(&rotate, win->angle);
     1191        }
     1192
     1193        transform_t transform;
     1194        transform_t temp;
     1195        transform_identity(&transform);
     1196        temp = transform;
     1197        transform_multiply(&transform, &temp, &translate);
     1198        temp = transform;
     1199        transform_multiply(&transform, &temp, &rotate);
     1200        temp = transform;
     1201        transform_multiply(&transform, &temp, &scale);
     1202       
     1203
     1204        win->transform = transform;
     1205}
     1206
    12641207static void comp_window_animate(pointer_t *pointer, window_t *win,
    12651208    sysarg_t *dmg_x, sysarg_t *dmg_y, sysarg_t *dmg_width, sysarg_t *dmg_height)
     
    12831226                double cx = 0;
    12841227                double cy = 0;
    1285                
    1286                 if (pointer->grab_flags & GF_MOVE_X)
     1228                if (pointer->grab_flags & GF_MOVE_X) {
    12871229                        cx = 1;
    1288                
    1289                 if (pointer->grab_flags & GF_MOVE_Y)
     1230                }
     1231                if (pointer->grab_flags & GF_MOVE_Y) {
    12901232                        cy = 1;
    1291                
    1292                 if (((scale) || (resize)) && (win->angle != 0)) {
     1233                }
     1234
     1235                if ((scale || resize) && (win->angle != 0)) {
    12931236                        transform_t rotate;
    12941237                        transform_identity(&rotate);
    1295                        
    12961238                        transform_rotate(&rotate, win->angle);
    12971239                        transform_apply_linear(&rotate, &cx, &cy);
    12981240                }
    12991241               
    1300                 cx = (cx < 0) ? (-1 * cx) : cx;
     1242                cx = (cx < 0) ? (-1 * cx) : cx; 
    13011243                cy = (cy < 0) ? (-1 * cy) : cy;
    1302                
     1244
    13031245                win->dx += (cx * dx);
    13041246                win->dy += (cy * dy);
    13051247        }
    13061248
    1307         if ((scale) || (resize)) {
     1249        if (scale || resize) {
    13081250                double _dx = dx;
    13091251                double _dy = dy;
     
    13211263                        if (fx > 0) {
    13221264#if ANIMATE_WINDOW_TRANSFORMS == 0
    1323                                 if (scale)
    1324                                         win->fx *= fx;
     1265                                if (scale) win->fx *= fx;
    13251266#endif
    13261267#if ANIMATE_WINDOW_TRANSFORMS == 1
     
    15031444{
    15041445        pointer_t *pointer = input_pointer(input);
    1505        
    1506         comp_update_viewport_bound_rect();
    1507        
     1446
    15081447        /* Update pointer position. */
    15091448        fibril_mutex_lock(&pointer_list_mtx);
    1510        
    15111449        desktop_point_t old_pos = pointer->pos;
    1512        
    15131450        sysarg_t cursor_width;
    15141451        sysarg_t cursor_height;
    1515         surface_get_resolution(pointer->cursor.states[pointer->state],
     1452        surface_get_resolution(pointer->cursor.states[pointer->state], 
    15161453             &cursor_width, &cursor_height);
    1517        
    1518         if (pointer->pos.x + dx < viewport_bound_rect.x)
     1454        if (pointer->pos.x + dx < viewport_bound_rect.x) {
    15191455                dx = -1 * (pointer->pos.x - viewport_bound_rect.x);
    1520        
    1521         if (pointer->pos.y + dy < viewport_bound_rect.y)
     1456        }
     1457        if (pointer->pos.y + dy < viewport_bound_rect.y) {
    15221458                dy = -1 * (pointer->pos.y - viewport_bound_rect.y);
    1523        
    1524         if (pointer->pos.x + dx > viewport_bound_rect.x + viewport_bound_rect.w)
     1459        }
     1460        if (pointer->pos.x + dx > viewport_bound_rect.x + viewport_bound_rect.w) {
    15251461                dx = (viewport_bound_rect.x + viewport_bound_rect.w - pointer->pos.x);
    1526        
    1527         if (pointer->pos.y + dy > viewport_bound_rect.y + viewport_bound_rect.h)
     1462        }
     1463        if (pointer->pos.y + dy > viewport_bound_rect.y + viewport_bound_rect.h) {
    15281464                dy = (viewport_bound_rect.y + viewport_bound_rect.h - pointer->pos.y);
    1529        
     1465        }
    15301466        pointer->pos.x += dx;
    15311467        pointer->pos.y += dy;
     
    15331469        comp_damage(old_pos.x, old_pos.y, cursor_width, cursor_height);
    15341470        comp_damage(old_pos.x + dx, old_pos.y + dy, cursor_width, cursor_height);
    1535        
     1471
    15361472        fibril_mutex_lock(&window_list_mtx);
    15371473        fibril_mutex_lock(&pointer_list_mtx);
     
    16941630
    16951631#if ANIMATE_WINDOW_TRANSFORMS == 0
    1696                 sysarg_t pre_x = 0;
     1632                sysarg_t pre_x = 0; 
    16971633                sysarg_t pre_y = 0;
    16981634                sysarg_t pre_width = 0;
     
    17261662                                link_initialize(&event_top->link);
    17271663                                event_top->type = ET_WINDOW_RESIZE;
    1728                                
    1729                                 event_top->data.resize.offset_x = 0;
    1730                                 event_top->data.resize.offset_y = 0;
    1731                                
     1664
    17321665                                int dx = (int) (((double) width) * (scale_back_x - 1.0));
    17331666                                int dy = (int) (((double) height) * (scale_back_y - 1.0));
    1734                                
    1735                                 if (pointer->grab_flags & GF_RESIZE_X)
    1736                                         event_top->data.resize.width =
    1737                                             ((((int) width) + dx) >= 0) ? (width + dx) : 0;
    1738                                 else
    1739                                         event_top->data.resize.width = width;
    1740                                
    1741                                 if (pointer->grab_flags & GF_RESIZE_Y)
    1742                                         event_top->data.resize.height =
    1743                                             ((((int) height) + dy) >= 0) ? (height + dy) : 0;
    1744                                 else
    1745                                         event_top->data.resize.height = height;
    1746                                
    1747                                 event_top->data.resize.placement_flags =
    1748                                     WINDOW_PLACEMENT_ANY;
     1667
     1668                                if (pointer->grab_flags & GF_RESIZE_X) {
     1669                                        event_top->data.rsz.width =
     1670                                                ((((int) width) + dx) >= 0) ? (width + dx) : 0;
     1671                                } else {
     1672                                        event_top->data.rsz.width = width;
     1673                                }
     1674
     1675                                if (pointer->grab_flags & GF_RESIZE_Y) {
     1676                                        event_top->data.rsz.height =
     1677                                                ((((int) height) + dy) >= 0) ? (height + dy) : 0;
     1678                                } else {
     1679                                        event_top->data.rsz.height = height;
     1680                                }
    17491681                        }
    17501682
     
    18141746            key == KC_O || key == KC_P);
    18151747        bool kconsole_switch = (mods & KM_ALT) && (key == KC_M);
     1748        bool compositor_test = (mods & KM_ALT) && (key == KC_H);
    18161749
    18171750        bool filter = (type == KEY_RELEASE) && (win_transform || win_resize ||
    18181751            win_opacity || win_close || win_switch || viewport_move ||
    1819             viewport_change || kconsole_switch);
     1752            viewport_change || kconsole_switch || compositor_test);
    18201753
    18211754        if (filter) {
     
    18831816                                return ENOMEM;
    18841817                        }
    1885                        
     1818
    18861819                        sysarg_t width, height;
    18871820                        surface_get_resolution(win->surface, &width, &height);
    1888                        
     1821
    18891822                        link_initialize(&event->link);
    18901823                        event->type = ET_WINDOW_RESIZE;
    1891                        
    1892                         event->data.resize.offset_x = 0;
    1893                         event->data.resize.offset_y = 0;
    1894                        
     1824
    18951825                        switch (key) {
    18961826                        case KC_T:
    1897                                 event->data.resize.width = width;
    1898                                 event->data.resize.height = (height >= 20) ? height - 20 : 0;
     1827                                event->data.rsz.width = width;
     1828                                event->data.rsz.height = (height >= 20) ? height - 20 : 0;
    18991829                                break;
    19001830                        case KC_G:
    1901                                 event->data.resize.width = width;
    1902                                 event->data.resize.height = height + 20;
     1831                                event->data.rsz.width = width;
     1832                                event->data.rsz.height = height + 20;
    19031833                                break;
    19041834                        case KC_B:
    1905                                 event->data.resize.width = (width >= 20) ? width - 20 : 0;;
    1906                                 event->data.resize.height = height;
     1835                                event->data.rsz.width = (width >= 20) ? width - 20 : 0;;
     1836                                event->data.rsz.height = height;
    19071837                                break;
    19081838                        case KC_N:
    1909                                 event->data.resize.width = width + 20;
    1910                                 event->data.resize.height = height;
     1839                                event->data.rsz.width = width + 20;
     1840                                event->data.rsz.height = height;
    19111841                                break;
    19121842                        default:
    1913                                 event->data.resize.width = 0;
    1914                                 event->data.resize.height = 0;
    1915                                 break;
    1916                         }
    1917                        
    1918                         event->data.resize.placement_flags = WINDOW_PLACEMENT_ANY;
    1919                        
     1843                                event->data.rsz.width = 0;
     1844                                event->data.rsz.height = 0;
     1845                                break;
     1846                        }
     1847
    19201848                        fibril_mutex_unlock(&window_list_mtx);
    19211849                        comp_post_event_top(event);
     
    20862014        } else if (kconsole_switch) {
    20872015                __SYSCALL0(SYS_DEBUG_ACTIVATE_CONSOLE);
     2016        } else if (compositor_test) {
     2017                fibril_mutex_lock(&window_list_mtx);
     2018
     2019                window_t *red_win = window_create(0, 0);
     2020                red_win->surface = surface_create(250, 150, NULL, 0);
     2021                pixel_t red_pix = PIXEL(255, 240, 0, 0);
     2022                for (sysarg_t y = 0; y <  150; ++y) {
     2023                        for (sysarg_t x = 0; x < 250; ++x) {
     2024                                surface_put_pixel(red_win->surface, x, y, red_pix);
     2025                        }
     2026                }
     2027                list_prepend(&red_win->link, &window_list);
     2028
     2029                window_t *blue_win = window_create(0, 0);
     2030                blue_win->surface = surface_create(200, 100, NULL, 0);
     2031                pixel_t blue_pix = PIXEL(255, 0, 0, 240);
     2032                for (sysarg_t y = 0; y <  100; ++y) {
     2033                        for (sysarg_t x = 0; x < 200; ++x) {
     2034                                surface_put_pixel(blue_win->surface, x, y, blue_pix);
     2035                        }
     2036                }
     2037                list_prepend(&blue_win->link, &window_list);
     2038               
     2039                window_t *nameic_win = window_create(0, 0);
     2040                nameic_win->surface = decode_tga((void *) nameic_tga, nameic_tga_size, 0);
     2041                list_prepend(&nameic_win->link, &window_list);
     2042
     2043                fibril_mutex_unlock(&window_list_mtx);
     2044                comp_damage(0, 0, UINT32_MAX, UINT32_MAX);
    20882045        } else {
    20892046                window_event_t *event = (window_event_t *) malloc(sizeof(window_event_t));
Note: See TracChangeset for help on using the changeset viewer.