mirror of
https://cagebreak.project-repo.co/cagebreak.git
synced 2026-08-09 15:19:11 +02:00
Add support for printing input/output identifiers
This commit is contained in:
parent
4ed9966d7b
commit
4c6bc1b59d
12 changed files with 131 additions and 30 deletions
23
cagebreak.c
23
cagebreak.c
|
|
@ -61,6 +61,8 @@
|
|||
#define WAIT_ANY -1
|
||||
#endif
|
||||
|
||||
bool show_info=false;
|
||||
|
||||
void
|
||||
set_sig_handler(int sig, void (*action)(int)) {
|
||||
struct sigaction act;
|
||||
|
|
@ -134,7 +136,8 @@ usage(FILE *file, const char *const cage) {
|
|||
" -D\t Turn on damage tracking debugging\n"
|
||||
#endif
|
||||
" -h\t Display this help message\n"
|
||||
" -v\t Show the version number and exit\n",
|
||||
" -v\t Show the version number and exit\n"
|
||||
" -s\t Show information about the current setup and exit\n",
|
||||
cage);
|
||||
}
|
||||
|
||||
|
|
@ -142,9 +145,9 @@ static bool
|
|||
parse_args(struct cg_server *server, int argc, char *argv[]) {
|
||||
int c;
|
||||
#ifdef DEBUG
|
||||
while((c = getopt(argc, argv, "rDhv")) != -1) {
|
||||
while((c = getopt(argc, argv, "rDhvs")) != -1) {
|
||||
#else
|
||||
while((c = getopt(argc, argv, "rhv")) != -1) {
|
||||
while((c = getopt(argc, argv, "rhvs")) != -1) {
|
||||
#endif
|
||||
switch(c) {
|
||||
case 'r':
|
||||
|
|
@ -164,6 +167,9 @@ parse_args(struct cg_server *server, int argc, char *argv[]) {
|
|||
case 'v':
|
||||
fprintf(stdout, "Cagebreak version " CG_VERSION "\n");
|
||||
exit(0);
|
||||
case 's':
|
||||
show_info=true;
|
||||
break;
|
||||
default:
|
||||
usage(stderr, argv[0]);
|
||||
return false;
|
||||
|
|
@ -528,6 +534,17 @@ main(int argc, char *argv[]) {
|
|||
wlr_xwayland_set_seat(xwayland, server.seat->seat);
|
||||
#endif
|
||||
|
||||
if(show_info) {
|
||||
char *msg=server_show_info(&server);
|
||||
if(msg != NULL) {
|
||||
fprintf(stderr,"%s",msg);
|
||||
free(msg);
|
||||
} else {
|
||||
wlr_log(WLR_ERROR,"Failed to get info on cagebreak setup\n");
|
||||
}
|
||||
exit(0);
|
||||
}
|
||||
|
||||
if(ipc_init(&server) != 0) {
|
||||
wlr_log(WLR_ERROR, "Failed to initialize IPC");
|
||||
ret = 1;
|
||||
|
|
|
|||
15
keybinding.c
15
keybinding.c
|
|
@ -701,6 +701,18 @@ keybinding_show_time(struct cg_server *server) {
|
|||
free(msg);
|
||||
}
|
||||
|
||||
void
|
||||
keybinding_show_info(struct cg_server *server) {
|
||||
char *msg=server_show_info(server);
|
||||
|
||||
if(!msg) {
|
||||
return;
|
||||
}
|
||||
|
||||
message_printf(server->curr_output, "%s", msg);
|
||||
free(msg);
|
||||
}
|
||||
|
||||
void
|
||||
keybinding_move_view_to_next_output(struct cg_server *server) {
|
||||
if(wl_list_length(&server->outputs) <= 1) {
|
||||
|
|
@ -940,6 +952,9 @@ run_action(enum keybinding_action action, struct cg_server *server,
|
|||
case KEYBINDING_SHOW_TIME:
|
||||
keybinding_show_time(server);
|
||||
break;
|
||||
case KEYBINDING_SHOW_INFO:
|
||||
keybinding_show_info(server);
|
||||
break;
|
||||
case KEYBINDING_RESIZE_TILE_HORIZONTAL:
|
||||
resize_tile(server, data.i, 0);
|
||||
break;
|
||||
|
|
|
|||
|
|
@ -39,6 +39,7 @@ enum keybinding_action {
|
|||
KEYBINDING_MOVE_VIEW_TO_WORKSPACE, // data.u is the desired workspace
|
||||
KEYBINDING_MOVE_VIEW_TO_NEXT_OUTPUT,
|
||||
KEYBINDING_SHOW_TIME,
|
||||
KEYBINDING_SHOW_INFO,
|
||||
|
||||
KEYBINDING_SWAP_LEFT,
|
||||
KEYBINDING_SWAP_RIGHT,
|
||||
|
|
|
|||
|
|
@ -94,7 +94,7 @@ by prepending a line with the # symbol.
|
|||
Split current tile horizontally
|
||||
|
||||
*input <identifier> <setting> <value>*
|
||||
Set the setting "<setting>" to "<value>" for device "<identifier>". The identifier can either be "\*" (wildcard), of the form "type:<device_type>" or the identifier of the device as printed for example by *cagebreak --show-info*. The supported input types are
|
||||
Set the setting "<setting>" to "<value>" for device "<identifier>". The identifier can either be "\*" (wildcard), of the form "type:<device_type>" or the identifier of the device as printed for example by *cagebreak -s*. The supported input types are
|
||||
- touchpad
|
||||
- pointer
|
||||
- keyboard
|
||||
|
|
@ -209,6 +209,10 @@ by prepending a line with the # symbol.
|
|||
*resizeup*
|
||||
Resize the current tile towards the top
|
||||
|
||||
*show_info*
|
||||
Display info about the current setup. In particular, print the identifiers
|
||||
of the available inputs and outputs.
|
||||
|
||||
*setmode <mode>*
|
||||
Set the default mode to <mode>
|
||||
|
||||
|
|
|
|||
25
message.c
25
message.c
|
|
@ -8,6 +8,7 @@
|
|||
#include <wlr/types/wlr_output_layout.h>
|
||||
#include <wlr/util/log.h>
|
||||
|
||||
#include "util.h"
|
||||
#include "message.h"
|
||||
#include "output.h"
|
||||
#include "pango.h"
|
||||
|
|
@ -32,14 +33,14 @@ to_cairo_subpixel_order(const enum wl_output_subpixel subpixel) {
|
|||
|
||||
struct wlr_texture *
|
||||
create_message_texture(const char *string, const struct cg_output *output) {
|
||||
const int PADDING = 2;
|
||||
const int MESSAGE_HEIGHT = 17 + 2 * PADDING;
|
||||
const int WIDTH_PADDING = 8;
|
||||
const int HEIGHT_PADDING = 2;
|
||||
const char *font = "pango:Monospace 10";
|
||||
|
||||
struct wlr_texture *texture;
|
||||
double scale = output->wlr_output->scale;
|
||||
int width = 0;
|
||||
int height = MESSAGE_HEIGHT * scale;
|
||||
int height = 0;
|
||||
|
||||
// We must use a non-nil cairo_t for cairo_set_font_options to work.
|
||||
// Therefore, we cannot use cairo_create(NULL).
|
||||
|
|
@ -59,8 +60,9 @@ create_message_texture(const char *string, const struct cg_output *output) {
|
|||
cairo_font_options_set_subpixel_order(
|
||||
fo, to_cairo_subpixel_order(output->wlr_output->subpixel));
|
||||
cairo_set_font_options(c, fo);
|
||||
get_text_size(c, font, &width, NULL, NULL, scale, "%s", string);
|
||||
width += 2 * PADDING;
|
||||
get_text_size(c, font, &width, &height, NULL, scale, "%s", string);
|
||||
width += 2 * WIDTH_PADDING;
|
||||
height += 2 * HEIGHT_PADDING;
|
||||
cairo_surface_destroy(dummy_surface);
|
||||
cairo_destroy(c);
|
||||
|
||||
|
|
@ -77,7 +79,7 @@ create_message_texture(const char *string, const struct cg_output *output) {
|
|||
cairo_set_line_width(cairo, 2);
|
||||
cairo_rectangle(cairo, 0, 0, width, height);
|
||||
cairo_stroke(cairo);
|
||||
cairo_move_to(cairo, PADDING, PADDING);
|
||||
cairo_move_to(cairo, WIDTH_PADDING, HEIGHT_PADDING);
|
||||
|
||||
pango_printf(cairo, font, scale, "%s", string);
|
||||
|
||||
|
|
@ -149,17 +151,14 @@ message_set_output(struct cg_output *output, const char *string,
|
|||
|
||||
void
|
||||
message_printf(struct cg_output *output, const char *fmt, ...) {
|
||||
uint16_t buf_len = 256;
|
||||
char *buffer = (char *)malloc(buf_len * sizeof(char));
|
||||
va_list ap;
|
||||
va_start(ap, fmt);
|
||||
char *buffer = malloc_vsprintf_va_list(fmt,ap);
|
||||
va_end(ap);
|
||||
if(buffer == NULL) {
|
||||
wlr_log(WLR_ERROR, "Failed to allocate buffer in message_printf");
|
||||
return;
|
||||
}
|
||||
va_list ap;
|
||||
|
||||
va_start(ap, fmt);
|
||||
vsnprintf(buffer, buf_len, fmt, ap);
|
||||
va_end(ap);
|
||||
|
||||
struct wlr_box *box = malloc(sizeof(struct wlr_box));
|
||||
if(box == NULL) {
|
||||
|
|
|
|||
2
pango.c
2
pango.c
|
|
@ -25,7 +25,7 @@ get_pango_layout(cairo_t *cairo, const char *font, const char *text,
|
|||
pango_attr_list_insert(attrs, pango_attr_scale_new(scale));
|
||||
PangoFontDescription *desc = pango_font_description_from_string(font);
|
||||
pango_layout_set_font_description(layout, desc);
|
||||
pango_layout_set_single_paragraph_mode(layout, 1);
|
||||
pango_layout_set_single_paragraph_mode(layout, false);
|
||||
pango_layout_set_attributes(layout, attrs);
|
||||
pango_attr_list_unref(attrs);
|
||||
pango_font_description_free(desc);
|
||||
|
|
|
|||
16
parse.c
16
parse.c
|
|
@ -11,23 +11,13 @@
|
|||
#include "output.h"
|
||||
#include "parse.h"
|
||||
#include "server.h"
|
||||
|
||||
char *
|
||||
malloc_vsprintf(const char *fmt, va_list ap) {
|
||||
va_list ap2;
|
||||
va_copy(ap2, ap);
|
||||
int len = vsnprintf(NULL, 0, fmt, ap);
|
||||
char *ret = malloc(sizeof(char) * (len + 1));
|
||||
vsnprintf(ret, len + 1, fmt, ap2);
|
||||
va_end(ap2);
|
||||
return ret;
|
||||
}
|
||||
#include "util.h"
|
||||
|
||||
char *
|
||||
log_error(const char *fmt, ...) {
|
||||
va_list args;
|
||||
va_start(args, fmt);
|
||||
char *ret = malloc_vsprintf(fmt, args);
|
||||
char *ret = malloc_vsprintf_va_list(fmt, args);
|
||||
if(ret != NULL) {
|
||||
wlr_log(WLR_ERROR, "%s", ret);
|
||||
}
|
||||
|
|
@ -631,6 +621,8 @@ parse_command(struct cg_server *server, struct keybinding *keybinding,
|
|||
keybinding->action = KEYBINDING_SPLIT_HORIZONTAL;
|
||||
} else if(strcmp(action, "quit") == 0) {
|
||||
keybinding->action = KEYBINDING_QUIT;
|
||||
} else if(strcmp(action, "show_info") == 0) {
|
||||
keybinding->action = KEYBINDING_SHOW_INFO;
|
||||
} else if(strcmp(action, "close") == 0) {
|
||||
keybinding->action = KEYBINDING_CLOSE_VIEW;
|
||||
} else if(strcmp(action, "focus") == 0) {
|
||||
|
|
|
|||
6
parse.h
6
parse.h
|
|
@ -4,9 +4,15 @@
|
|||
|
||||
#define MAX_LINE_SIZE 256
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
struct cg_server;
|
||||
|
||||
int
|
||||
parse_rc_line(struct cg_server *server, char *line, char **errstr);
|
||||
char *
|
||||
parse_malloc_vsprintf(const char *fmt, ...);
|
||||
char *
|
||||
parse_malloc_vsprintf_va_list(const char *fmt, va_list list);
|
||||
|
||||
#endif /* end of include guard PARSE_H */
|
||||
|
|
|
|||
36
server.c
36
server.c
|
|
@ -9,11 +9,17 @@
|
|||
|
||||
#define _POSIX_C_SOURCE 200809L
|
||||
|
||||
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#include <wayland-server-core.h>
|
||||
#include <wlr/types/wlr_box.h>
|
||||
#include <wlr/types/wlr_output.h>
|
||||
|
||||
#include "server.h"
|
||||
#include "input_manager.h"
|
||||
#include "output.h"
|
||||
#include "util.h"
|
||||
|
||||
void
|
||||
display_terminate(struct cg_server *server) {
|
||||
|
|
@ -35,3 +41,33 @@ get_mode_index_from_name(char *const *modes, const char *mode_name) {
|
|||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
char *
|
||||
server_show_info(struct cg_server *server) {
|
||||
char *output_str=strdup(""), *output_str_tmp;
|
||||
struct cg_output *output;
|
||||
wl_list_for_each(output, &server->outputs, link) {
|
||||
if(!output_str) {
|
||||
return NULL;
|
||||
}
|
||||
output_str_tmp=output_str;
|
||||
output_str=malloc_vsprintf("%s\t * %s\n",output_str, output->wlr_output->name);
|
||||
free(output_str_tmp);
|
||||
}
|
||||
char *input_str=strdup(""), *input_str_tmp;
|
||||
struct cg_input_device *input;
|
||||
wl_list_for_each(input, &server->input->devices, link) {
|
||||
if(!input_str) {
|
||||
return NULL;
|
||||
}
|
||||
input_str_tmp=input_str;
|
||||
if(strcmp(input->identifier,"") != 0) {
|
||||
input_str=malloc_vsprintf("%s\t * H:%s\n",input_str, input->identifier);
|
||||
}
|
||||
free(input_str_tmp);
|
||||
}
|
||||
char *ret=malloc_vsprintf("Outputs:\n%sInputs:\n%s",output_str,input_str);
|
||||
free(output_str);
|
||||
free(input_str);
|
||||
return ret;
|
||||
}
|
||||
|
|
|
|||
2
server.h
2
server.h
|
|
@ -61,5 +61,7 @@ void
|
|||
display_terminate(struct cg_server *server);
|
||||
int
|
||||
get_mode_index_from_name(char *const *modes, const char *mode_name);
|
||||
char *
|
||||
server_show_info(struct cg_server *server);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
22
util.c
22
util.c
|
|
@ -10,6 +10,7 @@
|
|||
#include <wlr/types/wlr_box.h>
|
||||
|
||||
#include "util.h"
|
||||
#include <stdlib.h>
|
||||
|
||||
int
|
||||
scale_length(int length, int offset, double scale) {
|
||||
|
|
@ -33,3 +34,24 @@ scale_box(struct wlr_box *box, double scale) {
|
|||
box->x = (int)round(box->x * scale);
|
||||
box->y = (int)round(box->y * scale);
|
||||
}
|
||||
|
||||
char *
|
||||
malloc_vsprintf_va_list(const char *fmt, va_list ap) {
|
||||
va_list ap2;
|
||||
va_copy(ap2, ap);
|
||||
int len = vsnprintf(NULL, 0, fmt, ap);
|
||||
char *ret = malloc(sizeof(char) * (len + 1));
|
||||
vsnprintf(ret, len + 1, fmt, ap2);
|
||||
va_end(ap2);
|
||||
return ret;
|
||||
}
|
||||
|
||||
char *
|
||||
malloc_vsprintf(const char *fmt, ...) {
|
||||
va_list args;
|
||||
va_start(args,fmt);
|
||||
char *ret=malloc_vsprintf_va_list(fmt,args);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
7
util.h
7
util.h
|
|
@ -1,6 +1,8 @@
|
|||
#ifndef CG_UTIL_H
|
||||
#define CG_UTIL_H
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
struct wlr_box;
|
||||
|
||||
/** Apply scale to a width or height. */
|
||||
|
|
@ -10,4 +12,9 @@ scale_length(int length, int offset, double scale);
|
|||
void
|
||||
scale_box(struct wlr_box *box, double scale);
|
||||
|
||||
char *
|
||||
malloc_vsprintf(const char *fmt, ...);
|
||||
char *
|
||||
malloc_vsprintf_va_list(const char *fmt, va_list list);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue