Add view:title, view:app_id, view:pid

This commit is contained in:
buffet 2020-01-19 23:36:12 +00:00
parent 4c72a91afe
commit 43f5de3d7c
4 changed files with 109 additions and 0 deletions

View file

@ -11,10 +11,17 @@
#include <stdbool.h>
#include <stdlib.h>
#include <unistd.h>
#include <wayland-server.h>
#include <wlr/types/wlr_xdg_shell.h>
#include <wlr/util/edges.h>
enum kiwmi_view_prop {
KIWMI_VIEW_PROP_APP_ID,
KIWMI_VIEW_PROP_TITLE,
};
enum kiwmi_view_type {
KIWMI_VIEW_XDG_SHELL,
};
@ -59,10 +66,13 @@ struct kiwmi_view_impl {
struct kiwmi_view *view,
wlr_surface_iterator_func_t iterator,
void *user_data);
pid_t (*get_pid)(struct kiwmi_view *view);
void (
*get_size)(struct kiwmi_view *view, uint32_t *width, uint32_t *height);
void (*set_activated)(struct kiwmi_view *view, bool activated);
void (*set_size)(struct kiwmi_view *view, uint32_t width, uint32_t height);
const char *(
*get_string_prop)(struct kiwmi_view *view, enum kiwmi_view_prop prop);
void (*set_tiled)(struct kiwmi_view *view, enum wlr_edges edges);
struct wlr_surface *(*surface_at)(
struct kiwmi_view *view,
@ -77,7 +87,10 @@ void view_for_each_surface(
struct kiwmi_view *view,
wlr_surface_iterator_func_t iterator,
void *user_data);
pid_t view_get_pid(struct kiwmi_view *view);
void view_get_size(struct kiwmi_view *view, uint32_t *width, uint32_t *height);
const char *view_get_app_id(struct kiwmi_view *view);
const char *view_get_title(struct kiwmi_view *view);
void view_set_activated(struct kiwmi_view *view, bool activated);
void view_set_size(struct kiwmi_view *view, uint32_t width, uint32_t height);
void view_set_tiled(struct kiwmi_view *view, enum wlr_edges edges);

View file

@ -34,6 +34,16 @@ view_for_each_surface(
}
}
pid_t
view_get_pid(struct kiwmi_view *view)
{
if (view->impl->get_pid) {
return view->impl->get_pid(view);
}
return -1;
}
void
view_get_size(struct kiwmi_view *view, uint32_t *width, uint32_t *height)
{
@ -42,6 +52,26 @@ view_get_size(struct kiwmi_view *view, uint32_t *width, uint32_t *height)
}
}
const char *
view_get_app_id(struct kiwmi_view *view)
{
if (view->impl->get_string_prop) {
return view->impl->get_string_prop(view, KIWMI_VIEW_PROP_APP_ID);
}
return NULL;
}
const char *
view_get_title(struct kiwmi_view *view)
{
if (view->impl->get_string_prop) {
return view->impl->get_string_prop(view, KIWMI_VIEW_PROP_TITLE);
}
return NULL;
}
void
view_set_activated(struct kiwmi_view *view, bool activated)
{

View file

@ -7,6 +7,8 @@
#include "desktop/xdg_shell.h"
#include <unistd.h>
#include <wlr/types/wlr_xdg_shell.h>
#include <wlr/util/edges.h>
#include <wlr/util/log.h>
@ -104,6 +106,17 @@ xdg_shell_view_for_each_surface(
wlr_xdg_surface_for_each_surface(view->xdg_surface, iterator, user_data);
}
static pid_t
xdg_shell_view_get_pid(struct kiwmi_view *view)
{
struct wl_client *client = view->xdg_surface->client->client;
pid_t pid;
wl_client_get_credentials(client, &pid, NULL, NULL);
return pid;
}
static void
xdg_shell_view_get_size(
struct kiwmi_view *view,
@ -116,6 +129,21 @@ xdg_shell_view_get_size(
*height = geom->height;
}
static const char *
xdg_shell_view_get_string_prop(
struct kiwmi_view *view,
enum kiwmi_view_prop prop)
{
switch (prop) {
case KIWMI_VIEW_PROP_APP_ID:
return view->xdg_surface->toplevel->title;
case KIWMI_VIEW_PROP_TITLE:
return view->xdg_surface->toplevel->title;
default:
return NULL;
}
}
static void
xdg_shell_view_set_activated(struct kiwmi_view *view, bool activated)
{
@ -151,7 +179,9 @@ xdg_shell_view_surface_at(
static const struct kiwmi_view_impl xdg_shell_view_impl = {
.close = xdg_shell_view_close,
.for_each_surface = xdg_shell_view_for_each_surface,
.get_pid = xdg_shell_view_get_pid,
.get_size = xdg_shell_view_get_size,
.get_string_prop = xdg_shell_view_get_string_prop,
.set_activated = xdg_shell_view_set_activated,
.set_size = xdg_shell_view_set_size,
.set_tiled = xdg_shell_view_set_tiled,

View file

@ -19,6 +19,17 @@
#include "luak/kiwmi_lua_callback.h"
#include "server.h"
static int
l_kiwmi_view_app_id(lua_State *L)
{
struct kiwmi_view *view =
*(struct kiwmi_view **)luaL_checkudata(L, 1, "kiwmi_view");
lua_pushstring(L, view_get_app_id(view));
return 1;
}
static int
l_kiwmi_view_close(lua_State *L)
{
@ -82,6 +93,17 @@ l_kiwmi_view_move(lua_State *L)
return 0;
}
static int
l_kiwmi_view_pid(lua_State *L)
{
struct kiwmi_view *view =
*(struct kiwmi_view **)luaL_checkudata(L, 1, "kiwmi_view");
lua_pushinteger(L, view_get_pid(view));
return 1;
}
static int
l_kiwmi_view_pos(lua_State *L)
{
@ -194,18 +216,32 @@ l_kiwmi_view_tiled(lua_State *L)
return luaL_argerror(L, 2, "expected bool or table");
}
static int
l_kiwmi_view_title(lua_State *L)
{
struct kiwmi_view *view =
*(struct kiwmi_view **)luaL_checkudata(L, 1, "kiwmi_view");
lua_pushstring(L, view_get_app_id(view));
return 1;
}
static const luaL_Reg kiwmi_view_methods[] = {
{"app_id", l_kiwmi_view_app_id},
{"close", l_kiwmi_view_close},
{"focus", l_kiwmi_view_focus},
{"hidden", l_kiwmi_view_hidden},
{"hide", l_kiwmi_view_hide},
{"move", l_kiwmi_view_move},
{"on", luaK_callback_register_dispatch},
{"pid", l_kiwmi_view_pid},
{"pos", l_kiwmi_view_pos},
{"resize", l_kiwmi_view_resize},
{"show", l_kiwmi_view_show},
{"size", l_kiwmi_view_size},
{"tiled", l_kiwmi_view_tiled},
{"title", l_kiwmi_view_title},
{NULL, NULL},
};