forked from external/yambar
bar/wayland: track XDG outputs, as this gets us the monitor identifiers
This commit is contained in:
parent
c226f9f0c8
commit
c6fd99f005
2 changed files with 77 additions and 10 deletions
|
@ -67,11 +67,25 @@ add_custom_command(
|
||||||
VERBATIM
|
VERBATIM
|
||||||
MAIN_DEPENDENCY /usr/share/wayland-protocols/stable/xdg-shell/xdg-shell.xml
|
MAIN_DEPENDENCY /usr/share/wayland-protocols/stable/xdg-shell/xdg-shell.xml
|
||||||
)
|
)
|
||||||
|
add_custom_command(
|
||||||
|
OUTPUT xdg-output-unstable-v1-client.h
|
||||||
|
COMMAND wayland-scanner client-header < /usr/share/wayland-protocols/unstable/xdg-output/xdg-output-unstable-v1.xml > xdg-output-unstable-v1-client.h
|
||||||
|
VERBATIM
|
||||||
|
MAIN_DEPENDENCY /usr/share/wayland-protocols/unstable/xdg-output/xdg-output-unstable-v1.xml
|
||||||
|
)
|
||||||
|
add_custom_command(
|
||||||
|
OUTPUT xdg-output-unstable-v1.c
|
||||||
|
COMMAND wayland-scanner private-code < /usr/share/wayland-protocols/unstable/xdg-output/xdg-output-unstable-v1.xml > xdg-output-unstable-v1.c
|
||||||
|
VERBATIM
|
||||||
|
MAIN_DEPENDENCY /usr/share/wayland-protocols/unstable/xdg-output/xdg-output-unstable-v1.xml
|
||||||
|
)
|
||||||
|
|
||||||
add_library(wayland-protocols STATIC EXCLUDE_FROM_ALL
|
add_library(wayland-protocols STATIC EXCLUDE_FROM_ALL
|
||||||
wlr-layer-shell-unstable-v1-client.h
|
wlr-layer-shell-unstable-v1-client.h
|
||||||
wlr-layer-shell-unstable-v1.c
|
wlr-layer-shell-unstable-v1.c
|
||||||
xdg-shell.c
|
xdg-shell.c
|
||||||
|
xdg-output-unstable-v1-client.h
|
||||||
|
xdg-output-unstable-v1.c
|
||||||
)
|
)
|
||||||
target_include_directories(wayland-protocols PUBLIC ${CMAKE_CURRENT_BINARY_DIR})
|
target_include_directories(wayland-protocols PUBLIC ${CMAKE_CURRENT_BINARY_DIR})
|
||||||
|
|
||||||
|
|
|
@ -14,6 +14,7 @@
|
||||||
#include <wayland-client.h>
|
#include <wayland-client.h>
|
||||||
#include <wayland-cursor.h>
|
#include <wayland-cursor.h>
|
||||||
|
|
||||||
|
#include <xdg-output-unstable-v1-client.h>
|
||||||
#include <wlr-layer-shell-unstable-v1-client.h>
|
#include <wlr-layer-shell-unstable-v1-client.h>
|
||||||
|
|
||||||
#define LOG_MODULE "bar:wayland"
|
#define LOG_MODULE "bar:wayland"
|
||||||
|
@ -37,6 +38,7 @@ struct monitor {
|
||||||
struct wayland_backend *backend;
|
struct wayland_backend *backend;
|
||||||
|
|
||||||
struct wl_output *output;
|
struct wl_output *output;
|
||||||
|
struct zxdg_output_v1 *xdg;
|
||||||
char *name;
|
char *name;
|
||||||
|
|
||||||
int x;
|
int x;
|
||||||
|
@ -55,7 +57,6 @@ struct wayland_backend {
|
||||||
struct wl_display *display;
|
struct wl_display *display;
|
||||||
struct wl_registry *registry;
|
struct wl_registry *registry;
|
||||||
struct wl_compositor *compositor;
|
struct wl_compositor *compositor;
|
||||||
struct wl_output *output;
|
|
||||||
struct wl_surface *surface;
|
struct wl_surface *surface;
|
||||||
struct zwlr_layer_shell_v1 *layer_shell;
|
struct zwlr_layer_shell_v1 *layer_shell;
|
||||||
struct zwlr_layer_surface_v1 *layer_surface;
|
struct zwlr_layer_surface_v1 *layer_surface;
|
||||||
|
@ -77,6 +78,8 @@ struct wayland_backend {
|
||||||
tll(struct monitor) monitors;
|
tll(struct monitor) monitors;
|
||||||
const struct monitor *monitor;
|
const struct monitor *monitor;
|
||||||
|
|
||||||
|
struct zxdg_output_manager_v1 *xdg_output_manager;
|
||||||
|
|
||||||
/* TODO: set directly in bar instead */
|
/* TODO: set directly in bar instead */
|
||||||
int width, height;
|
int width, height;
|
||||||
|
|
||||||
|
@ -236,7 +239,6 @@ seat_handle_capabilities(void *data, struct wl_seat *wl_seat,
|
||||||
static void
|
static void
|
||||||
seat_handle_name(void *data, struct wl_seat *wl_seat, const char *name)
|
seat_handle_name(void *data, struct wl_seat *wl_seat, const char *name)
|
||||||
{
|
{
|
||||||
//printf("seat: name=%s\n", name);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct wl_seat_listener seat_listener = {
|
static const struct wl_seat_listener seat_listener = {
|
||||||
|
@ -250,21 +252,17 @@ output_geometry(void *data, struct wl_output *wl_output, int32_t x, int32_t y,
|
||||||
int32_t subpixel, const char *make, const char *model,
|
int32_t subpixel, const char *make, const char *model,
|
||||||
int32_t transform)
|
int32_t transform)
|
||||||
{
|
{
|
||||||
//printf("output: %s (%s): %dx%dmm %dx%d\n",
|
|
||||||
// make, model, physical_width, physical_height, x, y);
|
|
||||||
struct monitor *mon = data;
|
struct monitor *mon = data;
|
||||||
mon->x = x;
|
mon->x = x;
|
||||||
mon->y = y;
|
mon->y = y;
|
||||||
mon->width_mm = physical_width;
|
mon->width_mm = physical_width;
|
||||||
mon->height_mm = physical_height;
|
mon->height_mm = physical_height;
|
||||||
mon->name = NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
output_mode(void *data, struct wl_output *wl_output, uint32_t flags,
|
output_mode(void *data, struct wl_output *wl_output, uint32_t flags,
|
||||||
int32_t width, int32_t height, int32_t refresh)
|
int32_t width, int32_t height, int32_t refresh)
|
||||||
{
|
{
|
||||||
//printf("output: %dx%d\n", width, height);
|
|
||||||
struct monitor *mon = data;
|
struct monitor *mon = data;
|
||||||
mon->width_px = width;
|
mon->width_px = width;
|
||||||
mon->height_px = height;
|
mon->height_px = height;
|
||||||
|
@ -278,7 +276,6 @@ output_done(void *data, struct wl_output *wl_output)
|
||||||
static void
|
static void
|
||||||
output_scale(void *data, struct wl_output *wl_output, int32_t factor)
|
output_scale(void *data, struct wl_output *wl_output, int32_t factor)
|
||||||
{
|
{
|
||||||
//printf("output: scale: %d\n", factor);
|
|
||||||
struct monitor *mon = data;
|
struct monitor *mon = data;
|
||||||
mon->scale = factor;
|
mon->scale = factor;
|
||||||
}
|
}
|
||||||
|
@ -291,6 +288,46 @@ static const struct wl_output_listener output_listener = {
|
||||||
.scale = &output_scale,
|
.scale = &output_scale,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static void
|
||||||
|
xdg_output_handle_logical_position(void *data,
|
||||||
|
struct zxdg_output_v1 *xdg_output,
|
||||||
|
int32_t x, int32_t y)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
xdg_output_handle_logical_size(void *data, struct zxdg_output_v1 *xdg_output,
|
||||||
|
int32_t width, int32_t height)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
xdg_output_handle_done(void *data, struct zxdg_output_v1 *xdg_output)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
xdg_output_handle_name(void *data, struct zxdg_output_v1 *xdg_output,
|
||||||
|
const char *name)
|
||||||
|
{
|
||||||
|
struct monitor *mon = data;
|
||||||
|
mon->name = strdup(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
xdg_output_handle_description(void *data, struct zxdg_output_v1 *xdg_output,
|
||||||
|
const char *description)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct zxdg_output_v1_listener xdg_output_listener = {
|
||||||
|
.logical_position = xdg_output_handle_logical_position,
|
||||||
|
.logical_size = xdg_output_handle_logical_size,
|
||||||
|
.done = xdg_output_handle_done,
|
||||||
|
.name = xdg_output_handle_name,
|
||||||
|
.description = xdg_output_handle_description,
|
||||||
|
};
|
||||||
|
|
||||||
static void
|
static void
|
||||||
handle_global(void *data, struct wl_registry *registry,
|
handle_global(void *data, struct wl_registry *registry,
|
||||||
uint32_t name, const char *interface, uint32_t version)
|
uint32_t name, const char *interface, uint32_t version)
|
||||||
|
@ -314,7 +351,15 @@ handle_global(void *data, struct wl_registry *registry,
|
||||||
tll_push_back(backend->monitors, ((struct monitor){
|
tll_push_back(backend->monitors, ((struct monitor){
|
||||||
.backend = backend,
|
.backend = backend,
|
||||||
.output = output}));
|
.output = output}));
|
||||||
wl_output_add_listener(output, &output_listener, &tll_back(backend->monitors));
|
|
||||||
|
struct monitor *mon = &tll_back(backend->monitors);
|
||||||
|
wl_output_add_listener(output, &output_listener, mon);
|
||||||
|
|
||||||
|
assert(backend->xdg_output_manager != NULL);
|
||||||
|
mon->xdg = zxdg_output_manager_v1_get_xdg_output(
|
||||||
|
backend->xdg_output_manager, mon->output);
|
||||||
|
|
||||||
|
zxdg_output_v1_add_listener(mon->xdg, &xdg_output_listener, mon);
|
||||||
wl_display_roundtrip(backend->display);
|
wl_display_roundtrip(backend->display);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -328,6 +373,11 @@ handle_global(void *data, struct wl_registry *registry,
|
||||||
wl_seat_add_listener(backend->seat, &seat_listener, backend);
|
wl_seat_add_listener(backend->seat, &seat_listener, backend);
|
||||||
wl_display_roundtrip(backend->display);
|
wl_display_roundtrip(backend->display);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
else if (strcmp(interface, zxdg_output_manager_v1_interface.name) == 0) {
|
||||||
|
backend->xdg_output_manager = wl_registry_bind(
|
||||||
|
registry, name, &zxdg_output_manager_v1_interface, 2);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -445,7 +495,10 @@ setup(struct bar *_bar)
|
||||||
mon->name, mon->width_px, mon->height_px,
|
mon->name, mon->width_px, mon->height_px,
|
||||||
mon->x, mon->y, mon->width_mm, mon->height_mm);
|
mon->x, mon->y, mon->width_mm, mon->height_mm);
|
||||||
|
|
||||||
/* TODO */
|
/* TODO: detect primary output when user hasn't specified a monitor */
|
||||||
|
if (bar->monitor == NULL)
|
||||||
|
backend->monitor = mon;
|
||||||
|
else if (strcmp(bar->monitor, mon->name) == 0)
|
||||||
backend->monitor = mon;
|
backend->monitor = mon;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue