Compare commits

...

2 commits

Author SHA1 Message Date
tokyo4j
5f981226c2 action: simplify action_prompt_command() 2025-10-11 23:53:02 +09:00
tokyo4j
2f96664670 build: fix build with libinput as a subproject
Unfortunately, has_header_symbol() doesn't work with internal dependencies.

Ref: https://github.com/mesonbuild/meson/issues/13553
2025-10-11 23:51:28 +09:00
5 changed files with 49 additions and 124 deletions

View file

@ -1,12 +0,0 @@
/* SPDX-License-Identifier: GPL-2.0-only */
#ifndef LABWC_ACTION_PROMPT_COMMAND_H
#define LABWC_ACTION_PROMPT_COMMAND_H
struct buf;
struct action;
struct theme;
void action_prompt_command(struct buf *buf, const char *format,
struct action *action, struct theme *theme);
#endif /* LABWC_ACTION_PROMPT_COMMAND_H */

View file

@ -127,7 +127,9 @@ conf_data.set10('HAVE_RSVG', have_rsvg)
conf_data.set10('HAVE_LIBSFDO', have_libsfdo) conf_data.set10('HAVE_LIBSFDO', have_libsfdo)
foreach sym : ['LIBINPUT_CONFIG_DRAG_LOCK_ENABLED_STICKY', 'LIBINPUT_CONFIG_3FG_DRAG_ENABLED_3FG'] foreach sym : ['LIBINPUT_CONFIG_DRAG_LOCK_ENABLED_STICKY', 'LIBINPUT_CONFIG_3FG_DRAG_ENABLED_3FG']
conf_data.set10('HAVE_' + sym, cc.has_header_symbol('libinput.h', sym, dependencies: input)) has_sym = input.type_name() != 'internal' \
and cc.has_header_symbol('libinput.h', sym, dependencies: input)
conf_data.set10('HAVE_' + sym, has_sym)
endforeach endforeach
if get_option('static_analyzer').enabled() if get_option('static_analyzer').enabled()

View file

@ -1,108 +0,0 @@
// SPDX-License-Identifier: GPL-2.0-only
#define _POSIX_C_SOURCE 200809L
#include "action-prompt-command.h"
#include <stdio.h>
#include <wlr/util/log.h>
#include "action.h"
#include "common/buf.h"
#include "theme.h"
#include "translate.h"
enum {
LAB_PROMPT_NONE = 0,
LAB_PROMPT_MESSAGE,
LAB_PROMPT_NO,
LAB_PROMPT_YES,
LAB_PROMPT_BG_COL,
LAB_PROMPT_TEXT_COL,
LAB_PROMPT_COUNT
};
typedef void field_conversion_type(struct buf *buf, struct action *action,
struct theme *theme);
struct field_converter {
const char fmt_char;
field_conversion_type *fn;
};
/* %m */
static void
set_message(struct buf *buf, struct action *action, struct theme *theme)
{
buf_add(buf, action_get_str(action, "message.prompt", "Choose wisely"));
}
/* %n */
static void
set_no(struct buf *buf, struct action *action, struct theme *theme)
{
buf_add(buf, _("No"));
}
/* %y */
static void
set_yes(struct buf *buf, struct action *action, struct theme *theme)
{
buf_add(buf, _("Yes"));
}
/* %b */
static void
set_bg_col(struct buf *buf, struct action *action, struct theme *theme)
{
buf_add_hex_color(buf, theme->osd_bg_color);
}
/* %t */
static void
set_text_col(struct buf *buf, struct action *action, struct theme *theme)
{
buf_add_hex_color(buf, theme->osd_label_text_color);
}
static const struct field_converter field_converter[LAB_PROMPT_COUNT] = {
[LAB_PROMPT_MESSAGE] = { 'm', set_message },
[LAB_PROMPT_NO] = { 'n', set_no },
[LAB_PROMPT_YES] = { 'y', set_yes },
[LAB_PROMPT_BG_COL] = { 'b', set_bg_col },
[LAB_PROMPT_TEXT_COL] = { 't', set_text_col },
};
void
action_prompt_command(struct buf *buf, const char *format,
struct action *action, struct theme *theme)
{
if (!format) {
wlr_log(WLR_ERROR, "missing format");
return;
}
for (const char *p = format; *p; p++) {
/*
* If we're not on a conversion specifier (like %m) then just
* keep adding it to the buffer
*/
if (*p != '%') {
buf_add_char(buf, *p);
continue;
}
/* Process the %* conversion specifier */
++p;
bool found = false;
for (unsigned char i = 0; i < LAB_PROMPT_COUNT; i++) {
if (*p == field_converter[i].fmt_char) {
field_converter[i].fn(buf, action, theme);
found = true;
break;
}
}
if (!found) {
wlr_log(WLR_ERROR,
"invalid prompt command conversion specifier '%c'", *p);
}
}
}

View file

@ -10,7 +10,6 @@
#include <wlr/types/wlr_scene.h> #include <wlr/types/wlr_scene.h>
#include <wlr/util/log.h> #include <wlr/util/log.h>
#include "action-prompt-codes.h" #include "action-prompt-codes.h"
#include "action-prompt-command.h"
#include "common/buf.h" #include "common/buf.h"
#include "common/macros.h" #include "common/macros.h"
#include "common/list.h" #include "common/list.h"
@ -30,6 +29,7 @@
#include "regions.h" #include "regions.h"
#include "ssd.h" #include "ssd.h"
#include "theme.h" #include "theme.h"
#include "translate.h"
#include "view.h" #include "view.h"
#include "workspaces.h" #include "workspaces.h"
@ -831,11 +831,55 @@ handle_view_destroy(struct wl_listener *listener, void *data)
prompt->view = NULL; prompt->view = NULL;
} }
static void
print_prompt_command(struct buf *buf, const char *format,
struct action *action, struct theme *theme)
{
assert(format);
for (const char *p = format; *p; p++) {
/*
* If we're not on a conversion specifier (like %m) then just
* keep adding it to the buffer
*/
if (*p != '%') {
buf_add_char(buf, *p);
continue;
}
/* Process the %* conversion specifier */
++p;
switch (*p) {
case 'm':
buf_add(buf, action_get_str(action,
"message.prompt", "Choose wisely"));
break;
case 'n':
buf_add(buf, _("No"));
break;
case 'y':
buf_add(buf, _("Yes"));
break;
case 'b':
buf_add_hex_color(buf, theme->osd_bg_color);
break;
case 't':
buf_add_hex_color(buf, theme->osd_label_text_color);
break;
default:
wlr_log(WLR_ERROR,
"invalid prompt command conversion specifier '%c'", *p);
break;
}
}
}
static void static void
action_prompt_create(struct view *view, struct server *server, struct action *action) action_prompt_create(struct view *view, struct server *server, struct action *action)
{ {
struct buf command = BUF_INIT; struct buf command = BUF_INIT;
action_prompt_command(&command, rc.prompt_command, action, rc.theme); print_prompt_command(&command, rc.prompt_command, action, rc.theme);
wlr_log(WLR_INFO, "prompt command: '%s'", command.data); wlr_log(WLR_INFO, "prompt command: '%s'", command.data);

View file

@ -1,6 +1,5 @@
labwc_sources = files( labwc_sources = files(
'action.c', 'action.c',
'action-prompt-command.c',
'buffer.c', 'buffer.c',
'debug.c', 'debug.c',
'desktop.c', 'desktop.c',