diff --git a/assets/config.conf b/assets/config.conf index bd65466b..e974787a 100644 --- a/assets/config.conf +++ b/assets/config.conf @@ -65,6 +65,7 @@ enable_floating_snap=0 snap_distance=30 cursor_size=24 drag_tile_to_tile=1 +drag_tile_small=1 # keyboard repeat_rate=25 diff --git a/docs/configuration/miscellaneous.md b/docs/configuration/miscellaneous.md index 3be0facc..de95f358 100644 --- a/docs/configuration/miscellaneous.md +++ b/docs/configuration/miscellaneous.md @@ -22,6 +22,7 @@ description: Advanced settings for XWayland, focus behavior, and system integrat | `warpcursor` | `1` | Warp the cursor to the center of the window when focus changes via keyboard. | | `cursor_hide_timeout` | `0` | Hide the cursor after `N` seconds of inactivity (`0` to disable). | | `drag_tile_to_tile` | `0` | Allow dragging a tiled window onto another to swap their positions. | +| `drag_tile_small` | `1` | Allow dragging a tiled window temporarily to small size.| | `drag_corner` | `3` | Corner for drag-to-tile detection (0: none, 1–3: corners, 4: auto-detect). | | `drag_warp_cursor` | `1` | Warp cursor when dragging windows to tile. | | `axis_bind_apply_timeout` | `100` | Timeout (ms) for detecting consecutive scroll events for axis bindings. | diff --git a/src/config/parse_config.h b/src/config/parse_config.h index 291730c5..e736b8bf 100644 --- a/src/config/parse_config.h +++ b/src/config/parse_config.h @@ -221,6 +221,7 @@ typedef struct { int32_t snap_distance; int32_t enable_floating_snap; int32_t drag_tile_to_tile; + int32_t drag_tile_small; uint32_t swipe_min_threshold; float focused_opacity; float unfocused_opacity; @@ -1388,6 +1389,8 @@ bool parse_option(Config *config, char *key, char *value) { config->enable_floating_snap = atoi(value); } else if (strcmp(key, "drag_tile_to_tile") == 0) { config->drag_tile_to_tile = atoi(value); + } else if (strcmp(key, "drag_tile_small") == 0) { + config->drag_tile_small = atoi(value); } else if (strcmp(key, "swipe_min_threshold") == 0) { config->swipe_min_threshold = atoi(value); } else if (strcmp(key, "focused_opacity") == 0) { @@ -3102,6 +3105,7 @@ void override_config(void) { config.drag_floating_refresh_interval = CLAMP_FLOAT(config.drag_floating_refresh_interval, 0.0f, 1000.0f); config.drag_tile_to_tile = CLAMP_INT(config.drag_tile_to_tile, 0, 1); + config.drag_tile_small = CLAMP_INT(config.drag_tile_small, 0, 1); config.allow_tearing = CLAMP_INT(config.allow_tearing, 0, 2); config.allow_shortcuts_inhibit = CLAMP_INT(config.allow_shortcuts_inhibit, 0, 1); @@ -3245,6 +3249,7 @@ void set_value_default() { config.no_border_when_single = 0; config.snap_distance = 30; config.drag_tile_to_tile = 0; + config.drag_tile_small = 1; config.enable_floating_snap = 0; config.swipe_min_threshold = 1; diff --git a/src/dispatch/bind_define.h b/src/dispatch/bind_define.h index 76903f88..2e65cb87 100644 --- a/src/dispatch/bind_define.h +++ b/src/dispatch/bind_define.h @@ -379,11 +379,20 @@ int32_t moveresize(const Arg *arg) { grabc->drag_to_tile = true; exit_scroller_stack(grabc); setfloating(grabc, 1); + grabc->drag_tile_float_backup_geom = grabc->float_geom; grabc->old_stack_inner_per = 0.0f; grabc->old_master_inner_per = 0.0f; set_size_per(grabc->mon, grabc); } + if (grabc && grabc->drag_to_tile && config.drag_tile_small) { + grabc->geom.x = cursor->x - 150; + grabc->geom.y = cursor->y - 150; + grabc->geom.width = 300; + grabc->geom.height = 300; + resize(grabc, grabc->geom, 1); + } + switch (cursor_mode = arg->ui) { case CurMove: diff --git a/src/mango.c b/src/mango.c index 466178d1..ace3c72a 100644 --- a/src/mango.c +++ b/src/mango.c @@ -425,6 +425,7 @@ struct Client { struct Client *prev_in_stack; bool enable_drop_area_draw; int32_t drop_direction; + struct wlr_box drag_tile_float_backup_geom; }; typedef struct { @@ -2332,6 +2333,7 @@ buttonpress(struct wl_listener *listener, void *data) { last_apply_drap_time = 0; if (tmpc->drag_to_tile && config.drag_tile_to_tile) { place_drag_tile_client(tmpc); + tmpc->float_geom = tmpc->drag_tile_float_backup_geom; } else { apply_window_snap(tmpc); }