Changeset a40ae0d in mainline for uspace/srv/hid/display/seat.c


Ignore:
Timestamp:
2020-01-09T16:44:57Z (5 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
946a666
Parents:
8e9781f
git-author:
Jiri Svoboda <jiri@…> (2020-01-09 18:44:03)
git-committer:
Jiri Svoboda <jiri@…> (2020-01-09 16:44:57)
Message:

Moving windows by mouse drag

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/hid/display/seat.c

    r8e9781f ra40ae0d  
    215215/** Post pointing device event to the seat
    216216 *
     217 * Update pointer position and generate position event.
     218 *
    217219 * @param seat Seat
    218220 * @param event Event
     
    223225errno_t ds_seat_post_ptd_event(ds_seat_t *seat, ptd_event_t *event)
    224226{
     227        gfx_coord2_t npos;
    225228        ds_window_t *wnd;
    226         gfx_coord2_t npos;
     229        pos_event_t pevent;
     230        errno_t rc;
    227231
    228232        printf("ds_seat_post_ptd_event\n");
     233        wnd = ds_display_window_by_pos(seat->display, &seat->pntpos);
     234
    229235        /* Focus window on button press */
    230         if (event->type == PTD_PRESS) {
    231                 printf("PTD_PRESS\n");
    232                 wnd = ds_display_window_by_pos(seat->display, &seat->pntpos);
     236        if (event->type == PTD_PRESS && event->btn_num == 1) {
     237                printf("PTD_PRESS (button = %d)\n", event->btn_num);
    233238                if (wnd != NULL) {
    234239                        printf("set focus\n");
    235240                        ds_seat_set_focus(seat, wnd);
    236                         return EOK;
    237241                }
     242        }
     243
     244        if (event->type == PTD_PRESS || event->type == PTD_RELEASE) {
     245                pevent.pos_id = 0;
     246                pevent.type = (event->type == PTD_PRESS) ?
     247                    POS_PRESS : POS_RELEASE;
     248                pevent.btn_num = event->btn_num;
     249                pevent.hpos = seat->pntpos.x;
     250                pevent.vpos = seat->pntpos.y;
     251
     252                rc = ds_seat_post_pos_event(seat, &pevent);
     253                if (rc != EOK)
     254                        return rc;
    238255        }
    239256
    240257        if (event->type == PTD_MOVE) {
    241258                printf("PTD_MOVE\n");
     259
    242260                gfx_coord2_add(&seat->pntpos, &event->dmove, &npos);
    243261                if (npos.x < 0)
     
    253271                (void) ds_seat_draw_pointer(seat, false);
    254272                seat->pntpos = npos;
     273
     274                pevent.pos_id = 0;
     275                pevent.type = POS_UPDATE;
     276                pevent.btn_num = 0;
     277                pevent.hpos = seat->pntpos.x;
     278                pevent.vpos = seat->pntpos.y;
     279
     280                rc = ds_seat_post_pos_event(seat, &pevent);
     281                if (rc != EOK)
     282                        return rc;
     283
    255284                printf("draw pointer\n");
    256285                (void) ds_seat_draw_pointer(seat, true);
     
    260289}
    261290
     291/** Post position event to seat.
     292 *
     293 * Deliver event to relevant windows.
     294 *
     295 * @param seat Seat
     296 * @param event Position event
     297 */
     298errno_t ds_seat_post_pos_event(ds_seat_t *seat, pos_event_t *event)
     299{
     300        ds_window_t *wnd;
     301        errno_t rc;
     302
     303        printf("ds_seat_post_pos_event\n");
     304
     305        wnd = ds_display_window_by_pos(seat->display, &seat->pntpos);
     306        if (wnd != NULL) {
     307                printf("send event to window at pointer position\n");
     308                rc = ds_window_post_pos_event(wnd, event);
     309                if (rc != EOK)
     310                        return rc;
     311        }
     312
     313        if (seat->focus != wnd) {
     314                printf("send event to focused window\n");
     315
     316                rc = ds_window_post_pos_event(seat->focus, event);
     317                if (rc != EOK)
     318                        return rc;
     319        }
     320
     321        return EOK;
     322}
     323
    262324/** @}
    263325 */
Note: See TracChangeset for help on using the changeset viewer.