HelenOS sources
This source file includes following definitions.
- test_ds_ev_pending
- PCUT_TEST
- PCUT_TEST
- PCUT_TEST
- PCUT_TEST
- PCUT_TEST
- PCUT_TEST
- PCUT_TEST
- PCUT_TEST
- PCUT_TEST
- PCUT_TEST
- PCUT_TEST
- PCUT_TEST
- PCUT_TEST
- PCUT_TEST
#include <disp_srv.h>
#include <errno.h>
#include <pcut/pcut.h>
#include <str.h>
#include "../client.h"
#include "../display.h"
#include "../seat.h"
#include "../window.h"
PCUT_INIT;
PCUT_TEST_SUITE(seat);
static void test_ds_ev_pending(void *);
static ds_client_cb_t test_ds_client_cb = {
.ev_pending = test_ds_ev_pending
};
static void test_ds_ev_pending(void *arg)
{
bool *called_cb = (bool *) arg;
*called_cb = true;
}
PCUT_TEST(set_focus)
{
ds_display_t *disp;
ds_client_t *client;
ds_seat_t *seat;
ds_window_t *wnd;
display_wnd_params_t params;
bool called_cb = false;
errno_t rc;
rc = ds_display_create(NULL, df_none, &disp);
PCUT_ASSERT_ERRNO_VAL(EOK, rc);
rc = ds_client_create(disp, &test_ds_client_cb, &called_cb, &client);
PCUT_ASSERT_ERRNO_VAL(EOK, rc);
rc = ds_seat_create(disp, "Alice", &seat);
PCUT_ASSERT_ERRNO_VAL(EOK, rc);
display_wnd_params_init(¶ms);
params.rect.p0.x = params.rect.p0.y = 0;
params.rect.p1.x = params.rect.p1.y = 1;
rc = ds_window_create(client, ¶ms, &wnd);
PCUT_ASSERT_ERRNO_VAL(EOK, rc);
ds_seat_set_focus(seat, wnd);
PCUT_ASSERT_EQUALS(wnd, seat->focus);
PCUT_ASSERT_TRUE(called_cb);
ds_window_destroy(wnd);
ds_seat_destroy(seat);
ds_client_destroy(client);
ds_display_destroy(disp);
}
PCUT_TEST(evac_focus_one_window)
{
ds_display_t *disp;
ds_client_t *client;
ds_seat_t *seat;
ds_window_t *wnd;
display_wnd_params_t params;
bool called_cb = false;
errno_t rc;
rc = ds_display_create(NULL, df_none, &disp);
PCUT_ASSERT_ERRNO_VAL(EOK, rc);
rc = ds_client_create(disp, &test_ds_client_cb, &called_cb, &client);
PCUT_ASSERT_ERRNO_VAL(EOK, rc);
rc = ds_seat_create(disp, "Alice", &seat);
PCUT_ASSERT_ERRNO_VAL(EOK, rc);
display_wnd_params_init(¶ms);
params.rect.p0.x = params.rect.p0.y = 0;
params.rect.p1.x = params.rect.p1.y = 1;
rc = ds_window_create(client, ¶ms, &wnd);
PCUT_ASSERT_ERRNO_VAL(EOK, rc);
ds_seat_set_focus(seat, wnd);
PCUT_ASSERT_EQUALS(wnd, seat->focus);
PCUT_ASSERT_TRUE(called_cb);
called_cb = false;
ds_seat_evac_wnd_refs(seat, wnd);
PCUT_ASSERT_NULL(seat->focus);
PCUT_ASSERT_TRUE(called_cb);
ds_window_destroy(wnd);
ds_seat_destroy(seat);
ds_client_destroy(client);
ds_display_destroy(disp);
}
PCUT_TEST(evac_popup)
{
ds_display_t *disp;
ds_client_t *client;
ds_seat_t *seat;
ds_window_t *wnd;
display_wnd_params_t params;
bool called_cb = false;
errno_t rc;
rc = ds_display_create(NULL, df_none, &disp);
PCUT_ASSERT_ERRNO_VAL(EOK, rc);
rc = ds_client_create(disp, &test_ds_client_cb, &called_cb, &client);
PCUT_ASSERT_ERRNO_VAL(EOK, rc);
rc = ds_seat_create(disp, "Alice", &seat);
PCUT_ASSERT_ERRNO_VAL(EOK, rc);
display_wnd_params_init(¶ms);
params.rect.p0.x = params.rect.p0.y = 0;
params.rect.p1.x = params.rect.p1.y = 1;
params.flags |= wndf_popup;
rc = ds_window_create(client, ¶ms, &wnd);
PCUT_ASSERT_ERRNO_VAL(EOK, rc);
PCUT_ASSERT_EQUALS(wnd, seat->popup);
ds_seat_evac_wnd_refs(seat, wnd);
PCUT_ASSERT_NULL(seat->popup);
ds_window_destroy(wnd);
ds_seat_destroy(seat);
ds_client_destroy(client);
ds_display_destroy(disp);
}
PCUT_TEST(unfocus_wnd_three_windows)
{
ds_display_t *disp;
ds_client_t *client;
ds_seat_t *seat;
ds_window_t *w0;
ds_window_t *w1;
ds_window_t *w2;
display_wnd_params_t params;
bool called_cb = false;
errno_t rc;
rc = ds_display_create(NULL, df_none, &disp);
PCUT_ASSERT_ERRNO_VAL(EOK, rc);
rc = ds_client_create(disp, &test_ds_client_cb, &called_cb, &client);
PCUT_ASSERT_ERRNO_VAL(EOK, rc);
rc = ds_seat_create(disp, "Alice", &seat);
PCUT_ASSERT_ERRNO_VAL(EOK, rc);
display_wnd_params_init(¶ms);
params.rect.p0.x = params.rect.p0.y = 0;
params.rect.p1.x = params.rect.p1.y = 1;
rc = ds_window_create(client, ¶ms, &w2);
PCUT_ASSERT_ERRNO_VAL(EOK, rc);
rc = ds_window_create(client, ¶ms, &w1);
PCUT_ASSERT_ERRNO_VAL(EOK, rc);
rc = ds_window_create(client, ¶ms, &w0);
PCUT_ASSERT_ERRNO_VAL(EOK, rc);
PCUT_ASSERT_EQUALS(w0, seat->focus);
ds_window_unfocus(w0);
PCUT_ASSERT_EQUALS(w1, seat->focus);
ds_window_destroy(w0);
ds_window_destroy(w1);
ds_seat_destroy(seat);
ds_client_destroy(client);
ds_display_destroy(disp);
}
PCUT_TEST(unfocus_wnd_two_windows_one_sys)
{
ds_display_t *disp;
ds_client_t *client;
ds_seat_t *seat;
ds_window_t *w0;
ds_window_t *w1;
ds_window_t *w2;
display_wnd_params_t params;
bool called_cb = false;
errno_t rc;
rc = ds_display_create(NULL, df_none, &disp);
PCUT_ASSERT_ERRNO_VAL(EOK, rc);
rc = ds_client_create(disp, &test_ds_client_cb, &called_cb, &client);
PCUT_ASSERT_ERRNO_VAL(EOK, rc);
rc = ds_seat_create(disp, "Alice", &seat);
PCUT_ASSERT_ERRNO_VAL(EOK, rc);
display_wnd_params_init(¶ms);
params.rect.p0.x = params.rect.p0.y = 0;
params.rect.p1.x = params.rect.p1.y = 1;
params.flags |= wndf_system;
rc = ds_window_create(client, ¶ms, &w2);
PCUT_ASSERT_ERRNO_VAL(EOK, rc);
params.flags &= ~wndf_system;
rc = ds_window_create(client, ¶ms, &w1);
PCUT_ASSERT_ERRNO_VAL(EOK, rc);
rc = ds_window_create(client, ¶ms, &w0);
PCUT_ASSERT_ERRNO_VAL(EOK, rc);
PCUT_ASSERT_EQUALS(w0, seat->focus);
ds_window_unfocus(w0);
PCUT_ASSERT_EQUALS(w1, seat->focus);
ds_window_destroy(w0);
ds_window_destroy(w1);
ds_seat_destroy(seat);
ds_client_destroy(client);
ds_display_destroy(disp);
}
PCUT_TEST(unfocus_wnd_one_window_one_sys)
{
ds_display_t *disp;
ds_client_t *client;
ds_seat_t *seat;
ds_window_t *w0;
ds_window_t *w1;
display_wnd_params_t params;
bool called_cb = false;
errno_t rc;
rc = ds_display_create(NULL, df_none, &disp);
PCUT_ASSERT_ERRNO_VAL(EOK, rc);
rc = ds_client_create(disp, &test_ds_client_cb, &called_cb, &client);
PCUT_ASSERT_ERRNO_VAL(EOK, rc);
rc = ds_seat_create(disp, "Alice", &seat);
PCUT_ASSERT_ERRNO_VAL(EOK, rc);
display_wnd_params_init(¶ms);
params.rect.p0.x = params.rect.p0.y = 0;
params.rect.p1.x = params.rect.p1.y = 1;
params.flags |= wndf_system;
rc = ds_window_create(client, ¶ms, &w1);
PCUT_ASSERT_ERRNO_VAL(EOK, rc);
params.flags &= ~wndf_system;
rc = ds_window_create(client, ¶ms, &w0);
PCUT_ASSERT_ERRNO_VAL(EOK, rc);
PCUT_ASSERT_EQUALS(w0, seat->focus);
ds_window_unfocus(w0);
PCUT_ASSERT_EQUALS(w1, seat->focus);
ds_window_destroy(w0);
ds_window_destroy(w1);
ds_seat_destroy(seat);
ds_client_destroy(client);
ds_display_destroy(disp);
}
PCUT_TEST(unfocus_wnd_one_window)
{
ds_display_t *disp;
ds_client_t *client;
ds_seat_t *seat;
ds_window_t *w0;
display_wnd_params_t params;
bool called_cb = false;
errno_t rc;
rc = ds_display_create(NULL, df_none, &disp);
PCUT_ASSERT_ERRNO_VAL(EOK, rc);
rc = ds_client_create(disp, &test_ds_client_cb, &called_cb, &client);
PCUT_ASSERT_ERRNO_VAL(EOK, rc);
rc = ds_seat_create(disp, "Alice", &seat);
PCUT_ASSERT_ERRNO_VAL(EOK, rc);
display_wnd_params_init(¶ms);
params.rect.p0.x = params.rect.p0.y = 0;
params.rect.p1.x = params.rect.p1.y = 1;
rc = ds_window_create(client, ¶ms, &w0);
PCUT_ASSERT_ERRNO_VAL(EOK, rc);
PCUT_ASSERT_EQUALS(w0, seat->focus);
ds_window_unfocus(w0);
PCUT_ASSERT_EQUALS(NULL, seat->focus);
ds_window_destroy(w0);
ds_seat_destroy(seat);
ds_client_destroy(client);
ds_display_destroy(disp);
}
PCUT_TEST(switch_focus_two_windows)
{
ds_display_t *disp;
ds_client_t *client;
ds_seat_t *seat;
ds_window_t *w0;
ds_window_t *w1;
display_wnd_params_t params;
bool called_cb = false;
errno_t rc;
rc = ds_display_create(NULL, df_none, &disp);
PCUT_ASSERT_ERRNO_VAL(EOK, rc);
rc = ds_client_create(disp, &test_ds_client_cb, &called_cb, &client);
PCUT_ASSERT_ERRNO_VAL(EOK, rc);
rc = ds_seat_create(disp, "Alice", &seat);
PCUT_ASSERT_ERRNO_VAL(EOK, rc);
display_wnd_params_init(¶ms);
params.rect.p0.x = params.rect.p0.y = 0;
params.rect.p1.x = params.rect.p1.y = 1;
rc = ds_window_create(client, ¶ms, &w1);
PCUT_ASSERT_ERRNO_VAL(EOK, rc);
rc = ds_window_create(client, ¶ms, &w0);
PCUT_ASSERT_ERRNO_VAL(EOK, rc);
ds_seat_set_focus(seat, w1);
PCUT_ASSERT_EQUALS(w1, seat->focus);
PCUT_ASSERT_TRUE(called_cb);
called_cb = false;
ds_seat_switch_focus(seat);
PCUT_ASSERT_EQUALS(w0, seat->focus);
PCUT_ASSERT_TRUE(called_cb);
ds_window_destroy(w0);
ds_window_destroy(w1);
ds_seat_destroy(seat);
ds_client_destroy(client);
ds_display_destroy(disp);
}
PCUT_TEST(switch_focus_one_window)
{
ds_display_t *disp;
ds_client_t *client;
ds_seat_t *seat;
ds_window_t *wnd;
display_wnd_params_t params;
bool called_cb = false;
errno_t rc;
rc = ds_display_create(NULL, df_none, &disp);
PCUT_ASSERT_ERRNO_VAL(EOK, rc);
rc = ds_client_create(disp, &test_ds_client_cb, &called_cb, &client);
PCUT_ASSERT_ERRNO_VAL(EOK, rc);
rc = ds_seat_create(disp, "Alice", &seat);
PCUT_ASSERT_ERRNO_VAL(EOK, rc);
display_wnd_params_init(¶ms);
params.rect.p0.x = params.rect.p0.y = 0;
params.rect.p1.x = params.rect.p1.y = 1;
rc = ds_window_create(client, ¶ms, &wnd);
PCUT_ASSERT_ERRNO_VAL(EOK, rc);
ds_seat_set_focus(seat, wnd);
PCUT_ASSERT_EQUALS(wnd, seat->focus);
PCUT_ASSERT_TRUE(called_cb);
called_cb = false;
ds_seat_switch_focus(seat);
PCUT_ASSERT_EQUALS(wnd, seat->focus);
PCUT_ASSERT_FALSE(called_cb);
ds_window_destroy(wnd);
ds_seat_destroy(seat);
ds_client_destroy(client);
ds_display_destroy(disp);
}
PCUT_TEST(post_kbd_event_alt_tab)
{
ds_display_t *disp;
ds_client_t *client;
ds_seat_t *seat;
ds_window_t *w0;
ds_window_t *w1;
display_wnd_params_t params;
bool called_cb = false;
kbd_event_t event;
errno_t rc;
rc = ds_display_create(NULL, df_none, &disp);
PCUT_ASSERT_ERRNO_VAL(EOK, rc);
rc = ds_client_create(disp, &test_ds_client_cb, &called_cb, &client);
PCUT_ASSERT_ERRNO_VAL(EOK, rc);
rc = ds_seat_create(disp, "Alice", &seat);
PCUT_ASSERT_ERRNO_VAL(EOK, rc);
display_wnd_params_init(¶ms);
params.rect.p0.x = params.rect.p0.y = 0;
params.rect.p1.x = params.rect.p1.y = 1;
rc = ds_window_create(client, ¶ms, &w1);
PCUT_ASSERT_ERRNO_VAL(EOK, rc);
rc = ds_window_create(client, ¶ms, &w0);
PCUT_ASSERT_ERRNO_VAL(EOK, rc);
ds_seat_set_focus(seat, w1);
PCUT_ASSERT_EQUALS(w1, seat->focus);
PCUT_ASSERT_TRUE(called_cb);
called_cb = false;
event.type = KEY_PRESS;
event.mods = KM_ALT;
event.key = KC_TAB;
rc = ds_seat_post_kbd_event(seat, &event);
PCUT_ASSERT_ERRNO_VAL(EOK, rc);
PCUT_ASSERT_EQUALS(w0, seat->focus);
PCUT_ASSERT_TRUE(called_cb);
ds_window_destroy(w0);
ds_window_destroy(w1);
ds_seat_destroy(seat);
ds_client_destroy(client);
ds_display_destroy(disp);
}
PCUT_TEST(post_kbd_event_regular)
{
ds_display_t *disp;
ds_client_t *client;
ds_seat_t *seat;
ds_window_t *wnd;
display_wnd_params_t params;
kbd_event_t event;
ds_window_t *rwindow;
display_wnd_ev_t revent;
bool called_cb = false;
errno_t rc;
rc = ds_display_create(NULL, df_none, &disp);
PCUT_ASSERT_ERRNO_VAL(EOK, rc);
rc = ds_client_create(disp, &test_ds_client_cb, &called_cb, &client);
PCUT_ASSERT_ERRNO_VAL(EOK, rc);
rc = ds_seat_create(disp, "Alice", &seat);
PCUT_ASSERT_ERRNO_VAL(EOK, rc);
display_wnd_params_init(¶ms);
params.rect.p0.x = params.rect.p0.y = 0;
params.rect.p1.x = params.rect.p1.y = 1;
rc = ds_window_create(client, ¶ms, &wnd);
PCUT_ASSERT_ERRNO_VAL(EOK, rc);
ds_seat_set_focus(seat, wnd);
PCUT_ASSERT_EQUALS(wnd, seat->focus);
PCUT_ASSERT_TRUE(called_cb);
rc = ds_client_get_event(client, &rwindow, &revent);
PCUT_ASSERT_ERRNO_VAL(EOK, rc);
called_cb = false;
event.type = KEY_PRESS;
event.key = KC_ENTER;
event.mods = 0;
event.c = L'\0';
rc = ds_client_get_event(client, &rwindow, &revent);
PCUT_ASSERT_ERRNO_VAL(ENOENT, rc);
rc = ds_seat_post_kbd_event(seat, &event);
PCUT_ASSERT_ERRNO_VAL(EOK, rc);
PCUT_ASSERT_TRUE(called_cb);
rc = ds_client_get_event(client, &rwindow, &revent);
PCUT_ASSERT_ERRNO_VAL(EOK, rc);
PCUT_ASSERT_EQUALS(wnd, rwindow);
PCUT_ASSERT_EQUALS(wev_kbd, revent.etype);
PCUT_ASSERT_EQUALS(event.type, revent.ev.kbd.type);
PCUT_ASSERT_EQUALS(event.key, revent.ev.kbd.key);
PCUT_ASSERT_EQUALS(event.mods, revent.ev.kbd.mods);
PCUT_ASSERT_EQUALS(event.c, revent.ev.kbd.c);
rc = ds_client_get_event(client, &rwindow, &revent);
PCUT_ASSERT_ERRNO_VAL(ENOENT, rc);
ds_window_destroy(wnd);
ds_seat_destroy(seat);
ds_client_destroy(client);
ds_display_destroy(disp);
}
PCUT_TEST(post_ptd_event_wnd_switch)
{
ds_display_t *disp;
ds_seat_t *seat;
ds_client_t *client;
ds_window_t *w0, *w1;
display_wnd_params_t params;
ptd_event_t event;
bool called_cb = false;
errno_t rc;
rc = ds_display_create(NULL, df_none, &disp);
PCUT_ASSERT_ERRNO_VAL(EOK, rc);
rc = ds_seat_create(disp, "Alice", &seat);
PCUT_ASSERT_ERRNO_VAL(EOK, rc);
rc = ds_client_create(disp, &test_ds_client_cb, &called_cb, &client);
PCUT_ASSERT_ERRNO_VAL(EOK, rc);
disp->rect.p1.x = 500;
disp->rect.p1.y = 500;
display_wnd_params_init(¶ms);
params.rect.p0.x = params.rect.p0.y = 0;
params.rect.p1.x = params.rect.p1.y = 1;
rc = ds_window_create(client, ¶ms, &w0);
PCUT_ASSERT_ERRNO_VAL(EOK, rc);
rc = ds_window_create(client, ¶ms, &w1);
PCUT_ASSERT_ERRNO_VAL(EOK, rc);
w0->dpos.x = 10;
w0->dpos.y = 10;
w1->dpos.x = 400;
w1->dpos.y = 400;
PCUT_ASSERT_TRUE(called_cb);
called_cb = false;
ds_seat_set_focus(seat, w0);
event.type = PTD_MOVE;
event.dmove.x = 400;
event.dmove.y = 400;
rc = ds_seat_post_ptd_event(seat, &event);
PCUT_ASSERT_ERRNO_VAL(EOK, rc);
PCUT_ASSERT_TRUE(called_cb);
called_cb = false;
event.type = PTD_PRESS;
event.btn_num = 1;
rc = ds_seat_post_ptd_event(seat, &event);
PCUT_ASSERT_ERRNO_VAL(EOK, rc);
PCUT_ASSERT_TRUE(called_cb);
called_cb = false;
PCUT_ASSERT_EQUALS(w1, seat->focus);
event.type = PTD_MOVE;
event.dmove.x = -400 + 10;
event.dmove.y = -400 + 10;
rc = ds_seat_post_ptd_event(seat, &event);
PCUT_ASSERT_ERRNO_VAL(EOK, rc);
PCUT_ASSERT_TRUE(called_cb);
called_cb = false;
event.type = PTD_PRESS;
event.btn_num = 1;
rc = ds_seat_post_ptd_event(seat, &event);
PCUT_ASSERT_ERRNO_VAL(EOK, rc);
PCUT_ASSERT_TRUE(called_cb);
called_cb = false;
PCUT_ASSERT_EQUALS(w0, seat->focus);
ds_window_destroy(w0);
ds_window_destroy(w1);
ds_client_destroy(client);
ds_seat_destroy(seat);
ds_display_destroy(disp);
}
PCUT_TEST(post_pos_event)
{
}
PCUT_TEST(set_wm_cursor)
{
ds_display_t *disp;
ds_client_t *client;
ds_seat_t *seat;
bool called_cb = false;
errno_t rc;
rc = ds_display_create(NULL, df_none, &disp);
PCUT_ASSERT_ERRNO_VAL(EOK, rc);
rc = ds_client_create(disp, &test_ds_client_cb, &called_cb, &client);
PCUT_ASSERT_ERRNO_VAL(EOK, rc);
rc = ds_seat_create(disp, "Alice", &seat);
PCUT_ASSERT_ERRNO_VAL(EOK, rc);
ds_seat_set_wm_cursor(seat, disp->cursor[dcurs_size_ud]);
ds_seat_set_wm_cursor(seat, NULL);
ds_seat_destroy(seat);
ds_client_destroy(client);
ds_display_destroy(disp);
}
PCUT_EXPORT(seat);
HelenOS homepage, sources at GitHub