From 60518fe18e8b13a7e1fee0caf25e645b9c674a52 Mon Sep 17 00:00:00 2001 From: Kirill Primak Date: Sat, 8 Mar 2025 23:37:12 +0300 Subject: [PATCH] config: introduce quick-select-allow-editing If false while quick-select is true, the left mouse button acts in the same way as the right mouse button. --- dulcepan.cfg | 4 +++ src/config.c | 3 ++ src/dulcepan.h | 5 ++++ src/main.c | 3 ++ src/seat.c | 78 ++++++++++++++++++++++++++------------------------ 5 files changed, 56 insertions(+), 37 deletions(-) diff --git a/dulcepan.cfg b/dulcepan.cfg index f285564..ff8526f 100644 --- a/dulcepan.cfg +++ b/dulcepan.cfg @@ -33,6 +33,10 @@ animation-duration = 0 # or when a whole output is selected with a mouse button. quick-select = false +# If true, dulcepan will allow editing the current selection if quick-select is +# true. Has no effect if quick-select is false. +quick-select-allow-editing = true + # If true, dulcepan will remember selection between runs. # The state is stored at $XDG_CACHE_HOME/dulcepan. persistence = true diff --git a/src/config.c b/src/config.c index a965ac0..dede170 100644 --- a/src/config.c +++ b/src/config.c @@ -125,6 +125,7 @@ void dp_config_load(struct dp_state *state, const char *user_path) { .animation_duration = 0, .png_compression = 6, .quick_select = false, + .quick_select_allow_editing = true, .persistence = true, }; @@ -243,6 +244,8 @@ void dp_config_load(struct dp_state *state, const char *user_path) { load_int(value, line_idx, 0, 9, &config->png_compression); } else if (strcmp(key, "quick-select") == 0) { load_bool(value, line_idx, &config->quick_select); + } else if (strcmp(key, "quick-select-allow-editing") == 0) { + load_bool(value, line_idx, &config->quick_select_allow_editing); } else if (strcmp(key, "persistence") == 0) { load_bool(value, line_idx, &config->persistence); } else if (strcmp(key, "quit-key") == 0) { diff --git a/src/dulcepan.h b/src/dulcepan.h index 63d6e90..58debd4 100644 --- a/src/dulcepan.h +++ b/src/dulcepan.h @@ -171,7 +171,10 @@ struct dp_config { int animation_duration; // In milliseconds int png_compression; + bool quick_select; + bool quick_select_allow_editing; + bool persistence; }; @@ -208,6 +211,8 @@ struct dp_state { const char *output_path; // May be NULL enum dp_file_format output_format; + bool allow_selection_editing; + bool show_cursors; cairo_pattern_t *border_pattern; diff --git a/src/main.c b/src/main.c index 7e55949..3b52164 100644 --- a/src/main.c +++ b/src/main.c @@ -248,6 +248,9 @@ int main(int argc, char **argv) { state.xkb_context = xkb_context_new(XKB_CONTEXT_NO_FLAGS); struct dp_config *config = &state.config; + + state.allow_selection_editing = !config->quick_select || config->quick_select_allow_editing; + if (config->border_gradient != DP_BORDER_GRADIENT_NONE) { state.border_pattern = cairo_pattern_create_linear(0, 0, 1, 0); cairo_pattern_add_color_stop_rgba(state.border_pattern, 0, config->border_color[0], diff --git a/src/seat.c b/src/seat.c index da95470..50b7ce4 100644 --- a/src/seat.c +++ b/src/seat.c @@ -92,51 +92,55 @@ static const struct wl_keyboard_listener keyboard_listener = { .modifiers = keyboard_handle_modifiers, }; -static enum wp_cursor_shape_device_v1_shape get_cursor_shape(struct dp_selection *selection) { - switch (selection->action) { - case DP_SELECTION_ACTION_NONE: - break; - case DP_SELECTION_ACTION_RESIZING: - if (selection->width == 0 || selection->height == 0) { +static enum wp_cursor_shape_device_v1_shape get_cursor_shape(struct dp_state *state) { + if (state->allow_selection_editing) { + struct dp_selection *selection = &state->selection; + switch (selection->action) { + case DP_SELECTION_ACTION_NONE: break; - } - switch (selection->resize_edges) { - case DP_EDGE_TOP: - return WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_N_RESIZE; - case DP_EDGE_TOP | DP_EDGE_LEFT: - return WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_NW_RESIZE; - case DP_EDGE_TOP | DP_EDGE_RIGHT: - return WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_NE_RESIZE; - case DP_EDGE_BOTTOM: - return WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_S_RESIZE; - case DP_EDGE_BOTTOM | DP_EDGE_LEFT: - return WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_SW_RESIZE; - case DP_EDGE_BOTTOM | DP_EDGE_RIGHT: - return WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_SE_RESIZE; - case DP_EDGE_LEFT: - return WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_W_RESIZE; - case DP_EDGE_RIGHT: - return WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_E_RESIZE; - } - break; - case DP_SELECTION_ACTION_MOVING: - // XXX: this might have rounding issues but whatever - if (selection->x == 0 && selection->y == 0 && - selection->width == selection->output->effective_width && - selection->height == selection->output->effective_height) { - // Moving is impossible + case DP_SELECTION_ACTION_RESIZING: + if (selection->width == 0 || selection->height == 0) { + break; + } + switch (selection->resize_edges) { + case DP_EDGE_TOP: + return WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_N_RESIZE; + case DP_EDGE_TOP | DP_EDGE_LEFT: + return WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_NW_RESIZE; + case DP_EDGE_TOP | DP_EDGE_RIGHT: + return WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_NE_RESIZE; + case DP_EDGE_BOTTOM: + return WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_S_RESIZE; + case DP_EDGE_BOTTOM | DP_EDGE_LEFT: + return WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_SW_RESIZE; + case DP_EDGE_BOTTOM | DP_EDGE_RIGHT: + return WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_SE_RESIZE; + case DP_EDGE_LEFT: + return WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_W_RESIZE; + case DP_EDGE_RIGHT: + return WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_E_RESIZE; + } break; + case DP_SELECTION_ACTION_MOVING: + // XXX: this might have rounding issues but whatever + if (selection->x == 0 && selection->y == 0 && + selection->width == selection->output->effective_width && + selection->height == selection->output->effective_height) { + // Moving is impossible + break; + } + return WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_MOVE; } - return WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_MOVE; } + // The default cursor return WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_CROSSHAIR; } static void update_cursor(struct dp_seat *seat) { if (seat->cursor_shape_device != NULL) { - wp_cursor_shape_device_v1_set_shape(seat->cursor_shape_device, seat->pointer_serial, - get_cursor_shape(&seat->state->selection)); + wp_cursor_shape_device_v1_set_shape( + seat->cursor_shape_device, seat->pointer_serial, get_cursor_shape(seat->state)); } } @@ -197,8 +201,8 @@ static void pointer_handle_button(void *data, struct wl_pointer *wl_pointer, uin switch (button) { case BTN_LEFT: case BTN_RIGHT: - dp_select_start_interactive( - selection, seat->ptr_output, seat->ptr_x, seat->ptr_y, button == BTN_LEFT); + dp_select_start_interactive(selection, seat->ptr_output, seat->ptr_x, seat->ptr_y, + state->allow_selection_editing && button == BTN_LEFT); update_cursor(seat); break; case BTN_MIDDLE: