kiwmi_output:usable_area() and :on("usable_area_change")
This commit is contained in:
parent
b6e3492234
commit
a5e82d083c
5 changed files with 127 additions and 0 deletions
|
@ -9,6 +9,7 @@
|
||||||
#define KIWMI_DESKTOP_OUTPUT_H
|
#define KIWMI_DESKTOP_OUTPUT_H
|
||||||
|
|
||||||
#include <wayland-server.h>
|
#include <wayland-server.h>
|
||||||
|
#include <wlr/types/wlr_box.h>
|
||||||
|
|
||||||
struct kiwmi_output {
|
struct kiwmi_output {
|
||||||
struct wl_list link;
|
struct wl_list link;
|
||||||
|
@ -20,10 +21,12 @@ struct kiwmi_output {
|
||||||
struct wl_listener mode;
|
struct wl_listener mode;
|
||||||
|
|
||||||
struct wl_list layers[4]; // struct kiwmi_layer_surface::link
|
struct wl_list layers[4]; // struct kiwmi_layer_surface::link
|
||||||
|
struct wlr_box usable_area;
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
struct wl_signal destroy;
|
struct wl_signal destroy;
|
||||||
struct wl_signal resize;
|
struct wl_signal resize;
|
||||||
|
struct wl_signal usable_area_change;
|
||||||
} events;
|
} events;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -301,6 +301,12 @@ arrange_layers(struct kiwmi_output *output)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (memcmp(&usable_area, &output->usable_area, sizeof(output->usable_area))
|
||||||
|
!= 0) {
|
||||||
|
memcpy(&output->usable_area, &usable_area, sizeof(output->usable_area));
|
||||||
|
wl_signal_emit(&output->events.usable_area_change, output);
|
||||||
|
}
|
||||||
|
|
||||||
struct kiwmi_desktop *desktop = output->desktop;
|
struct kiwmi_desktop *desktop = output->desktop;
|
||||||
struct kiwmi_server *server = wl_container_of(desktop, server, desktop);
|
struct kiwmi_server *server = wl_container_of(desktop, server, desktop);
|
||||||
struct kiwmi_seat *seat = server->input.seat;
|
struct kiwmi_seat *seat = server->input.seat;
|
||||||
|
|
|
@ -219,6 +219,9 @@ output_create(struct wlr_output *wlr_output, struct kiwmi_desktop *desktop)
|
||||||
output->wlr_output = wlr_output;
|
output->wlr_output = wlr_output;
|
||||||
output->desktop = desktop;
|
output->desktop = desktop;
|
||||||
|
|
||||||
|
output->usable_area.width = wlr_output->width;
|
||||||
|
output->usable_area.height = wlr_output->height;
|
||||||
|
|
||||||
output->frame.notify = output_frame_notify;
|
output->frame.notify = output_frame_notify;
|
||||||
wl_signal_add(&wlr_output->events.frame, &output->frame);
|
wl_signal_add(&wlr_output->events.frame, &output->frame);
|
||||||
|
|
||||||
|
@ -280,6 +283,7 @@ new_output_notify(struct wl_listener *listener, void *data)
|
||||||
|
|
||||||
wl_signal_init(&output->events.destroy);
|
wl_signal_init(&output->events.destroy);
|
||||||
wl_signal_init(&output->events.resize);
|
wl_signal_init(&output->events.resize);
|
||||||
|
wl_signal_init(&output->events.usable_area_change);
|
||||||
|
|
||||||
wl_signal_emit(&desktop->events.new_output, output);
|
wl_signal_emit(&desktop->events.new_output, output);
|
||||||
}
|
}
|
||||||
|
|
|
@ -116,6 +116,35 @@ l_kiwmi_output_size(lua_State *L)
|
||||||
return 2;
|
return 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
l_kiwmi_output_usable_area(lua_State *L)
|
||||||
|
{
|
||||||
|
struct kiwmi_object *obj =
|
||||||
|
*(struct kiwmi_object **)luaL_checkudata(L, 1, "kiwmi_output");
|
||||||
|
|
||||||
|
if (!obj->valid) {
|
||||||
|
return luaL_error(L, "kiwmi_output no longer valid");
|
||||||
|
}
|
||||||
|
|
||||||
|
struct kiwmi_output *output = obj->object;
|
||||||
|
|
||||||
|
lua_newtable(L);
|
||||||
|
|
||||||
|
lua_pushinteger(L, output->usable_area.x);
|
||||||
|
lua_setfield(L, -2, "x");
|
||||||
|
|
||||||
|
lua_pushinteger(L, output->usable_area.y);
|
||||||
|
lua_setfield(L, -2, "y");
|
||||||
|
|
||||||
|
lua_pushinteger(L, output->usable_area.width);
|
||||||
|
lua_setfield(L, -2, "width");
|
||||||
|
|
||||||
|
lua_pushinteger(L, output->usable_area.height);
|
||||||
|
lua_setfield(L, -2, "height");
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
static const luaL_Reg kiwmi_output_methods[] = {
|
static const luaL_Reg kiwmi_output_methods[] = {
|
||||||
{"auto", l_kiwmi_output_auto},
|
{"auto", l_kiwmi_output_auto},
|
||||||
{"move", l_kiwmi_output_move},
|
{"move", l_kiwmi_output_move},
|
||||||
|
@ -123,6 +152,7 @@ static const luaL_Reg kiwmi_output_methods[] = {
|
||||||
{"on", luaK_callback_register_dispatch},
|
{"on", luaK_callback_register_dispatch},
|
||||||
{"pos", l_kiwmi_output_pos},
|
{"pos", l_kiwmi_output_pos},
|
||||||
{"size", l_kiwmi_output_size},
|
{"size", l_kiwmi_output_size},
|
||||||
|
{"usable_area", l_kiwmi_output_usable_area},
|
||||||
{NULL, NULL},
|
{NULL, NULL},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -192,6 +222,50 @@ kiwmi_output_on_resize_notify(struct wl_listener *listener, void *data)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
kiwmi_output_on_usable_area_change_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_output *output = data;
|
||||||
|
|
||||||
|
lua_rawgeti(L, LUA_REGISTRYINDEX, lc->callback_ref);
|
||||||
|
|
||||||
|
lua_newtable(L);
|
||||||
|
|
||||||
|
lua_pushcfunction(L, luaK_kiwmi_output_new);
|
||||||
|
lua_pushlightuserdata(L, server->lua);
|
||||||
|
lua_pushlightuserdata(L, output);
|
||||||
|
|
||||||
|
if (lua_pcall(L, 2, 1, 0)) {
|
||||||
|
wlr_log(WLR_ERROR, "%s", lua_tostring(L, -1));
|
||||||
|
lua_pop(L, 1);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
lua_setfield(L, -2, "output");
|
||||||
|
|
||||||
|
lua_pushinteger(L, output->usable_area.x);
|
||||||
|
lua_setfield(L, -2, "x");
|
||||||
|
|
||||||
|
lua_pushinteger(L, output->usable_area.y);
|
||||||
|
lua_setfield(L, -2, "y");
|
||||||
|
|
||||||
|
lua_pushinteger(L, output->usable_area.width);
|
||||||
|
lua_setfield(L, -2, "width");
|
||||||
|
|
||||||
|
lua_pushinteger(L, output->usable_area.height);
|
||||||
|
lua_setfield(L, -2, "height");
|
||||||
|
|
||||||
|
if (lua_pcall(L, 1, 0, 0)) {
|
||||||
|
wlr_log(WLR_ERROR, "%s", lua_tostring(L, -1));
|
||||||
|
lua_pop(L, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
l_kiwmi_output_on_destroy(lua_State *L)
|
l_kiwmi_output_on_destroy(lua_State *L)
|
||||||
{
|
{
|
||||||
|
@ -252,9 +326,40 @@ l_kiwmi_output_on_resize(lua_State *L)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
l_kiwmi_output_on_usable_area_change(lua_State *L)
|
||||||
|
{
|
||||||
|
struct kiwmi_object *obj =
|
||||||
|
*(struct kiwmi_object **)luaL_checkudata(L, 1, "kiwmi_output");
|
||||||
|
luaL_checktype(L, 2, LUA_TFUNCTION);
|
||||||
|
|
||||||
|
if (!obj->valid) {
|
||||||
|
return luaL_error(L, "kiwmi_output no longer valid");
|
||||||
|
}
|
||||||
|
|
||||||
|
struct kiwmi_output *output = obj->object;
|
||||||
|
struct kiwmi_desktop *desktop = output->desktop;
|
||||||
|
struct kiwmi_server *server = wl_container_of(desktop, server, desktop);
|
||||||
|
|
||||||
|
lua_pushcfunction(L, luaK_kiwmi_lua_callback_new);
|
||||||
|
lua_pushlightuserdata(L, server);
|
||||||
|
lua_pushvalue(L, 2);
|
||||||
|
lua_pushlightuserdata(L, kiwmi_output_on_usable_area_change_notify);
|
||||||
|
lua_pushlightuserdata(L, &output->events.usable_area_change);
|
||||||
|
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_output_events[] = {
|
static const luaL_Reg kiwmi_output_events[] = {
|
||||||
{"destroy", l_kiwmi_output_on_destroy},
|
{"destroy", l_kiwmi_output_on_destroy},
|
||||||
{"resize", l_kiwmi_output_on_resize},
|
{"resize", l_kiwmi_output_on_resize},
|
||||||
|
{"usable_area_change", l_kiwmi_output_on_usable_area_change},
|
||||||
{NULL, NULL},
|
{NULL, NULL},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -225,6 +225,10 @@ Returns two parameters: `x` and `y`.
|
||||||
Get the size of the output.
|
Get the size of the output.
|
||||||
Returns two parameters: `width` and `height`.
|
Returns two parameters: `width` and `height`.
|
||||||
|
|
||||||
|
#### output:usable_area()
|
||||||
|
|
||||||
|
Returns a table containing the `x`, `y`, `width` and `height` of the output's usable area, relative to the output's top left corner.
|
||||||
|
|
||||||
### Events
|
### Events
|
||||||
|
|
||||||
#### destroy
|
#### destroy
|
||||||
|
@ -237,6 +241,11 @@ Callback receives the output.
|
||||||
The output is being resized.
|
The output is being resized.
|
||||||
Callback receives a table containing the `output`, the new `width`, and the new `height`.
|
Callback receives a table containing the `output`, the new `width`, and the new `height`.
|
||||||
|
|
||||||
|
#### usable_area_change
|
||||||
|
|
||||||
|
The usable area of this output has changed, e.g. because the output was resized or the bars around it changed.
|
||||||
|
Callback receives a table containing the `output` and the new `x`, `y`, `width` and `height`.
|
||||||
|
|
||||||
## kiwmi_renderer
|
## kiwmi_renderer
|
||||||
|
|
||||||
Represents a rendering context, to draw on the output.
|
Represents a rendering context, to draw on the output.
|
||||||
|
|
Loading…
Reference in a new issue