add select output option -o

solves #7
This commit is contained in:
sewn 2024-07-22 19:36:34 +03:00
parent a3f4ba90bd
commit f2fe31135b
No known key found for this signature in database
3 changed files with 42 additions and 5 deletions

View file

@ -11,6 +11,9 @@ static uint32_t colors[][2] = {
[SchemeOut] = { 0x000000ff, 0x00ffffff }, [SchemeOut] = { 0x000000ff, 0x00ffffff },
}; };
/* -m option; if provided, use that output instead of default output */
static const char *output_name = NULL;
/* -l option; if nonzero, use vertical list with given number of lines */ /* -l option; if nonzero, use vertical list with given number of lines */
static unsigned int lines = 0; static unsigned int lines = 0;

5
mew.1
View file

@ -6,6 +6,8 @@ mew \- menu for wayland
.RB [ \-beiv ] .RB [ \-beiv ]
.RB [ \-l .RB [ \-l
.IR lines ] .IR lines ]
.RB [ \-o
.IR output ]
.RB [ \-p .RB [ \-p
.IR prompt ] .IR prompt ]
.RB [ \-f .RB [ \-f
@ -47,6 +49,9 @@ matches menu items case insensitively.
.BI \-l " lines" .BI \-l " lines"
lists item vertically, with the given number of lines. lists item vertically, with the given number of lines.
.TP .TP
.BI \-o " output"
mew is displayed on the output name supplied.
.TP
.BI \-p " prompt" .BI \-p " prompt"
defines the prompt to be displayed to the left of the input field. defines the prompt to be displayed to the left of the input field.
.TP .TP

39
mew.c
View file

@ -72,6 +72,8 @@ static struct wl_surface *surface;
static struct wl_registry *registry; static struct wl_registry *registry;
static Drwl *drw; static Drwl *drw;
static struct wl_callback *frame_callback; static struct wl_callback *frame_callback;
/* default output supplied by compositor */
static struct wl_output *output = NULL;
#include "config.h" #include "config.h"
@ -729,7 +731,7 @@ layer_surface_handle_configure(void *data, struct zwlr_layer_surface_v1 *surface
{ {
mw = width * scale; mw = width * scale;
mh = height * scale; mh = height * scale;
inputw = mw / 3; /* input width: ~33% of monitor width */ inputw = mw / 3; /* input width: ~33% of output width */
zwlr_layer_surface_v1_ack_configure(surface, serial); zwlr_layer_surface_v1_ack_configure(surface, serial);
drawmenu(); drawmenu();
} }
@ -774,6 +776,24 @@ static const struct wl_data_device_listener data_device_listener = {
.selection = data_device_handle_selection, .selection = data_device_handle_selection,
}; };
static void
output_handle_name(void *data, struct wl_output *wl_output, const char *name)
{
if (output_name && !strcmp(name, output_name))
output = wl_output;
else
wl_output_destroy(wl_output);
}
static const struct wl_output_listener output_listener = {
.geometry = noop,
.mode = noop,
.done = noop,
.scale = noop,
.name = output_handle_name,
.description = noop,
};
static void static void
seat_handle_capabilities(void *data, struct wl_seat *wl_seat, enum wl_seat_capability caps) seat_handle_capabilities(void *data, struct wl_seat *wl_seat, enum wl_seat_capability caps)
{ {
@ -809,7 +829,11 @@ registry_handle_global(void *data, struct wl_registry *registry,
&wl_data_device_manager_interface, 3); &wl_data_device_manager_interface, 3);
else if (!strcmp(interface, xdg_activation_v1_interface.name)) else if (!strcmp(interface, xdg_activation_v1_interface.name))
activation = wl_registry_bind(registry, name, &xdg_activation_v1_interface, 1); activation = wl_registry_bind(registry, name, &xdg_activation_v1_interface, 1);
else if (!strcmp(interface, wl_seat_interface.name)) { else if (!strcmp(interface, wl_output_interface.name)) {
struct wl_output *output = wl_registry_bind(registry, name,
&wl_output_interface, 4);
wl_output_add_listener(output, &output_listener, NULL);
} else if (!strcmp(interface, wl_seat_interface.name)) {
seat = wl_registry_bind (registry, name, &wl_seat_interface, 4); seat = wl_registry_bind (registry, name, &wl_seat_interface, 4);
wl_seat_add_listener(seat, &seat_listener, NULL); wl_seat_add_listener(seat, &seat_listener, NULL);
} }
@ -857,7 +881,6 @@ run(void)
match(); match();
drawmenu(); drawmenu();
drawmenu();
while (running) { while (running) {
if (wl_display_prepare_read(display) < 0) if (wl_display_prepare_read(display) < 0)
@ -896,6 +919,7 @@ setup(void)
registry = wl_display_get_registry(display); registry = wl_display_get_registry(display);
wl_registry_add_listener(registry, &registry_listener, NULL); wl_registry_add_listener(registry, &registry_listener, NULL);
wl_display_roundtrip(display); wl_display_roundtrip(display);
wl_display_roundtrip(display); /* output & seat listeners */
if (!compositor) if (!compositor)
die("wl_compositor not available"); die("wl_compositor not available");
@ -906,6 +930,9 @@ setup(void)
if (!data_device_manager) if (!data_device_manager)
die("data_device_manager not available"); die("data_device_manager not available");
if (output_name && !output)
die("output %s not found", output_name);
data_device = wl_data_device_manager_get_data_device( data_device = wl_data_device_manager_get_data_device(
data_device_manager, seat); data_device_manager, seat);
wl_data_device_add_listener(data_device, &data_device_listener, NULL); wl_data_device_add_listener(data_device, &data_device_listener, NULL);
@ -919,7 +946,7 @@ setup(void)
wl_surface_add_listener(surface, &surface_listener, NULL); wl_surface_add_listener(surface, &surface_listener, NULL);
layer_surface = zwlr_layer_shell_v1_get_layer_surface(layer_shell, layer_surface = zwlr_layer_shell_v1_get_layer_surface(layer_shell,
surface, NULL, ZWLR_LAYER_SHELL_V1_LAYER_OVERLAY, "mew"); surface, output, ZWLR_LAYER_SHELL_V1_LAYER_OVERLAY, "mew");
zwlr_layer_surface_v1_set_size(layer_surface, 0, mh); zwlr_layer_surface_v1_set_size(layer_surface, 0, mh);
zwlr_layer_surface_v1_set_anchor(layer_surface, zwlr_layer_surface_v1_set_anchor(layer_surface,
(top ? ZWLR_LAYER_SURFACE_V1_ANCHOR_TOP : ZWLR_LAYER_SURFACE_V1_ANCHOR_BOTTOM ) | (top ? ZWLR_LAYER_SURFACE_V1_ANCHOR_TOP : ZWLR_LAYER_SURFACE_V1_ANCHOR_BOTTOM ) |
@ -936,7 +963,7 @@ setup(void)
static void static void
usage(void) usage(void)
{ {
die("usage: mew [-beiv] [-l lines] [-p prompt] [-f font]\n" die("usage: mew [-beiv] [-l lines] [-p prompt] [-f font] [-o output]\n"
" [-nb color] [-nf color] [-sb color] [-sf color]"); " [-nb color] [-nf color] [-sb color] [-sf color]");
} }
@ -961,6 +988,8 @@ main(int argc, char *argv[])
usage(); usage();
else if (!strcmp(argv[i], "-l")) else if (!strcmp(argv[i], "-l"))
lines = atoi(argv[++i]); lines = atoi(argv[++i]);
else if (!strcmp(argv[i], "-m"))
output_name = argv[++i];
else if (!strcmp(argv[i], "-p")) else if (!strcmp(argv[i], "-p"))
prompt = argv[++i]; prompt = argv[++i];
else if (!strcmp(argv[i], "-f")) else if (!strcmp(argv[i], "-f"))