@bobfrankston/winpos 2.0.40 → 2.0.41
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/settings.local.json +3 -1
- package/README.md +13 -13
- package/index.d.ts +16 -0
- package/index.d.ts.map +1 -1
- package/index.js +378 -54
- package/index.js.map +1 -1
- package/index.ts +440 -54
- package/layout.json +46 -0
- package/package.json +2 -3
- package/smposer.json +17 -0
|
@@ -28,7 +28,9 @@
|
|
|
28
28
|
"Bash(git clone:*)",
|
|
29
29
|
"Bash(cmd /c \"cd /d Y:\\dev\\utils && git clone https://github.com/BobFrankston/winpos.git winpos-clean\")",
|
|
30
30
|
"Bash(git -C \"Y:\\dev\\utils\\winpos-clean\" count-objects -vH)",
|
|
31
|
-
"Bash(xcopy:*)"
|
|
31
|
+
"Bash(xcopy:*)",
|
|
32
|
+
"Bash(dir:*)",
|
|
33
|
+
"Bash(node:*)"
|
|
32
34
|
],
|
|
33
35
|
"deny": [],
|
|
34
36
|
"ask": []
|
package/README.md
CHANGED
|
@@ -15,13 +15,13 @@ TypeScript implementation of WinPos - A Windows window positioning utility for m
|
|
|
15
15
|
## Installation
|
|
16
16
|
|
|
17
17
|
```bash
|
|
18
|
-
npm install @bobfrankston/
|
|
18
|
+
npm install @bobfrankston/winpos
|
|
19
19
|
```
|
|
20
20
|
|
|
21
21
|
Or with Bun:
|
|
22
22
|
|
|
23
23
|
```bash
|
|
24
|
-
bun add @bobfrankston/
|
|
24
|
+
bun add @bobfrankston/winpos
|
|
25
25
|
```
|
|
26
26
|
|
|
27
27
|
## Usage
|
|
@@ -30,34 +30,34 @@ bun add @bobfrankston/tswinpos
|
|
|
30
30
|
|
|
31
31
|
```bash
|
|
32
32
|
# Move window to screen 0 at position (100, 200)
|
|
33
|
-
|
|
33
|
+
winpos "Notepad" 100 200 0
|
|
34
34
|
|
|
35
35
|
# Move window using percentages
|
|
36
|
-
|
|
36
|
+
winpos "Chrome*" 50% 50% 1
|
|
37
37
|
|
|
38
38
|
# Set window size as well
|
|
39
|
-
|
|
39
|
+
winpos "Visual Studio Code" 0 0 0 1920 1080
|
|
40
40
|
|
|
41
41
|
# List all windows
|
|
42
|
-
|
|
42
|
+
winpos *
|
|
43
43
|
|
|
44
44
|
# Get screen count
|
|
45
|
-
|
|
45
|
+
winpos -c
|
|
46
46
|
|
|
47
47
|
# Debug mode
|
|
48
|
-
|
|
48
|
+
winpos -d "Firefox" 0 0 1
|
|
49
49
|
```
|
|
50
50
|
|
|
51
51
|
### Pattern Matching
|
|
52
52
|
|
|
53
|
-
- **Exact match**: `
|
|
54
|
-
- **Prefix match**: `
|
|
55
|
-
- **Regex match**: `
|
|
53
|
+
- **Exact match**: `winpos "Notepad" 0 0 0`
|
|
54
|
+
- **Prefix match**: `winpos "Chrome*" 0 0 0`
|
|
55
|
+
- **Regex match**: `winpos "/Visual.*Code/" 0 0 0`
|
|
56
56
|
|
|
57
57
|
### As a Library
|
|
58
58
|
|
|
59
59
|
```typescript
|
|
60
|
-
import { run } from '@bobfrankston/
|
|
60
|
+
import { run } from '@bobfrankston/winpos';
|
|
61
61
|
|
|
62
62
|
// Move a window programmatically
|
|
63
63
|
run(['Chrome*', '0', '0', '1', '1920', '1080']);
|
|
@@ -89,7 +89,7 @@ Screens are numbered starting from 0, sorted by position:
|
|
|
89
89
|
## Parameters
|
|
90
90
|
|
|
91
91
|
```
|
|
92
|
-
|
|
92
|
+
winpos [-d -c *] <window title> <x> <y> <screen> [<width> <height>]
|
|
93
93
|
```
|
|
94
94
|
|
|
95
95
|
- `<window title>` - Window title (exact, prefix with `*`, or regex with `/.../ `)
|
package/index.d.ts
CHANGED
|
@@ -7,6 +7,22 @@ import { user32, RECT } from './ffi-wrapper.js';
|
|
|
7
7
|
import { enumerateScreens, sortScreens, ScreenInfo } from './screens.js';
|
|
8
8
|
import { enumerateWindows, findWindowsByPattern, WindowInfo, WindowState, getWindowState, setWindowState, isMinimized, isMaximized, isNormal, minimizeWindow, maximizeWindow, restoreWindow } from './windows.js';
|
|
9
9
|
import { enumerateTabs, TabInfo, mightHaveTabs, TAB_ENUMERATION_NOTE } from './tabs.js';
|
|
10
|
+
export interface WindowConfig {
|
|
11
|
+
name: string;
|
|
12
|
+
regex?: boolean;
|
|
13
|
+
pos?: {
|
|
14
|
+
x: number | string;
|
|
15
|
+
y: number | string;
|
|
16
|
+
screen?: number;
|
|
17
|
+
};
|
|
18
|
+
size?: {
|
|
19
|
+
w: number | string;
|
|
20
|
+
h: number | string;
|
|
21
|
+
};
|
|
22
|
+
minimize?: boolean;
|
|
23
|
+
maximize?: boolean;
|
|
24
|
+
}
|
|
25
|
+
export type ConfigFile = WindowConfig | WindowConfig[];
|
|
10
26
|
export { RECT, ScreenInfo, WindowInfo, WindowState, TabInfo, enumerateScreens, sortScreens, enumerateWindows, findWindowsByPattern, getWindowState, setWindowState, isMinimized, isMaximized, isNormal, minimizeWindow, maximizeWindow, restoreWindow, enumerateTabs, mightHaveTabs, TAB_ENUMERATION_NOTE, user32 };
|
|
11
27
|
/**
|
|
12
28
|
* Convert screen-relative coordinates to global coordinates
|
package/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":";AACA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AACzE,OAAO,EACH,gBAAgB,EAChB,oBAAoB,EAEpB,UAAU,EACV,WAAW,EACX,cAAc,EACd,cAAc,EACd,WAAW,EACX,WAAW,EACX,QAAQ,EACR,cAAc,EACd,cAAc,EACd,aAAa,EAChB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":";AACA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AACzE,OAAO,EACH,gBAAgB,EAChB,oBAAoB,EAEpB,UAAU,EACV,WAAW,EACX,cAAc,EACd,cAAc,EACd,WAAW,EACX,WAAW,EACX,QAAQ,EACR,cAAc,EACd,cAAc,EACd,aAAa,EAChB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AAMxF,MAAM,WAAW,YAAY;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,GAAG,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAClE,IAAI,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAC;IAClD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,MAAM,UAAU,GAAG,YAAY,GAAG,YAAY,EAAE,CAAC;AAkBvD,OAAO,EACH,IAAI,EACJ,UAAU,EACV,UAAU,EACV,WAAW,EACX,OAAO,EACP,gBAAgB,EAChB,WAAW,EACX,gBAAgB,EAChB,oBAAoB,EACpB,cAAc,EACd,cAAc,EACd,WAAW,EACX,WAAW,EACX,QAAQ,EACR,cAAc,EACd,cAAc,EACd,aAAa,EACb,aAAa,EACb,aAAa,EACb,oBAAoB,EACpB,MAAM,EACT,CAAC;AA8RF;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAyBlG;AAmND,wBAAgB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,QAuHjC"}
|
package/index.js
CHANGED
|
@@ -7,11 +7,269 @@ import { user32 } from './ffi-wrapper.js';
|
|
|
7
7
|
import { enumerateScreens, sortScreens } from './screens.js';
|
|
8
8
|
import { enumerateWindows, findWindowsByPattern, loadIgnorePatterns, WindowState, getWindowState, setWindowState, isMinimized, isMaximized, isNormal, minimizeWindow, maximizeWindow, restoreWindow } from './windows.js';
|
|
9
9
|
import { enumerateTabs, mightHaveTabs, TAB_ENUMERATION_NOTE } from './tabs.js';
|
|
10
|
-
import { join } from 'path';
|
|
10
|
+
import { join, resolve, isAbsolute } from 'path';
|
|
11
|
+
import { readFileSync, writeFileSync, existsSync } from 'fs';
|
|
11
12
|
import * as packageJson from './package.json' with { type: 'json' };
|
|
12
13
|
// Re-export public API for library usage
|
|
13
14
|
export { WindowState, enumerateScreens, sortScreens, enumerateWindows, findWindowsByPattern, getWindowState, setWindowState, isMinimized, isMaximized, isNormal, minimizeWindow, maximizeWindow, restoreWindow, enumerateTabs, mightHaveTabs, TAB_ENUMERATION_NOTE, user32 };
|
|
15
|
+
// WindowConfig and ConfigFile types are exported from interface definitions above
|
|
14
16
|
// Note: screenPosToPos is exported separately below (after the function definition)
|
|
17
|
+
/**
|
|
18
|
+
* Load window config from JSON file
|
|
19
|
+
*/
|
|
20
|
+
function loadConfigFile(filePath) {
|
|
21
|
+
const absPath = isAbsolute(filePath) ? filePath : resolve(process.cwd(), filePath);
|
|
22
|
+
if (!existsSync(absPath)) {
|
|
23
|
+
throw new Error(`Config file not found: ${absPath}`);
|
|
24
|
+
}
|
|
25
|
+
const content = readFileSync(absPath, 'utf-8');
|
|
26
|
+
return JSON.parse(content);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Save window config to JSON file
|
|
30
|
+
* If file exists and contains array, merge; otherwise create/overwrite
|
|
31
|
+
*/
|
|
32
|
+
function saveConfigFile(filePath, config, merge = false) {
|
|
33
|
+
const absPath = isAbsolute(filePath) ? filePath : resolve(process.cwd(), filePath);
|
|
34
|
+
let finalConfig;
|
|
35
|
+
if (merge && existsSync(absPath)) {
|
|
36
|
+
const existing = loadConfigFile(absPath);
|
|
37
|
+
if (Array.isArray(existing)) {
|
|
38
|
+
// Find and update existing entry with same name, or append
|
|
39
|
+
const idx = existing.findIndex(e => e.name === config.name);
|
|
40
|
+
if (idx >= 0) {
|
|
41
|
+
existing[idx] = config;
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
existing.push(config);
|
|
45
|
+
}
|
|
46
|
+
finalConfig = existing;
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
// Convert single entry to array
|
|
50
|
+
if (existing.name === config.name) {
|
|
51
|
+
finalConfig = config; // Replace single entry
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
finalConfig = [existing, config];
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
finalConfig = config;
|
|
60
|
+
}
|
|
61
|
+
writeFileSync(absPath, JSON.stringify(finalConfig, null, 2), 'utf-8');
|
|
62
|
+
console.log(`Config saved to: ${absPath}`);
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Build WindowConfig from CLI options
|
|
66
|
+
*/
|
|
67
|
+
function buildConfigFromOptions(opts) {
|
|
68
|
+
if (!opts.windowTitle)
|
|
69
|
+
return null;
|
|
70
|
+
const config = {
|
|
71
|
+
name: opts.windowTitle
|
|
72
|
+
};
|
|
73
|
+
// Check if name is a regex pattern (enclosed in /.../)
|
|
74
|
+
if (config.name.startsWith('/') && config.name.endsWith('/')) {
|
|
75
|
+
config.regex = true;
|
|
76
|
+
config.name = config.name.slice(1, -1); // Store without delimiters
|
|
77
|
+
}
|
|
78
|
+
if (opts.pos) {
|
|
79
|
+
config.pos = { x: opts.pos.x, y: opts.pos.y };
|
|
80
|
+
if (opts.pos.screen !== undefined) {
|
|
81
|
+
config.pos.screen = opts.pos.screen;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
if (opts.size) {
|
|
85
|
+
config.size = { w: opts.size.w, h: opts.size.h };
|
|
86
|
+
}
|
|
87
|
+
if (opts.minimize) {
|
|
88
|
+
config.minimize = true;
|
|
89
|
+
}
|
|
90
|
+
if (opts.maximize) {
|
|
91
|
+
config.maximize = true;
|
|
92
|
+
}
|
|
93
|
+
return config;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Parse CLI arguments into structured options
|
|
97
|
+
*/
|
|
98
|
+
function parseArgs(args) {
|
|
99
|
+
const opts = {
|
|
100
|
+
debug: false,
|
|
101
|
+
debugVerbose: false,
|
|
102
|
+
showCount: false,
|
|
103
|
+
positionalArgs: []
|
|
104
|
+
};
|
|
105
|
+
let i = 0;
|
|
106
|
+
while (i < args.length) {
|
|
107
|
+
const arg = args[i];
|
|
108
|
+
// Check for .json file as first non-flag arg (auto-load)
|
|
109
|
+
if (!arg.startsWith('-') && arg.toLowerCase().endsWith('.json') && !opts.loadFile) {
|
|
110
|
+
opts.loadFile = arg;
|
|
111
|
+
i++;
|
|
112
|
+
continue;
|
|
113
|
+
}
|
|
114
|
+
if (arg.startsWith('-')) {
|
|
115
|
+
const flag = arg.substring(1).toLowerCase();
|
|
116
|
+
switch (flag) {
|
|
117
|
+
case 'd':
|
|
118
|
+
opts.debug = true;
|
|
119
|
+
break;
|
|
120
|
+
case 'dbg':
|
|
121
|
+
opts.debugVerbose = true;
|
|
122
|
+
break;
|
|
123
|
+
case 'c':
|
|
124
|
+
opts.showCount = true;
|
|
125
|
+
break;
|
|
126
|
+
case 'version':
|
|
127
|
+
case 'v':
|
|
128
|
+
console.log(`winpos version ${packageJson.default.version}`);
|
|
129
|
+
process.exit(0);
|
|
130
|
+
break;
|
|
131
|
+
case 'pos':
|
|
132
|
+
i++;
|
|
133
|
+
if (i < args.length) {
|
|
134
|
+
const parts = args[i].split(',');
|
|
135
|
+
opts.pos = { x: parts[0], y: parts[1] };
|
|
136
|
+
if (parts.length > 2) {
|
|
137
|
+
opts.pos.screen = parseInt(parts[2], 10);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
break;
|
|
141
|
+
case 'size':
|
|
142
|
+
i++;
|
|
143
|
+
if (i < args.length) {
|
|
144
|
+
const parts = args[i].split(',');
|
|
145
|
+
opts.size = { w: parts[0], h: parts[1] };
|
|
146
|
+
}
|
|
147
|
+
break;
|
|
148
|
+
case 'load':
|
|
149
|
+
i++;
|
|
150
|
+
if (i < args.length) {
|
|
151
|
+
opts.loadFile = args[i];
|
|
152
|
+
}
|
|
153
|
+
break;
|
|
154
|
+
case 'save':
|
|
155
|
+
i++;
|
|
156
|
+
if (i < args.length) {
|
|
157
|
+
opts.saveFile = args[i];
|
|
158
|
+
}
|
|
159
|
+
break;
|
|
160
|
+
case 'title':
|
|
161
|
+
i++;
|
|
162
|
+
if (i < args.length) {
|
|
163
|
+
opts.windowTitle = args[i];
|
|
164
|
+
}
|
|
165
|
+
break;
|
|
166
|
+
case 'min':
|
|
167
|
+
opts.minimize = true;
|
|
168
|
+
break;
|
|
169
|
+
case 'max':
|
|
170
|
+
opts.maximize = true;
|
|
171
|
+
break;
|
|
172
|
+
case 'help':
|
|
173
|
+
case '?':
|
|
174
|
+
return opts; // Will trigger usage display
|
|
175
|
+
default:
|
|
176
|
+
// Unknown flag - could be negative number for position
|
|
177
|
+
if (/^-?\d+/.test(arg)) {
|
|
178
|
+
opts.positionalArgs.push(arg);
|
|
179
|
+
}
|
|
180
|
+
else {
|
|
181
|
+
console.log(`Unknown option: ${arg}`);
|
|
182
|
+
}
|
|
183
|
+
break;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
else {
|
|
187
|
+
opts.positionalArgs.push(arg);
|
|
188
|
+
}
|
|
189
|
+
i++;
|
|
190
|
+
}
|
|
191
|
+
// First positional arg is window title (if using new flag-based syntax and -title not set)
|
|
192
|
+
const usingFlagSyntax = opts.pos || opts.size || opts.loadFile || opts.saveFile || opts.minimize || opts.maximize;
|
|
193
|
+
if (opts.positionalArgs.length > 0 && usingFlagSyntax) {
|
|
194
|
+
if (!opts.windowTitle) {
|
|
195
|
+
opts.windowTitle = opts.positionalArgs[0];
|
|
196
|
+
opts.positionalArgs = opts.positionalArgs.slice(1);
|
|
197
|
+
}
|
|
198
|
+
// Error if stray positional args remain when using flag-based syntax
|
|
199
|
+
if (opts.positionalArgs.length > 0) {
|
|
200
|
+
console.error(`Error: unexpected arguments: ${opts.positionalArgs.join(' ')}`);
|
|
201
|
+
console.error('When using flags, only window title should be positional');
|
|
202
|
+
process.exit(1);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
return opts;
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Apply a single window config
|
|
209
|
+
*/
|
|
210
|
+
function applyWindowConfig(config, screensInfo) {
|
|
211
|
+
// Build pattern for matching
|
|
212
|
+
let pattern;
|
|
213
|
+
if (config.regex) {
|
|
214
|
+
pattern = `/${config.name}/`;
|
|
215
|
+
}
|
|
216
|
+
else {
|
|
217
|
+
pattern = config.name;
|
|
218
|
+
}
|
|
219
|
+
let matchedWindows = findWindowsByPattern(pattern);
|
|
220
|
+
matchedWindows = matchedWindows.filter(w => !w.title.toLowerCase().includes('tswinpos'));
|
|
221
|
+
if (matchedWindows.length === 0) {
|
|
222
|
+
console.log(`No windows found matching '${config.name}'`);
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
225
|
+
// Handle minimize
|
|
226
|
+
if (config.minimize) {
|
|
227
|
+
for (const window of matchedWindows) {
|
|
228
|
+
if (dbgVerbose)
|
|
229
|
+
console.log(`[DBG] Minimizing: "${window.title}"`);
|
|
230
|
+
minimizeWindow(window.hwnd);
|
|
231
|
+
}
|
|
232
|
+
return;
|
|
233
|
+
}
|
|
234
|
+
// Handle maximize
|
|
235
|
+
if (config.maximize) {
|
|
236
|
+
for (const window of matchedWindows) {
|
|
237
|
+
if (dbgVerbose)
|
|
238
|
+
console.log(`[DBG] Maximizing: "${window.title}"`);
|
|
239
|
+
maximizeWindow(window.hwnd);
|
|
240
|
+
}
|
|
241
|
+
return;
|
|
242
|
+
}
|
|
243
|
+
// Handle positioning
|
|
244
|
+
if (!config.pos)
|
|
245
|
+
return;
|
|
246
|
+
const screenIndex = config.pos.screen ?? 0;
|
|
247
|
+
if (screenIndex < 0 || screenIndex >= screensInfo.length) {
|
|
248
|
+
console.log(`Invalid screen ${screenIndex} for window '${config.name}'`);
|
|
249
|
+
return;
|
|
250
|
+
}
|
|
251
|
+
const targetScreen = screensInfo[screenIndex];
|
|
252
|
+
const bounds = targetScreen.bounds;
|
|
253
|
+
const x = parseDimension(String(config.pos.x), bounds.Width) + bounds.Left;
|
|
254
|
+
const y = parseDimension(String(config.pos.y), bounds.Height) + bounds.Top;
|
|
255
|
+
let width = config.size ? parseDimension(String(config.size.w), bounds.Width) : 0;
|
|
256
|
+
let height = config.size ? parseDimension(String(config.size.h), bounds.Height) : 0;
|
|
257
|
+
for (const window of matchedWindows) {
|
|
258
|
+
let w = width, h = height;
|
|
259
|
+
if (w === 0)
|
|
260
|
+
w = window.rect.Right - window.rect.Left;
|
|
261
|
+
if (h === 0)
|
|
262
|
+
h = window.rect.Bottom - window.rect.Top;
|
|
263
|
+
if (dbgVerbose) {
|
|
264
|
+
console.log(`[DBG] Window: "${window.title}" -> Position: (${x}, ${y}) Size: ${w}x${h} Screen: ${screenIndex}`);
|
|
265
|
+
}
|
|
266
|
+
if (isMinimized(window.hwnd) || isMaximized(window.hwnd)) {
|
|
267
|
+
restoreWindow(window.hwnd);
|
|
268
|
+
}
|
|
269
|
+
user32.MoveWindow(window.hwnd, x, y, w, h, true);
|
|
270
|
+
user32.SetForegroundWindow(window.hwnd);
|
|
271
|
+
}
|
|
272
|
+
}
|
|
15
273
|
let dbg = false;
|
|
16
274
|
let dbgVerbose = false; // -dbg flag for detailed output
|
|
17
275
|
let screens = [];
|
|
@@ -125,6 +383,27 @@ function getScreenForWindow(windowRect) {
|
|
|
125
383
|
return screens.findIndex(s => s.primary) || 0;
|
|
126
384
|
}
|
|
127
385
|
const padn = (n, p = 6) => n.toString().padStart(p);
|
|
386
|
+
/**
|
|
387
|
+
* Show position info for windows matching pattern
|
|
388
|
+
*/
|
|
389
|
+
function showWindowInfo(pattern) {
|
|
390
|
+
let matchedWindows = findWindowsByPattern(pattern);
|
|
391
|
+
matchedWindows = matchedWindows.filter(w => !w.title.toLowerCase().includes('tswinpos'));
|
|
392
|
+
if (matchedWindows.length === 0) {
|
|
393
|
+
console.log(`No windows found matching '${pattern}'`);
|
|
394
|
+
return;
|
|
395
|
+
}
|
|
396
|
+
for (const window of matchedWindows) {
|
|
397
|
+
const screenIndex = getScreenForWindow(window.rect);
|
|
398
|
+
const screen = screens[screenIndex];
|
|
399
|
+
const x = window.rect.Left - screen.bounds.Left;
|
|
400
|
+
const y = window.rect.Top - screen.bounds.Top;
|
|
401
|
+
const width = window.rect.Right - window.rect.Left;
|
|
402
|
+
const height = window.rect.Bottom - window.rect.Top;
|
|
403
|
+
console.log(`${window.title}`);
|
|
404
|
+
console.log(` pos: ${x},${y},${screenIndex} size: ${width},${height}`);
|
|
405
|
+
}
|
|
406
|
+
}
|
|
128
407
|
function listAllWindows(includeIgnored = false) {
|
|
129
408
|
console.log('====================================');
|
|
130
409
|
console.log('Screens');
|
|
@@ -157,23 +436,32 @@ function listAllWindows(includeIgnored = false) {
|
|
|
157
436
|
function usage(msg = '') {
|
|
158
437
|
if (msg)
|
|
159
438
|
console.log(msg);
|
|
160
|
-
console.log('Usage: winpos [
|
|
161
|
-
console.log(' winpos <
|
|
162
|
-
console.log('
|
|
163
|
-
console.log('
|
|
164
|
-
console.log('
|
|
165
|
-
console.log('
|
|
166
|
-
console.log(
|
|
167
|
-
console.log('
|
|
168
|
-
console.log('
|
|
169
|
-
console.log('
|
|
170
|
-
console.log('
|
|
439
|
+
console.log('Usage: winpos [options] <title> <x> <y> <screen> [<width> <height>]');
|
|
440
|
+
console.log(' winpos [options] <title> -pos x,y[,screen] [-size w,h]');
|
|
441
|
+
console.log(' winpos [options] -title <name> -pos x,y[,screen] [-size w,h]');
|
|
442
|
+
console.log(' winpos <title> min | -min');
|
|
443
|
+
console.log(' winpos <config.json>');
|
|
444
|
+
console.log(' winpos -load <config.json> [-save <output.json>]');
|
|
445
|
+
console.log();
|
|
446
|
+
console.log('Options:');
|
|
447
|
+
console.log(' -d Debug mode');
|
|
448
|
+
console.log(' -dbg Verbose debug output');
|
|
449
|
+
console.log(' -c Return screen count as exit code');
|
|
450
|
+
console.log(' -v/-version Show version');
|
|
451
|
+
console.log(' -title name Window title/pattern (alternative to positional)');
|
|
452
|
+
console.log(' -pos x,y[,s] Position (x,y with optional screen index)');
|
|
453
|
+
console.log(' -size w,h Window size (width,height)');
|
|
454
|
+
console.log(' -min Minimize window');
|
|
455
|
+
console.log(' -max Maximize window');
|
|
456
|
+
console.log(' -load file Load config from JSON file');
|
|
457
|
+
console.log(' -save file Save config to JSON file (merges if file exists)');
|
|
171
458
|
console.log();
|
|
172
|
-
console.log('
|
|
173
|
-
console.log('
|
|
174
|
-
console.log('
|
|
175
|
-
console.log(
|
|
176
|
-
console.log('
|
|
459
|
+
console.log('Position/size values can be pixels or percentages (e.g. 50%)');
|
|
460
|
+
console.log('Title can be regex (/pattern/) or prefix (title*)');
|
|
461
|
+
console.log('* = list windows, ** = list all including ignored');
|
|
462
|
+
console.log();
|
|
463
|
+
console.log('JSON format: {"name":"app","regex":false,"pos":{"x":0,"y":0,"screen":0},"size":{"w":800,"h":600}}');
|
|
464
|
+
console.log(' or array: [{...}, {...}]');
|
|
177
465
|
console.log();
|
|
178
466
|
console.log('Screen | X Y | W H ');
|
|
179
467
|
console.log('------------------------------------');
|
|
@@ -181,8 +469,6 @@ function usage(msg = '') {
|
|
|
181
469
|
const screen = screens[i];
|
|
182
470
|
console.log(`${i.toString().padStart(6)} | ${screen.bounds.Left.toString().padStart(5)} ${screen.bounds.Top.toString().padStart(5)} | ${screen.bounds.Width.toString().padStart(5)} ${screen.bounds.Height.toString().padStart(5)}`);
|
|
183
471
|
}
|
|
184
|
-
console.log();
|
|
185
|
-
console.log('0-Lower right, 1-Lower Left, 2-Upper left, 3-Upper right');
|
|
186
472
|
process.exit(1);
|
|
187
473
|
}
|
|
188
474
|
export function run(args) {
|
|
@@ -200,56 +486,94 @@ export function run(args) {
|
|
|
200
486
|
// Load ignore patterns from the same directory as the script
|
|
201
487
|
const ignoresPath = join(import.meta.dirname, 'ignores.txt');
|
|
202
488
|
loadIgnorePatterns(ignoresPath);
|
|
203
|
-
// Parse
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
489
|
+
// Parse arguments using new parser
|
|
490
|
+
const opts = parseArgs(args);
|
|
491
|
+
// Set debug flags
|
|
492
|
+
dbg = opts.debug;
|
|
493
|
+
dbgVerbose = opts.debugVerbose;
|
|
494
|
+
if (dbg)
|
|
495
|
+
console.log('Debug mode enabled.');
|
|
496
|
+
if (dbgVerbose)
|
|
497
|
+
console.log(`[DBG] winpos version ${packageJson.default.version}`);
|
|
498
|
+
// Handle -c (screen count)
|
|
499
|
+
if (opts.showCount) {
|
|
500
|
+
console.log(screens.length);
|
|
501
|
+
process.exit(screens.length);
|
|
502
|
+
}
|
|
503
|
+
// Handle load file (JSON config)
|
|
504
|
+
if (opts.loadFile) {
|
|
505
|
+
try {
|
|
506
|
+
const config = loadConfigFile(opts.loadFile);
|
|
507
|
+
const configs = Array.isArray(config) ? config : [config];
|
|
508
|
+
// If -save specified with CLI params, merge new config into loaded
|
|
509
|
+
if (opts.saveFile && opts.windowTitle) {
|
|
510
|
+
const newConfig = buildConfigFromOptions(opts);
|
|
511
|
+
if (newConfig) {
|
|
512
|
+
// Apply the CLI-specified window first
|
|
513
|
+
applyWindowConfig(newConfig, screens);
|
|
514
|
+
// Save merged config
|
|
515
|
+
saveConfigFile(opts.saveFile, newConfig, true);
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
// Apply all loaded configs
|
|
519
|
+
for (const cfg of configs) {
|
|
520
|
+
applyWindowConfig(cfg, screens);
|
|
521
|
+
}
|
|
522
|
+
return;
|
|
523
|
+
}
|
|
524
|
+
catch (e) {
|
|
525
|
+
console.error(`Error loading config: ${e.message}`);
|
|
526
|
+
process.exit(1);
|
|
227
527
|
}
|
|
228
|
-
args = args.slice(1);
|
|
229
528
|
}
|
|
230
|
-
// Handle
|
|
231
|
-
|
|
529
|
+
// Handle new flag-based syntax (-pos, -size, -min, -max)
|
|
530
|
+
if (opts.pos || opts.size || opts.minimize || opts.maximize) {
|
|
531
|
+
if (!opts.windowTitle) {
|
|
532
|
+
usage('Window title required when using -pos, -size, -min, or -max');
|
|
533
|
+
return;
|
|
534
|
+
}
|
|
535
|
+
const config = buildConfigFromOptions(opts);
|
|
536
|
+
if (config) {
|
|
537
|
+
applyWindowConfig(config, screens);
|
|
538
|
+
// Save if requested
|
|
539
|
+
if (opts.saveFile) {
|
|
540
|
+
saveConfigFile(opts.saveFile, config, existsSync(opts.saveFile));
|
|
541
|
+
}
|
|
542
|
+
}
|
|
543
|
+
return;
|
|
544
|
+
}
|
|
545
|
+
// If only -title provided (no -pos/-size/-min/-max), show window position info
|
|
546
|
+
if (opts.windowTitle && !opts.loadFile) {
|
|
547
|
+
showWindowInfo(opts.windowTitle);
|
|
548
|
+
return;
|
|
549
|
+
}
|
|
550
|
+
// Fall back to legacy positional argument handling
|
|
551
|
+
const posArgs = opts.positionalArgs;
|
|
232
552
|
if (dbg)
|
|
233
|
-
console.log(`DEBUG[${packageJson.default.version}]: ${
|
|
234
|
-
if (
|
|
553
|
+
console.log(`DEBUG[${packageJson.default.version}]: ${posArgs.join(' ')}`);
|
|
554
|
+
if (posArgs.length === 1 && posArgs[0] === '*') {
|
|
235
555
|
listAllWindows();
|
|
236
556
|
return;
|
|
237
557
|
}
|
|
238
|
-
if (
|
|
558
|
+
if (posArgs.length === 1 && posArgs[0] === '**') {
|
|
239
559
|
listAllWindows(true);
|
|
240
560
|
return;
|
|
241
561
|
}
|
|
242
562
|
// Check for minimize command (title + min/-min)
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
563
|
+
if (posArgs.length === 2 && (posArgs[1].toLowerCase() === 'min' || posArgs[1].toLowerCase() === '-min')) {
|
|
564
|
+
adjustWindow(posArgs);
|
|
565
|
+
return;
|
|
566
|
+
}
|
|
567
|
+
// Single positional arg = show window info
|
|
568
|
+
if (posArgs.length === 1) {
|
|
569
|
+
showWindowInfo(posArgs[0]);
|
|
246
570
|
return;
|
|
247
571
|
}
|
|
248
|
-
if (
|
|
572
|
+
if (posArgs.length < 4) {
|
|
249
573
|
usage();
|
|
250
574
|
return;
|
|
251
575
|
}
|
|
252
|
-
adjustWindow(
|
|
576
|
+
adjustWindow(posArgs);
|
|
253
577
|
}
|
|
254
578
|
// CLI entry point using import.meta.main
|
|
255
579
|
if (import.meta.main) {
|
package/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"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"}
|
package/index.ts
CHANGED
|
@@ -22,9 +22,37 @@ import {
|
|
|
22
22
|
restoreWindow
|
|
23
23
|
} from './windows.js';
|
|
24
24
|
import { enumerateTabs, TabInfo, mightHaveTabs, TAB_ENUMERATION_NOTE } from './tabs.js';
|
|
25
|
-
import { join } from 'path';
|
|
25
|
+
import { join, dirname, resolve, isAbsolute } from 'path';
|
|
26
|
+
import { readFileSync, writeFileSync, existsSync } from 'fs';
|
|
26
27
|
import * as packageJson from './package.json' with { type: 'json' };
|
|
27
28
|
|
|
29
|
+
// JSON config file format
|
|
30
|
+
export interface WindowConfig {
|
|
31
|
+
name: string; // Window title or pattern
|
|
32
|
+
regex?: boolean; // true = name is regex pattern, false/undefined = exact/prefix match
|
|
33
|
+
pos?: { x: number | string; y: number | string; screen?: number };
|
|
34
|
+
size?: { w: number | string; h: number | string };
|
|
35
|
+
minimize?: boolean; // true = minimize the window
|
|
36
|
+
maximize?: boolean; // true = maximize the window
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export type ConfigFile = WindowConfig | WindowConfig[];
|
|
40
|
+
|
|
41
|
+
// Parsed CLI options
|
|
42
|
+
interface ParsedOptions {
|
|
43
|
+
debug: boolean;
|
|
44
|
+
debugVerbose: boolean;
|
|
45
|
+
showCount: boolean;
|
|
46
|
+
loadFile?: string;
|
|
47
|
+
saveFile?: string;
|
|
48
|
+
pos?: { x: string; y: string; screen?: number };
|
|
49
|
+
size?: { w: string; h: string };
|
|
50
|
+
windowTitle?: string;
|
|
51
|
+
minimize?: boolean;
|
|
52
|
+
maximize?: boolean;
|
|
53
|
+
positionalArgs: string[];
|
|
54
|
+
}
|
|
55
|
+
|
|
28
56
|
// Re-export public API for library usage
|
|
29
57
|
export {
|
|
30
58
|
RECT,
|
|
@@ -49,9 +77,287 @@ export {
|
|
|
49
77
|
TAB_ENUMERATION_NOTE,
|
|
50
78
|
user32
|
|
51
79
|
};
|
|
80
|
+
// WindowConfig and ConfigFile types are exported from interface definitions above
|
|
52
81
|
|
|
53
82
|
// Note: screenPosToPos is exported separately below (after the function definition)
|
|
54
83
|
|
|
84
|
+
/**
|
|
85
|
+
* Load window config from JSON file
|
|
86
|
+
*/
|
|
87
|
+
function loadConfigFile(filePath: string): ConfigFile {
|
|
88
|
+
const absPath = isAbsolute(filePath) ? filePath : resolve(process.cwd(), filePath);
|
|
89
|
+
if (!existsSync(absPath)) {
|
|
90
|
+
throw new Error(`Config file not found: ${absPath}`);
|
|
91
|
+
}
|
|
92
|
+
const content = readFileSync(absPath, 'utf-8');
|
|
93
|
+
return JSON.parse(content) as ConfigFile;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Save window config to JSON file
|
|
98
|
+
* If file exists and contains array, merge; otherwise create/overwrite
|
|
99
|
+
*/
|
|
100
|
+
function saveConfigFile(filePath: string, config: WindowConfig, merge: boolean = false): void {
|
|
101
|
+
const absPath = isAbsolute(filePath) ? filePath : resolve(process.cwd(), filePath);
|
|
102
|
+
|
|
103
|
+
let finalConfig: ConfigFile;
|
|
104
|
+
|
|
105
|
+
if (merge && existsSync(absPath)) {
|
|
106
|
+
const existing = loadConfigFile(absPath);
|
|
107
|
+
if (Array.isArray(existing)) {
|
|
108
|
+
// Find and update existing entry with same name, or append
|
|
109
|
+
const idx = existing.findIndex(e => e.name === config.name);
|
|
110
|
+
if (idx >= 0) {
|
|
111
|
+
existing[idx] = config;
|
|
112
|
+
} else {
|
|
113
|
+
existing.push(config);
|
|
114
|
+
}
|
|
115
|
+
finalConfig = existing;
|
|
116
|
+
} else {
|
|
117
|
+
// Convert single entry to array
|
|
118
|
+
if (existing.name === config.name) {
|
|
119
|
+
finalConfig = config; // Replace single entry
|
|
120
|
+
} else {
|
|
121
|
+
finalConfig = [existing, config];
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
} else {
|
|
125
|
+
finalConfig = config;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
writeFileSync(absPath, JSON.stringify(finalConfig, null, 2), 'utf-8');
|
|
129
|
+
console.log(`Config saved to: ${absPath}`);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Build WindowConfig from CLI options
|
|
134
|
+
*/
|
|
135
|
+
function buildConfigFromOptions(opts: ParsedOptions): WindowConfig | null {
|
|
136
|
+
if (!opts.windowTitle) return null;
|
|
137
|
+
|
|
138
|
+
const config: WindowConfig = {
|
|
139
|
+
name: opts.windowTitle
|
|
140
|
+
};
|
|
141
|
+
|
|
142
|
+
// Check if name is a regex pattern (enclosed in /.../)
|
|
143
|
+
if (config.name.startsWith('/') && config.name.endsWith('/')) {
|
|
144
|
+
config.regex = true;
|
|
145
|
+
config.name = config.name.slice(1, -1); // Store without delimiters
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
if (opts.pos) {
|
|
149
|
+
config.pos = { x: opts.pos.x, y: opts.pos.y };
|
|
150
|
+
if (opts.pos.screen !== undefined) {
|
|
151
|
+
config.pos.screen = opts.pos.screen;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
if (opts.size) {
|
|
156
|
+
config.size = { w: opts.size.w, h: opts.size.h };
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
if (opts.minimize) {
|
|
160
|
+
config.minimize = true;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
if (opts.maximize) {
|
|
164
|
+
config.maximize = true;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
return config;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/**
|
|
171
|
+
* Parse CLI arguments into structured options
|
|
172
|
+
*/
|
|
173
|
+
function parseArgs(args: string[]): ParsedOptions {
|
|
174
|
+
const opts: ParsedOptions = {
|
|
175
|
+
debug: false,
|
|
176
|
+
debugVerbose: false,
|
|
177
|
+
showCount: false,
|
|
178
|
+
positionalArgs: []
|
|
179
|
+
};
|
|
180
|
+
|
|
181
|
+
let i = 0;
|
|
182
|
+
while (i < args.length) {
|
|
183
|
+
const arg = args[i];
|
|
184
|
+
|
|
185
|
+
// Check for .json file as first non-flag arg (auto-load)
|
|
186
|
+
if (!arg.startsWith('-') && arg.toLowerCase().endsWith('.json') && !opts.loadFile) {
|
|
187
|
+
opts.loadFile = arg;
|
|
188
|
+
i++;
|
|
189
|
+
continue;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
if (arg.startsWith('-')) {
|
|
193
|
+
const flag = arg.substring(1).toLowerCase();
|
|
194
|
+
switch (flag) {
|
|
195
|
+
case 'd':
|
|
196
|
+
opts.debug = true;
|
|
197
|
+
break;
|
|
198
|
+
case 'dbg':
|
|
199
|
+
opts.debugVerbose = true;
|
|
200
|
+
break;
|
|
201
|
+
case 'c':
|
|
202
|
+
opts.showCount = true;
|
|
203
|
+
break;
|
|
204
|
+
case 'version':
|
|
205
|
+
case 'v':
|
|
206
|
+
console.log(`winpos version ${packageJson.default.version}`);
|
|
207
|
+
process.exit(0);
|
|
208
|
+
break;
|
|
209
|
+
case 'pos':
|
|
210
|
+
i++;
|
|
211
|
+
if (i < args.length) {
|
|
212
|
+
const parts = args[i].split(',');
|
|
213
|
+
opts.pos = { x: parts[0], y: parts[1] };
|
|
214
|
+
if (parts.length > 2) {
|
|
215
|
+
opts.pos.screen = parseInt(parts[2], 10);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
break;
|
|
219
|
+
case 'size':
|
|
220
|
+
i++;
|
|
221
|
+
if (i < args.length) {
|
|
222
|
+
const parts = args[i].split(',');
|
|
223
|
+
opts.size = { w: parts[0], h: parts[1] };
|
|
224
|
+
}
|
|
225
|
+
break;
|
|
226
|
+
case 'load':
|
|
227
|
+
i++;
|
|
228
|
+
if (i < args.length) {
|
|
229
|
+
opts.loadFile = args[i];
|
|
230
|
+
}
|
|
231
|
+
break;
|
|
232
|
+
case 'save':
|
|
233
|
+
i++;
|
|
234
|
+
if (i < args.length) {
|
|
235
|
+
opts.saveFile = args[i];
|
|
236
|
+
}
|
|
237
|
+
break;
|
|
238
|
+
case 'title':
|
|
239
|
+
i++;
|
|
240
|
+
if (i < args.length) {
|
|
241
|
+
opts.windowTitle = args[i];
|
|
242
|
+
}
|
|
243
|
+
break;
|
|
244
|
+
case 'min':
|
|
245
|
+
opts.minimize = true;
|
|
246
|
+
break;
|
|
247
|
+
case 'max':
|
|
248
|
+
opts.maximize = true;
|
|
249
|
+
break;
|
|
250
|
+
case 'help':
|
|
251
|
+
case '?':
|
|
252
|
+
return opts; // Will trigger usage display
|
|
253
|
+
default:
|
|
254
|
+
// Unknown flag - could be negative number for position
|
|
255
|
+
if (/^-?\d+/.test(arg)) {
|
|
256
|
+
opts.positionalArgs.push(arg);
|
|
257
|
+
} else {
|
|
258
|
+
console.log(`Unknown option: ${arg}`);
|
|
259
|
+
}
|
|
260
|
+
break;
|
|
261
|
+
}
|
|
262
|
+
} else {
|
|
263
|
+
opts.positionalArgs.push(arg);
|
|
264
|
+
}
|
|
265
|
+
i++;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
// First positional arg is window title (if using new flag-based syntax and -title not set)
|
|
269
|
+
const usingFlagSyntax = opts.pos || opts.size || opts.loadFile || opts.saveFile || opts.minimize || opts.maximize;
|
|
270
|
+
if (opts.positionalArgs.length > 0 && usingFlagSyntax) {
|
|
271
|
+
if (!opts.windowTitle) {
|
|
272
|
+
opts.windowTitle = opts.positionalArgs[0];
|
|
273
|
+
opts.positionalArgs = opts.positionalArgs.slice(1);
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
// Error if stray positional args remain when using flag-based syntax
|
|
277
|
+
if (opts.positionalArgs.length > 0) {
|
|
278
|
+
console.error(`Error: unexpected arguments: ${opts.positionalArgs.join(' ')}`);
|
|
279
|
+
console.error('When using flags, only window title should be positional');
|
|
280
|
+
process.exit(1);
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
return opts;
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
/**
|
|
288
|
+
* Apply a single window config
|
|
289
|
+
*/
|
|
290
|
+
function applyWindowConfig(config: WindowConfig, screensInfo: ScreenInfo[]): void {
|
|
291
|
+
// Build pattern for matching
|
|
292
|
+
let pattern: string;
|
|
293
|
+
if (config.regex) {
|
|
294
|
+
pattern = `/${config.name}/`;
|
|
295
|
+
} else {
|
|
296
|
+
pattern = config.name;
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
let matchedWindows = findWindowsByPattern(pattern);
|
|
300
|
+
matchedWindows = matchedWindows.filter(w => !w.title.toLowerCase().includes('tswinpos'));
|
|
301
|
+
|
|
302
|
+
if (matchedWindows.length === 0) {
|
|
303
|
+
console.log(`No windows found matching '${config.name}'`);
|
|
304
|
+
return;
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
// Handle minimize
|
|
308
|
+
if (config.minimize) {
|
|
309
|
+
for (const window of matchedWindows) {
|
|
310
|
+
if (dbgVerbose) console.log(`[DBG] Minimizing: "${window.title}"`);
|
|
311
|
+
minimizeWindow(window.hwnd);
|
|
312
|
+
}
|
|
313
|
+
return;
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
// Handle maximize
|
|
317
|
+
if (config.maximize) {
|
|
318
|
+
for (const window of matchedWindows) {
|
|
319
|
+
if (dbgVerbose) console.log(`[DBG] Maximizing: "${window.title}"`);
|
|
320
|
+
maximizeWindow(window.hwnd);
|
|
321
|
+
}
|
|
322
|
+
return;
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
// Handle positioning
|
|
326
|
+
if (!config.pos) return;
|
|
327
|
+
|
|
328
|
+
const screenIndex = config.pos.screen ?? 0;
|
|
329
|
+
if (screenIndex < 0 || screenIndex >= screensInfo.length) {
|
|
330
|
+
console.log(`Invalid screen ${screenIndex} for window '${config.name}'`);
|
|
331
|
+
return;
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
const targetScreen = screensInfo[screenIndex];
|
|
335
|
+
const bounds = targetScreen.bounds;
|
|
336
|
+
|
|
337
|
+
const x = parseDimension(String(config.pos.x), bounds.Width) + bounds.Left;
|
|
338
|
+
const y = parseDimension(String(config.pos.y), bounds.Height) + bounds.Top;
|
|
339
|
+
|
|
340
|
+
let width = config.size ? parseDimension(String(config.size.w), bounds.Width) : 0;
|
|
341
|
+
let height = config.size ? parseDimension(String(config.size.h), bounds.Height) : 0;
|
|
342
|
+
|
|
343
|
+
for (const window of matchedWindows) {
|
|
344
|
+
let w = width, h = height;
|
|
345
|
+
if (w === 0) w = window.rect.Right - window.rect.Left;
|
|
346
|
+
if (h === 0) h = window.rect.Bottom - window.rect.Top;
|
|
347
|
+
|
|
348
|
+
if (dbgVerbose) {
|
|
349
|
+
console.log(`[DBG] Window: "${window.title}" -> Position: (${x}, ${y}) Size: ${w}x${h} Screen: ${screenIndex}`);
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
if (isMinimized(window.hwnd) || isMaximized(window.hwnd)) {
|
|
353
|
+
restoreWindow(window.hwnd);
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
user32.MoveWindow(window.hwnd, x, y, w, h, true);
|
|
357
|
+
user32.SetForegroundWindow(window.hwnd);
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
|
|
55
361
|
let dbg = false;
|
|
56
362
|
let dbgVerbose = false; // -dbg flag for detailed output
|
|
57
363
|
let screens: ScreenInfo[] = [];
|
|
@@ -197,6 +503,32 @@ function getScreenForWindow(windowRect: RECT): number {
|
|
|
197
503
|
|
|
198
504
|
const padn = (n: number, p = 6) => n.toString().padStart(p);
|
|
199
505
|
|
|
506
|
+
/**
|
|
507
|
+
* Show position info for windows matching pattern
|
|
508
|
+
*/
|
|
509
|
+
function showWindowInfo(pattern: string): void {
|
|
510
|
+
let matchedWindows = findWindowsByPattern(pattern);
|
|
511
|
+
matchedWindows = matchedWindows.filter(w => !w.title.toLowerCase().includes('tswinpos'));
|
|
512
|
+
|
|
513
|
+
if (matchedWindows.length === 0) {
|
|
514
|
+
console.log(`No windows found matching '${pattern}'`);
|
|
515
|
+
return;
|
|
516
|
+
}
|
|
517
|
+
|
|
518
|
+
for (const window of matchedWindows) {
|
|
519
|
+
const screenIndex = getScreenForWindow(window.rect);
|
|
520
|
+
const screen = screens[screenIndex];
|
|
521
|
+
|
|
522
|
+
const x = window.rect.Left - screen.bounds.Left;
|
|
523
|
+
const y = window.rect.Top - screen.bounds.Top;
|
|
524
|
+
const width = window.rect.Right - window.rect.Left;
|
|
525
|
+
const height = window.rect.Bottom - window.rect.Top;
|
|
526
|
+
|
|
527
|
+
console.log(`${window.title}`);
|
|
528
|
+
console.log(` pos: ${x},${y},${screenIndex} size: ${width},${height}`);
|
|
529
|
+
}
|
|
530
|
+
}
|
|
531
|
+
|
|
200
532
|
function listAllWindows(includeIgnored: boolean = false) {
|
|
201
533
|
console.log('====================================');
|
|
202
534
|
console.log('Screens');
|
|
@@ -236,23 +568,32 @@ function usage(msg: string = '') {
|
|
|
236
568
|
if (msg)
|
|
237
569
|
console.log(msg);
|
|
238
570
|
|
|
239
|
-
console.log('Usage: winpos [
|
|
240
|
-
console.log(' winpos <
|
|
241
|
-
console.log('
|
|
242
|
-
console.log('
|
|
243
|
-
console.log('
|
|
244
|
-
console.log('
|
|
245
|
-
console.log(
|
|
246
|
-
console.log('
|
|
247
|
-
console.log('
|
|
248
|
-
console.log('
|
|
249
|
-
console.log('
|
|
571
|
+
console.log('Usage: winpos [options] <title> <x> <y> <screen> [<width> <height>]');
|
|
572
|
+
console.log(' winpos [options] <title> -pos x,y[,screen] [-size w,h]');
|
|
573
|
+
console.log(' winpos [options] -title <name> -pos x,y[,screen] [-size w,h]');
|
|
574
|
+
console.log(' winpos <title> min | -min');
|
|
575
|
+
console.log(' winpos <config.json>');
|
|
576
|
+
console.log(' winpos -load <config.json> [-save <output.json>]');
|
|
577
|
+
console.log();
|
|
578
|
+
console.log('Options:');
|
|
579
|
+
console.log(' -d Debug mode');
|
|
580
|
+
console.log(' -dbg Verbose debug output');
|
|
581
|
+
console.log(' -c Return screen count as exit code');
|
|
582
|
+
console.log(' -v/-version Show version');
|
|
583
|
+
console.log(' -title name Window title/pattern (alternative to positional)');
|
|
584
|
+
console.log(' -pos x,y[,s] Position (x,y with optional screen index)');
|
|
585
|
+
console.log(' -size w,h Window size (width,height)');
|
|
586
|
+
console.log(' -min Minimize window');
|
|
587
|
+
console.log(' -max Maximize window');
|
|
588
|
+
console.log(' -load file Load config from JSON file');
|
|
589
|
+
console.log(' -save file Save config to JSON file (merges if file exists)');
|
|
250
590
|
console.log();
|
|
251
|
-
console.log('
|
|
252
|
-
console.log('
|
|
253
|
-
console.log('
|
|
254
|
-
console.log(
|
|
255
|
-
console.log('
|
|
591
|
+
console.log('Position/size values can be pixels or percentages (e.g. 50%)');
|
|
592
|
+
console.log('Title can be regex (/pattern/) or prefix (title*)');
|
|
593
|
+
console.log('* = list windows, ** = list all including ignored');
|
|
594
|
+
console.log();
|
|
595
|
+
console.log('JSON format: {"name":"app","regex":false,"pos":{"x":0,"y":0,"screen":0},"size":{"w":800,"h":600}}');
|
|
596
|
+
console.log(' or array: [{...}, {...}]');
|
|
256
597
|
console.log();
|
|
257
598
|
console.log('Screen | X Y | W H ');
|
|
258
599
|
console.log('------------------------------------');
|
|
@@ -260,8 +601,6 @@ function usage(msg: string = '') {
|
|
|
260
601
|
const screen = screens[i];
|
|
261
602
|
console.log(`${i.toString().padStart(6)} | ${screen.bounds.Left.toString().padStart(5)} ${screen.bounds.Top.toString().padStart(5)} | ${screen.bounds.Width.toString().padStart(5)} ${screen.bounds.Height.toString().padStart(5)}`);
|
|
262
603
|
}
|
|
263
|
-
console.log();
|
|
264
|
-
console.log('0-Lower right, 1-Lower Left, 2-Upper left, 3-Upper right');
|
|
265
604
|
|
|
266
605
|
process.exit(1);
|
|
267
606
|
}
|
|
@@ -282,62 +621,109 @@ export function run(args: string[]) {
|
|
|
282
621
|
const ignoresPath = join(import.meta.dirname, 'ignores.txt');
|
|
283
622
|
loadIgnorePatterns(ignoresPath);
|
|
284
623
|
|
|
285
|
-
// Parse
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
624
|
+
// Parse arguments using new parser
|
|
625
|
+
const opts = parseArgs(args);
|
|
626
|
+
|
|
627
|
+
// Set debug flags
|
|
628
|
+
dbg = opts.debug;
|
|
629
|
+
dbgVerbose = opts.debugVerbose;
|
|
630
|
+
|
|
631
|
+
if (dbg) console.log('Debug mode enabled.');
|
|
632
|
+
if (dbgVerbose) console.log(`[DBG] winpos version ${packageJson.default.version}`);
|
|
633
|
+
|
|
634
|
+
// Handle -c (screen count)
|
|
635
|
+
if (opts.showCount) {
|
|
636
|
+
console.log(screens.length);
|
|
637
|
+
process.exit(screens.length);
|
|
638
|
+
}
|
|
639
|
+
|
|
640
|
+
// Handle load file (JSON config)
|
|
641
|
+
if (opts.loadFile) {
|
|
642
|
+
try {
|
|
643
|
+
const config = loadConfigFile(opts.loadFile);
|
|
644
|
+
const configs = Array.isArray(config) ? config : [config];
|
|
645
|
+
|
|
646
|
+
// If -save specified with CLI params, merge new config into loaded
|
|
647
|
+
if (opts.saveFile && opts.windowTitle) {
|
|
648
|
+
const newConfig = buildConfigFromOptions(opts);
|
|
649
|
+
if (newConfig) {
|
|
650
|
+
// Apply the CLI-specified window first
|
|
651
|
+
applyWindowConfig(newConfig, screens);
|
|
652
|
+
// Save merged config
|
|
653
|
+
saveConfigFile(opts.saveFile, newConfig, true);
|
|
654
|
+
}
|
|
655
|
+
}
|
|
656
|
+
|
|
657
|
+
// Apply all loaded configs
|
|
658
|
+
for (const cfg of configs) {
|
|
659
|
+
applyWindowConfig(cfg, screens);
|
|
660
|
+
}
|
|
661
|
+
return;
|
|
662
|
+
} catch (e: any) {
|
|
663
|
+
console.error(`Error loading config: ${e.message}`);
|
|
664
|
+
process.exit(1);
|
|
309
665
|
}
|
|
310
|
-
args = args.slice(1);
|
|
311
666
|
}
|
|
312
667
|
|
|
313
|
-
// Handle
|
|
668
|
+
// Handle new flag-based syntax (-pos, -size, -min, -max)
|
|
669
|
+
if (opts.pos || opts.size || opts.minimize || opts.maximize) {
|
|
670
|
+
if (!opts.windowTitle) {
|
|
671
|
+
usage('Window title required when using -pos, -size, -min, or -max');
|
|
672
|
+
return;
|
|
673
|
+
}
|
|
674
|
+
|
|
675
|
+
const config = buildConfigFromOptions(opts);
|
|
676
|
+
if (config) {
|
|
677
|
+
applyWindowConfig(config, screens);
|
|
678
|
+
|
|
679
|
+
// Save if requested
|
|
680
|
+
if (opts.saveFile) {
|
|
681
|
+
saveConfigFile(opts.saveFile, config, existsSync(opts.saveFile));
|
|
682
|
+
}
|
|
683
|
+
}
|
|
684
|
+
return;
|
|
685
|
+
}
|
|
686
|
+
|
|
687
|
+
// If only -title provided (no -pos/-size/-min/-max), show window position info
|
|
688
|
+
if (opts.windowTitle && !opts.loadFile) {
|
|
689
|
+
showWindowInfo(opts.windowTitle);
|
|
690
|
+
return;
|
|
691
|
+
}
|
|
692
|
+
|
|
693
|
+
// Fall back to legacy positional argument handling
|
|
694
|
+
const posArgs = opts.positionalArgs;
|
|
314
695
|
|
|
315
|
-
// console.log(DEBUG: args.length=', args.length, 'args[0]=', args[0], 'check=', args.length === 1 && args[0] === '*');
|
|
316
696
|
if (dbg)
|
|
317
|
-
console.log(`DEBUG[${packageJson.default.version}]: ${
|
|
318
|
-
|
|
697
|
+
console.log(`DEBUG[${packageJson.default.version}]: ${posArgs.join(' ')}`);
|
|
698
|
+
|
|
699
|
+
if (posArgs.length === 1 && posArgs[0] === '*') {
|
|
319
700
|
listAllWindows();
|
|
320
701
|
return;
|
|
321
702
|
}
|
|
322
703
|
|
|
323
|
-
if (
|
|
704
|
+
if (posArgs.length === 1 && posArgs[0] === '**') {
|
|
324
705
|
listAllWindows(true);
|
|
325
706
|
return;
|
|
326
707
|
}
|
|
327
708
|
|
|
328
709
|
// Check for minimize command (title + min/-min)
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
710
|
+
if (posArgs.length === 2 && (posArgs[1].toLowerCase() === 'min' || posArgs[1].toLowerCase() === '-min')) {
|
|
711
|
+
adjustWindow(posArgs);
|
|
712
|
+
return;
|
|
713
|
+
}
|
|
714
|
+
|
|
715
|
+
// Single positional arg = show window info
|
|
716
|
+
if (posArgs.length === 1) {
|
|
717
|
+
showWindowInfo(posArgs[0]);
|
|
332
718
|
return;
|
|
333
719
|
}
|
|
334
720
|
|
|
335
|
-
if (
|
|
721
|
+
if (posArgs.length < 4) {
|
|
336
722
|
usage();
|
|
337
723
|
return;
|
|
338
724
|
}
|
|
339
725
|
|
|
340
|
-
adjustWindow(
|
|
726
|
+
adjustWindow(posArgs);
|
|
341
727
|
}
|
|
342
728
|
|
|
343
729
|
// CLI entry point using import.meta.main
|
package/layout.json
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
[
|
|
2
|
+
{
|
|
3
|
+
"name": "jserv",
|
|
4
|
+
"pos": { "x": 40, "y": 800, "screen": 1 },
|
|
5
|
+
"size": { "w": 1800, "h": 600 }
|
|
6
|
+
},
|
|
7
|
+
{
|
|
8
|
+
"name": "backupsystem",
|
|
9
|
+
"pos": { "x": 1400, "y": 0, "screen": 1 },
|
|
10
|
+
"size": { "w": 1024, "h": 1400 }
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
"name": "sqlproxy*",
|
|
14
|
+
"pos": { "x": 64, "y": 45, "screen": 3 },
|
|
15
|
+
"size": { "w": 1200, "h": 600 }
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"name": "resender",
|
|
19
|
+
"pos": { "x": 1314, "y": 45, "screen": 3 },
|
|
20
|
+
"size": { "w": 1200, "h": 600 }
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"name": "pings",
|
|
24
|
+
"regex": true,
|
|
25
|
+
"pos": { "x": 67, "y": 702, "screen": 3 },
|
|
26
|
+
"size": { "w": 1200, "h": 600 }
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"name": "pingresults",
|
|
30
|
+
"pos": { "x": 30, "y": 10, "screen": 1 },
|
|
31
|
+
"size": { "w": 1350, "h": 750 }
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
"name": "initshell",
|
|
35
|
+
"pos": { "x": 400, "y": 400, "screen": 2 },
|
|
36
|
+
"size": { "w": 1300, "h": 700 }
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
"name": "perplexity",
|
|
40
|
+
"minimize": true
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
"name": "Phone Link",
|
|
44
|
+
"minimize": true
|
|
45
|
+
}
|
|
46
|
+
]
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bobfrankston/winpos",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.41",
|
|
4
4
|
"description": "TypeScript implementation of winpos - Windows window positioning utility",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "index.js",
|
|
@@ -14,8 +14,7 @@
|
|
|
14
14
|
"prerelease:local": "git add -A && (git diff-index --quiet HEAD || git commit -m \"Pre-release commit\")",
|
|
15
15
|
"preversion": "npm run build && git add -A",
|
|
16
16
|
"postversion": "git push && git push --tags",
|
|
17
|
-
"release": "npm run prerelease:local && npm version patch && npm publish",
|
|
18
|
-
"release:ps1": "releaseapp.ps1",
|
|
17
|
+
"release": "npm run prerelease:local && npm version patch && npm publish --quiet",
|
|
19
18
|
"installer": "npm run release && npm install -g @bobfrankston/winpos"
|
|
20
19
|
},
|
|
21
20
|
"keywords": [
|
package/smposer.json
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
[
|
|
2
|
+
{
|
|
3
|
+
"name": "Epsilon",
|
|
4
|
+
"regex": true,
|
|
5
|
+
"pos": { "x": 200, "y": 160, "screen": 0 }
|
|
6
|
+
},
|
|
7
|
+
{
|
|
8
|
+
"name": "ctw",
|
|
9
|
+
"regex": true,
|
|
10
|
+
"pos": { "x": 200, "y": 200, "screen": 1 }
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
"name": "smpxcmd",
|
|
14
|
+
"pos": { "x": 300, "y": 300, "screen": 2 },
|
|
15
|
+
"size": { "w": 1500, "h": 1200 }
|
|
16
|
+
}
|
|
17
|
+
]
|