Add scoll event
This commit is contained in:
parent
6f32d5f7fd
commit
c94804588e
4 changed files with 91 additions and 7 deletions
|
@ -44,6 +44,7 @@ struct kiwmi_cursor {
|
||||||
struct wl_signal button_down;
|
struct wl_signal button_down;
|
||||||
struct wl_signal button_up;
|
struct wl_signal button_up;
|
||||||
struct wl_signal motion;
|
struct wl_signal motion;
|
||||||
|
struct wl_signal scroll;
|
||||||
} events;
|
} events;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -59,6 +60,13 @@ struct kiwmi_cursor_motion_event {
|
||||||
double newy;
|
double newy;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct kiwmi_cursor_scroll_event {
|
||||||
|
const char *device_name;
|
||||||
|
bool is_vertical;
|
||||||
|
double length;
|
||||||
|
bool handled;
|
||||||
|
};
|
||||||
|
|
||||||
struct kiwmi_cursor *cursor_create(
|
struct kiwmi_cursor *cursor_create(
|
||||||
struct kiwmi_server *server,
|
struct kiwmi_server *server,
|
||||||
struct wlr_output_layout *output_layout);
|
struct wlr_output_layout *output_layout);
|
||||||
|
|
|
@ -210,13 +210,24 @@ cursor_axis_notify(struct wl_listener *listener, void *data)
|
||||||
struct kiwmi_input *input = &server->input;
|
struct kiwmi_input *input = &server->input;
|
||||||
struct wlr_event_pointer_axis *event = data;
|
struct wlr_event_pointer_axis *event = data;
|
||||||
|
|
||||||
wlr_seat_pointer_notify_axis(
|
struct kiwmi_cursor_scroll_event new_event = {
|
||||||
input->seat->seat,
|
.device_name = event->device->name,
|
||||||
event->time_msec,
|
.is_vertical = event->orientation == WLR_AXIS_ORIENTATION_VERTICAL,
|
||||||
event->orientation,
|
.length = event->delta,
|
||||||
event->delta,
|
.handled = false,
|
||||||
event->delta_discrete,
|
};
|
||||||
event->source);
|
|
||||||
|
wl_signal_emit(&cursor->events.scroll, &new_event);
|
||||||
|
|
||||||
|
if (!new_event.handled) {
|
||||||
|
wlr_seat_pointer_notify_axis(
|
||||||
|
input->seat->seat,
|
||||||
|
event->time_msec,
|
||||||
|
event->orientation,
|
||||||
|
event->delta,
|
||||||
|
event->delta_discrete,
|
||||||
|
event->source);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -277,6 +288,7 @@ cursor_create(
|
||||||
wl_signal_init(&cursor->events.button_down);
|
wl_signal_init(&cursor->events.button_down);
|
||||||
wl_signal_init(&cursor->events.button_up);
|
wl_signal_init(&cursor->events.button_up);
|
||||||
wl_signal_init(&cursor->events.motion);
|
wl_signal_init(&cursor->events.motion);
|
||||||
|
wl_signal_init(&cursor->events.scroll);
|
||||||
|
|
||||||
return cursor;
|
return cursor;
|
||||||
}
|
}
|
||||||
|
|
|
@ -162,6 +162,36 @@ kiwmi_cursor_on_motion_notify(struct wl_listener *listener, void *data)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
kiwmi_cursor_on_scroll_notify(struct wl_listener *listener, void *data)
|
||||||
|
{
|
||||||
|
struct kiwmi_lua_callback *lc = wl_container_of(listener, lc, listener);
|
||||||
|
struct kiwmi_server *server = lc->server;
|
||||||
|
lua_State *L = server->lua->L;
|
||||||
|
struct kiwmi_cursor_scroll_event *event = data;
|
||||||
|
|
||||||
|
lua_rawgeti(L, LUA_REGISTRYINDEX, lc->callback_ref);
|
||||||
|
|
||||||
|
lua_newtable(L);
|
||||||
|
|
||||||
|
lua_pushstring(L, event->device_name);
|
||||||
|
lua_setfield(L, -2, "device");
|
||||||
|
|
||||||
|
lua_pushnumber(L, event->is_vertical);
|
||||||
|
lua_setfield(L, -2, "vertical");
|
||||||
|
|
||||||
|
lua_pushnumber(L, event->length);
|
||||||
|
lua_setfield(L, -2, "length");
|
||||||
|
|
||||||
|
if (lua_pcall(L, 1, 1, 0)) {
|
||||||
|
wlr_log(WLR_ERROR, "%s", lua_tostring(L, -1));
|
||||||
|
lua_pop(L, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
event->handled |= lua_toboolean(L, -1);
|
||||||
|
lua_pop(L, 1);
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
l_kiwmi_cursor_on_button_down(lua_State *L)
|
l_kiwmi_cursor_on_button_down(lua_State *L)
|
||||||
{
|
{
|
||||||
|
@ -237,10 +267,36 @@ l_kiwmi_cursor_on_motion(lua_State *L)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
l_kiwmi_cursor_on_scroll(lua_State *L)
|
||||||
|
{
|
||||||
|
struct kiwmi_object *obj =
|
||||||
|
*(struct kiwmi_object **)luaL_checkudata(L, 1, "kiwmi_cursor");
|
||||||
|
luaL_checktype(L, 2, LUA_TFUNCTION);
|
||||||
|
|
||||||
|
struct kiwmi_cursor *cursor = obj->object;
|
||||||
|
struct kiwmi_server *server = cursor->server;
|
||||||
|
|
||||||
|
lua_pushcfunction(L, luaK_kiwmi_lua_callback_new);
|
||||||
|
lua_pushlightuserdata(L, server);
|
||||||
|
lua_pushvalue(L, 2);
|
||||||
|
lua_pushlightuserdata(L, kiwmi_cursor_on_scroll_notify);
|
||||||
|
lua_pushlightuserdata(L, &cursor->events.scroll);
|
||||||
|
lua_pushlightuserdata(L, obj);
|
||||||
|
|
||||||
|
if (lua_pcall(L, 5, 0, 0)) {
|
||||||
|
wlr_log(WLR_ERROR, "%s", lua_tostring(L, -1));
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static const luaL_Reg kiwmi_cursor_events[] = {
|
static const luaL_Reg kiwmi_cursor_events[] = {
|
||||||
{"button_down", l_kiwmi_cursor_on_button_down},
|
{"button_down", l_kiwmi_cursor_on_button_down},
|
||||||
{"button_up", l_kiwmi_cursor_on_button_up},
|
{"button_up", l_kiwmi_cursor_on_button_up},
|
||||||
{"motion", l_kiwmi_cursor_on_motion},
|
{"motion", l_kiwmi_cursor_on_motion},
|
||||||
|
{"scroll", l_kiwmi_cursor_on_scroll},
|
||||||
{NULL, NULL},
|
{NULL, NULL},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -149,6 +149,14 @@ The compositor will not forward it to the view under the cursor.
|
||||||
The cursor got moved.
|
The cursor got moved.
|
||||||
Callback receives a table containing `oldx`, `oldy`, `newx`, and `newy`.
|
Callback receives a table containing `oldx`, `oldy`, `newx`, and `newy`.
|
||||||
|
|
||||||
|
#### scroll
|
||||||
|
|
||||||
|
Something was scrolled.
|
||||||
|
The callback receives a table containing `device` with the device name, `vertical` indicating whether it was a vertical or horizontal scroll, and `length` with the length of the vector (negative for left of up scrolls).
|
||||||
|
|
||||||
|
The callback is supposed to return `true` if the event was handled.
|
||||||
|
The compositor will not forward it to the view under the cursor.
|
||||||
|
|
||||||
## kiwmi_keyboard
|
## kiwmi_keyboard
|
||||||
|
|
||||||
A handle to a keyboard.
|
A handle to a keyboard.
|
||||||
|
|
Loading…
Reference in a new issue