merge: Arena size
This commit is contained in:
@@ -0,0 +1,2 @@
|
|||||||
|
schema: spec-driven
|
||||||
|
created: 2026-11-08
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
# Design
|
||||||
|
|
||||||
|
## Context
|
||||||
|
|
||||||
|
Output is already bound and a listener exists, but mode dimensions are ignored. See proposal.md.
|
||||||
|
|
||||||
|
## Goals / Non-Goals
|
||||||
|
|
||||||
|
**Goals:**
|
||||||
|
- Store output mode width/height.
|
||||||
|
- Compute default logical size = 0.8 * mode / scale.
|
||||||
|
- Keep grid resize/preserve behavior.
|
||||||
|
|
||||||
|
**Non-Goals:**
|
||||||
|
- Fullscreen mode.
|
||||||
|
- Dynamic output hotplug handling beyond first output.
|
||||||
|
|
||||||
|
## Decisions
|
||||||
|
|
||||||
|
### D1: Output mode storage
|
||||||
|
- Store `output_width`, `output_height` from `wl_output.mode`.
|
||||||
|
|
||||||
|
### D2: Default size computation
|
||||||
|
- After roundtrip, if output info available, set logical size; else fallback 1024x576.
|
||||||
|
|
||||||
|
### D3: Fallback
|
||||||
|
- 1024x576 logical (~80% of 1280x720) when no output info.
|
||||||
|
|
||||||
|
## Open Questions
|
||||||
|
|
||||||
|
None.
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
# Proposal
|
||||||
|
|
||||||
|
## Why
|
||||||
|
|
||||||
|
The current default arena is 400×400 logical pixels (50×50 cells), too small for comfortable exploration. The arena should occupy about 80% of a FullHD screen, adapting to the actual output size and scale.
|
||||||
|
|
||||||
|
## What Changes
|
||||||
|
|
||||||
|
- Use `wl_output` mode dimensions to compute a default logical window size equal to 80% of the output, divided by the active scale.
|
||||||
|
- Keep the 8 px logical cell size; grid dimensions derive from the logical window size.
|
||||||
|
- Preserve resizable behavior and grid recalculation on resize.
|
||||||
|
- Provide a sensible fallback when output info is unavailable.
|
||||||
|
|
||||||
|
## Capabilities
|
||||||
|
|
||||||
|
### New Capabilities
|
||||||
|
|
||||||
|
- `arena-sizing`: output-aware default arena size (~80% of screen) with fallback and resize handling.
|
||||||
|
|
||||||
|
### Modified Capabilities
|
||||||
|
|
||||||
|
None.
|
||||||
|
|
||||||
|
## Impact
|
||||||
|
|
||||||
|
- Affected code: `wlgol.c` (output mode handling, default size calculation, canvas/grid resize).
|
||||||
|
- No new dependencies.
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
# Spec Delta
|
||||||
|
|
||||||
|
## Purpose
|
||||||
|
|
||||||
|
Defines how the arena default size is derived from the output and how resizing affects the grid.
|
||||||
|
|
||||||
|
## ADDED Requirements
|
||||||
|
|
||||||
|
### Requirement: Default arena is about 80% of output
|
||||||
|
The system SHALL compute the default logical window size as 80% of the output mode dimensions divided by the active scale.
|
||||||
|
|
||||||
|
#### Scenario: Output available
|
||||||
|
- **WHEN** output mode and scale are known at startup
|
||||||
|
- **THEN** the default logical window size is approximately 80% of the output
|
||||||
|
|
||||||
|
### Requirement: Fallback when output unknown
|
||||||
|
The system SHALL use a fallback default size when output info is unavailable.
|
||||||
|
|
||||||
|
#### Scenario: No output info
|
||||||
|
- **WHEN** output mode is not reported
|
||||||
|
- **THEN** a fallback logical size is used
|
||||||
|
|
||||||
|
### Requirement: Cell size remains 8 logical pixels
|
||||||
|
The system SHALL keep an 8 logical pixel cell size.
|
||||||
|
|
||||||
|
#### Scenario: Grid dimensions
|
||||||
|
- **WHEN** the logical window size is known
|
||||||
|
- **THEN** grid columns and rows are logical size divided by 8
|
||||||
|
|
||||||
|
### Requirement: Resizable window
|
||||||
|
The system SHALL allow the window to be resized by the user.
|
||||||
|
|
||||||
|
#### Scenario: Resize
|
||||||
|
- **WHEN** the user resizes the window
|
||||||
|
- **THEN** the grid dimensions update accordingly
|
||||||
|
|
||||||
|
### Requirement: Grid preserved on resize
|
||||||
|
The system SHALL preserve overlapping cells when the grid dimensions change.
|
||||||
|
|
||||||
|
#### Scenario: Enlarge
|
||||||
|
- **WHEN** the window grows
|
||||||
|
- **THEN** existing cells within the old bounds remain
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
# Tasks
|
||||||
|
|
||||||
|
## 1. Output handling
|
||||||
|
|
||||||
|
- [x] 1.1 Store output mode dimensions in the output listener.
|
||||||
|
- [x] 1.2 Compute default logical window size as 80% of output divided by scale, with fallback.
|
||||||
|
|
||||||
|
## 2. Verification
|
||||||
|
|
||||||
|
- [x] 2.1 Build and run, verifying window is ~80% of screen.
|
||||||
|
- [x] 2.2 Resize window and verify grid updates.
|
||||||
@@ -0,0 +1,41 @@
|
|||||||
|
# arena-sizing Specification
|
||||||
|
|
||||||
|
## Purpose
|
||||||
|
Defines how the arena default size is derived from the output and how resizing affects the grid.
|
||||||
|
|
||||||
|
## Requirements
|
||||||
|
|
||||||
|
### Requirement: Default arena is about 80% of output
|
||||||
|
The system SHALL compute the default logical window size as 80% of the output mode dimensions divided by the active scale.
|
||||||
|
|
||||||
|
#### Scenario: Output available
|
||||||
|
- **WHEN** output mode and scale are known at startup
|
||||||
|
- **THEN** the default logical window size is approximately 80% of the output
|
||||||
|
|
||||||
|
### Requirement: Fallback when output unknown
|
||||||
|
The system SHALL use a fallback default size when output info is unavailable.
|
||||||
|
|
||||||
|
#### Scenario: No output info
|
||||||
|
- **WHEN** output mode is not reported
|
||||||
|
- **THEN** a fallback logical size is used
|
||||||
|
|
||||||
|
### Requirement: Cell size remains 8 logical pixels
|
||||||
|
The system SHALL keep an 8 logical pixel cell size.
|
||||||
|
|
||||||
|
#### Scenario: Grid dimensions
|
||||||
|
- **WHEN** the logical window size is known
|
||||||
|
- **THEN** grid columns and rows are logical size divided by 8
|
||||||
|
|
||||||
|
### Requirement: Resizable window
|
||||||
|
The system SHALL allow the window to be resized by the user.
|
||||||
|
|
||||||
|
#### Scenario: Resize
|
||||||
|
- **WHEN** the user resizes the window
|
||||||
|
- **THEN** the grid dimensions update accordingly
|
||||||
|
|
||||||
|
### Requirement: Grid preserved on resize
|
||||||
|
The system SHALL preserve overlapping cells when the grid dimensions change.
|
||||||
|
|
||||||
|
#### Scenario: Enlarge
|
||||||
|
- **WHEN** the window grows
|
||||||
|
- **THEN** existing cells within the old bounds remain
|
||||||
@@ -31,6 +31,8 @@ struct xdg_wm_base *xdg_shell;
|
|||||||
struct wl_seat *wl_seat;
|
struct wl_seat *wl_seat;
|
||||||
struct wl_output *wl_output = NULL;
|
struct wl_output *wl_output = NULL;
|
||||||
int output_scale_factor = 1;
|
int output_scale_factor = 1;
|
||||||
|
int output_width = 0;
|
||||||
|
int output_height = 0;
|
||||||
|
|
||||||
struct keyboard_data keyboard_data;
|
struct keyboard_data keyboard_data;
|
||||||
struct pointer_data pointer_data;
|
struct pointer_data pointer_data;
|
||||||
@@ -83,7 +85,13 @@ struct wp_fractional_scale_v1 *fractional_scale = NULL;
|
|||||||
|
|
||||||
// output listener
|
// output listener
|
||||||
static void output_geometry_handler(void *data, struct wl_output *output, int32_t x, int32_t y, int32_t phys_w, int32_t phys_h, int32_t subpixel, const char *make, const char *model, int32_t transform) { (void)data;(void)output;(void)x;(void)y;(void)phys_w;(void)phys_h;(void)subpixel;(void)make;(void)model;(void)transform; }
|
static void output_geometry_handler(void *data, struct wl_output *output, int32_t x, int32_t y, int32_t phys_w, int32_t phys_h, int32_t subpixel, const char *make, const char *model, int32_t transform) { (void)data;(void)output;(void)x;(void)y;(void)phys_w;(void)phys_h;(void)subpixel;(void)make;(void)model;(void)transform; }
|
||||||
static void output_mode_handler(void *data, struct wl_output *output, uint32_t flags, int32_t width, int32_t height, int32_t refresh) { (void)data;(void)output;(void)flags;(void)width;(void)height;(void)refresh; }
|
static void output_mode_handler(void *data, struct wl_output *output, uint32_t flags, int32_t width, int32_t height, int32_t refresh) {
|
||||||
|
(void)data;(void)output;(void)flags;(void)refresh;
|
||||||
|
if (width > 0 && height > 0) {
|
||||||
|
output_width = width;
|
||||||
|
output_height = height;
|
||||||
|
}
|
||||||
|
}
|
||||||
static void output_done_handler(void *data, struct wl_output *output) { (void)data;(void)output; }
|
static void output_done_handler(void *data, struct wl_output *output) { (void)data;(void)output; }
|
||||||
static void output_scale_handler(void *data, struct wl_output *output, int32_t factor) {
|
static void output_scale_handler(void *data, struct wl_output *output, int32_t factor) {
|
||||||
(void)data;(void)output;
|
(void)data;(void)output;
|
||||||
@@ -426,12 +434,21 @@ int main(void)
|
|||||||
wl_pointer_add_listener(pointer_data.pointer, &pointer_listener, &pointer_data);
|
wl_pointer_add_listener(pointer_data.pointer, &pointer_listener, &pointer_data);
|
||||||
|
|
||||||
canvas.fd = -1;
|
canvas.fd = -1;
|
||||||
|
logical_width = 1024;
|
||||||
|
logical_height = 576;
|
||||||
grid_init(&grid, logical_width / 8, logical_height / 8);
|
grid_init(&grid, logical_width / 8, logical_height / 8);
|
||||||
grid.show_lines = 1;
|
grid.show_lines = 1;
|
||||||
|
|
||||||
// wait for the surface to be configured
|
// wait for the surface to be configured
|
||||||
wl_display_roundtrip(display);
|
wl_display_roundtrip(display);
|
||||||
|
|
||||||
|
if (output_width > 0 && output_height > 0 && current_scale > 0) {
|
||||||
|
logical_width = (int)(output_width * 0.8 / current_scale);
|
||||||
|
logical_height = (int)(output_height * 0.8 / current_scale);
|
||||||
|
}
|
||||||
|
if (logical_width < 8) logical_width = 8;
|
||||||
|
if (logical_height < 8) logical_height = 8;
|
||||||
|
|
||||||
/* initial scale may arrive via fractional/output after roundtrip */
|
/* initial scale may arrive via fractional/output after roundtrip */
|
||||||
if (fractional_manager && !fractional_scale) {
|
if (fractional_manager && !fractional_scale) {
|
||||||
/* already created above */
|
/* already created above */
|
||||||
|
|||||||
Reference in New Issue
Block a user