Skip to content

Commit 5af1633

Browse files
committed
0.9.0.40: New centralized handling for global keyboard shortcuts: view switching, exit, new full-screen toggle and more, removed redundant code from subclasses
1 parent 2c38625 commit 5af1633

5 files changed

Lines changed: 67 additions & 120 deletions

File tree

src/sqlite-ce-edit/editor.c

Lines changed: 46 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,43 @@
44

55
#include "globals.h"
66

7+
/*
8+
** Centralized keyboard handler for app-wide shortcuts.
9+
** Call from each subclass proc; returns 1 if key was handled.
10+
*/
11+
int HandleGlobalKeys(UINT msg, WPARAM wParam) {
12+
int ctrl = GetKeyState(VK_CONTROL) < 0;
13+
int alt = GetKeyState(VK_MENU) < 0;
14+
15+
if (msg == WM_SYSKEYDOWN || msg == WM_SYSCHAR) {
16+
if ((wParam == 'X' || wParam == 'x') && alt) {
17+
if (msg == WM_SYSKEYDOWN)
18+
SendMessage(g_hwndMain, WM_CLOSE, 0, 0);
19+
return 1;
20+
}
21+
if ((wParam == VK_RETURN || wParam == '\r') && alt) {
22+
if (msg == WM_SYSKEYDOWN)
23+
SendMessage(g_hwndMain, WM_COMMAND, IDM_FULLSCREEN, 0);
24+
return 1;
25+
}
26+
}
27+
if (msg == WM_KEYDOWN) {
28+
if (wParam == VK_ESCAPE && g_fullScreen) {
29+
SendMessage(g_hwndMain, WM_COMMAND, IDM_FULLSCREEN, 0);
30+
return 1;
31+
}
32+
if (ctrl) {
33+
if (wParam == '1') { SendMessage(g_hwndMain, WM_COMMAND, IDM_VIEWQUERY, 0); return 1; }
34+
if (wParam == '2') { SendMessage(g_hwndMain, WM_COMMAND, IDM_VIEWRESULT, 0); return 1; }
35+
if (wParam == '3') { SendMessage(g_hwndMain, WM_COMMAND, IDM_VIEWSCHEMA, 0); return 1; }
36+
}
37+
if (wParam == VK_F5) { ExecuteQuery(); return 1; }
38+
if (wParam == VK_F6) { SendMessage(g_hwndMain, WM_COMMAND, IDM_VIEWRESULT, 0); return 1; }
39+
if (wParam == VK_F7) { SendMessage(g_hwndMain, WM_COMMAND, IDM_VIEWSCHEMA, 0); return 1; }
40+
}
41+
return 0;
42+
}
43+
744
void UpdateLineCount(void) {
845
wchar_t buf[32];
946
DWORD sel;
@@ -296,11 +333,9 @@ LRESULT CALLBACK LineNumProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
296333

297334
/* Subclass proc for query edit - catches Ctrl+Enter */
298335
LRESULT CALLBACK QueryEditProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
299-
/* Alt+X - Exit (must handle here when edit has focus) */
300-
if (msg == WM_SYSKEYDOWN && (wParam == 'X' || wParam == 'x')) {
301-
SendMessage(g_hwndMain, WM_CLOSE, 0, 0);
336+
/* Global shortcuts first */
337+
if (HandleGlobalKeys(msg, wParam))
302338
return 0;
303-
}
304339
/* Clear hint on focus */
305340
if (msg == WM_SETFOCUS && g_showingHint) {
306341
SetWindowTextW(hwnd, L"");
@@ -361,27 +396,6 @@ LRESULT CALLBACK QueryEditProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam
361396
DoFindNext();
362397
return 0;
363398
}
364-
/* F6 - Toggle view, Ctrl+1 - Query, Ctrl+2 - Results, Ctrl+3 - Schema */
365-
if (wParam == VK_F6) {
366-
SendMessage(g_hwndMain, WM_COMMAND, IDM_VIEWRESULT, 0);
367-
return 0;
368-
}
369-
if (wParam == VK_F7) {
370-
SendMessage(g_hwndMain, WM_COMMAND, IDM_VIEWSCHEMA, 0);
371-
return 0;
372-
}
373-
if (ctrl && wParam == '1') {
374-
SendMessage(g_hwndMain, WM_COMMAND, IDM_VIEWQUERY, 0);
375-
return 0;
376-
}
377-
if (ctrl && wParam == '2') {
378-
SendMessage(g_hwndMain, WM_COMMAND, IDM_VIEWRESULT, 0);
379-
return 0;
380-
}
381-
if (ctrl && wParam == '3') {
382-
SendMessage(g_hwndMain, WM_COMMAND, IDM_VIEWSCHEMA, 0);
383-
return 0;
384-
}
385399
/* Ctrl+A - Select all (CE edit control may not support natively) */
386400
if (ctrl && wParam == 'A') {
387401
SendMessage(hwnd, EM_SETSEL, 0, -1);
@@ -455,6 +469,9 @@ LRESULT CALLBACK QueryEditProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam
455469

456470
/* Subclass proc for result edit - blocks input but allows copy */
457471
LRESULT CALLBACK ResultEditProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
472+
/* Global shortcuts first */
473+
if (HandleGlobalKeys(msg, wParam))
474+
return 0;
458475
if (msg == WM_KEYDOWN) {
459476
int ctrl = GetKeyState(VK_CONTROL) < 0;
460477
/* Allow navigation keys through */
@@ -469,8 +486,8 @@ LRESULT CALLBACK ResultEditProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPara
469486
/* Ctrl+C - Copy (pass through) */
470487
if (ctrl && wParam == 'C')
471488
return CallWindowProc(g_pfnResultProc, hwnd, msg, wParam, lParam);
472-
/* F5 or Ctrl+E - Execute */
473-
if (wParam == VK_F5 || (ctrl && wParam == 'E')) {
489+
/* Ctrl+E - Execute */
490+
if (ctrl && wParam == 'E') {
474491
ExecuteQuery();
475492
return 0;
476493
}
@@ -506,30 +523,11 @@ LRESULT CALLBACK ResultEditProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPara
506523
DoFindNext();
507524
return 0;
508525
}
509-
/* F6/Escape - back to query, Ctrl+1 - Query, Ctrl+2 - Results, Ctrl+3 - Schema */
510-
if (wParam == VK_F6 || wParam == VK_ESCAPE || wParam == VK_BACK) {
511-
if (wParam == VK_ESCAPE && g_fullScreen)
512-
SendMessage(g_hwndMain, WM_COMMAND, IDM_FULLSCREEN, 0);
513-
else
514-
SendMessage(g_hwndMain, WM_COMMAND, IDM_VIEWQUERY, 0);
515-
return 0;
516-
}
517-
if (wParam == VK_F7) {
518-
SendMessage(g_hwndMain, WM_COMMAND, IDM_VIEWSCHEMA, 0);
519-
return 0;
520-
}
521-
if (ctrl && wParam == '1') {
526+
/* Escape/Backspace - back to query */
527+
if (wParam == VK_ESCAPE || wParam == VK_BACK) {
522528
SendMessage(g_hwndMain, WM_COMMAND, IDM_VIEWQUERY, 0);
523529
return 0;
524530
}
525-
if (ctrl && wParam == '2') {
526-
SendMessage(g_hwndMain, WM_COMMAND, IDM_VIEWRESULT, 0);
527-
return 0;
528-
}
529-
if (ctrl && wParam == '3') {
530-
SendMessage(g_hwndMain, WM_COMMAND, IDM_VIEWSCHEMA, 0);
531-
return 0;
532-
}
533531
/* Ctrl+G - Toggle grid view */
534532
if (ctrl && wParam == 'G') {
535533
SendMessage(g_hwndMain, WM_COMMAND, IDM_EXECATCURSOR, 0);

src/sqlite-ce-edit/globals.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ BOOL WINAPI GetSaveFileNameW(CE_OPENFILENAME*);
8282
** Version
8383
**============================================================================*/
8484

85-
#define SQLITECEDIT_VERSION L"0.9.0.37"
85+
#define SQLITECEDIT_VERSION L"0.9.0.40"
8686

8787
/*============================================================================
8888
** Menu IDs
@@ -211,6 +211,9 @@ extern int g_showLineNumbers;
211211
extern int g_lineNumWidth;
212212
extern int g_showStatusBar;
213213
extern int g_fullScreen;
214+
215+
/* Centralized keyboard handler - returns 1 if handled */
216+
int HandleGlobalKeys(UINT msg, WPARAM wParam);
214217
extern WNDPROC g_pfnQueryProc;
215218
extern WNDPROC g_pfnResultProc;
216219
extern WNDPROC g_pfnGridProc;

src/sqlite-ce-edit/grid.c

Lines changed: 7 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -95,13 +95,9 @@ static void CopySelectedRow(void) {
9595
}
9696

9797
LRESULT CALLBACK GridProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
98-
if (msg == WM_SYSKEYDOWN) {
99-
/* Alt+X - Exit */
100-
if (wParam == 'X') {
101-
SendMessage(g_hwndMain, WM_CLOSE, 0, 0);
102-
return 0;
103-
}
104-
}
98+
/* Global shortcuts first */
99+
if (HandleGlobalKeys(msg, wParam))
100+
return 0;
105101
if (msg == WM_KEYDOWN) {
106102
int ctrl = GetKeyState(VK_CONTROL) < 0;
107103

@@ -127,33 +123,13 @@ LRESULT CALLBACK GridProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
127123
SendMessage(g_hwndMain, WM_COMMAND, IDM_EXECATCURSOR, 0);
128124
return 0;
129125
}
130-
/* F6/Escape/Backspace - back to query */
131-
if (wParam == VK_F6 || wParam == VK_ESCAPE || wParam == VK_BACK) {
132-
if (wParam == VK_ESCAPE && g_fullScreen)
133-
SendMessage(g_hwndMain, WM_COMMAND, IDM_FULLSCREEN, 0);
134-
else
135-
SendMessage(g_hwndMain, WM_COMMAND, IDM_VIEWQUERY, 0);
136-
return 0;
137-
}
138-
if (wParam == VK_F7) {
139-
SendMessage(g_hwndMain, WM_COMMAND, IDM_VIEWSCHEMA, 0);
140-
return 0;
141-
}
142-
/* Ctrl+1/2/3 - View switching */
143-
if (ctrl && wParam == '1') {
126+
/* Escape/Backspace - back to query */
127+
if (wParam == VK_ESCAPE || wParam == VK_BACK) {
144128
SendMessage(g_hwndMain, WM_COMMAND, IDM_VIEWQUERY, 0);
145129
return 0;
146130
}
147-
if (ctrl && wParam == '2') {
148-
SendMessage(g_hwndMain, WM_COMMAND, IDM_VIEWRESULT, 0);
149-
return 0;
150-
}
151-
if (ctrl && wParam == '3') {
152-
SendMessage(g_hwndMain, WM_COMMAND, IDM_VIEWSCHEMA, 0);
153-
return 0;
154-
}
155-
/* F5 or Ctrl+E - Execute */
156-
if (wParam == VK_F5 || (ctrl && wParam == 'E')) {
131+
/* Ctrl+E - Execute */
132+
if (ctrl && wParam == 'E') {
157133
ExecuteQuery();
158134
return 0;
159135
}

src/sqlite-ce-edit/main.c

Lines changed: 8 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -437,18 +437,11 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPara
437437
break;
438438

439439
case WM_SYSKEYDOWN:
440-
if (wParam == 'X' && GetKeyState(VK_MENU) < 0) {
441-
SendMessage(hwnd, WM_CLOSE, 0, 0);
442-
return 0;
443-
}
444-
if (wParam == VK_RETURN && GetKeyState(VK_MENU) < 0) {
445-
SendMessage(hwnd, WM_COMMAND, IDM_FULLSCREEN, 0);
446-
return 0;
447-
}
448-
break;
449-
440+
case WM_SYSCHAR:
450441
case WM_KEYDOWN:
451-
if (GetKeyState(VK_CONTROL) < 0) {
442+
if (HandleGlobalKeys(msg, wParam))
443+
return 0;
444+
if (msg == WM_KEYDOWN && GetKeyState(VK_CONTROL) < 0) {
452445
if (wParam == 'O') {
453446
if ((GetWindowTextLengthW(g_hwndQuery) == 0 || g_showingHint) &&
454447
lstrcmpW(g_szDbPath, L":memory:") == 0)
@@ -468,13 +461,7 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPara
468461
if (wParam == 'C') { g_abortQuery = 1; return 0; }
469462
if (wParam == 'F') { DoFind(); return 0; }
470463
if (wParam == 'H') { DoReplace(); return 0; }
471-
if (wParam == '1') { SendMessage(hwnd, WM_COMMAND, IDM_VIEWQUERY, 0); return 0; }
472-
if (wParam == '2') { SendMessage(hwnd, WM_COMMAND, IDM_VIEWRESULT, 0); return 0; }
473-
if (wParam == '3') { SendMessage(hwnd, WM_COMMAND, IDM_VIEWSCHEMA, 0); return 0; }
474464
}
475-
if (wParam == VK_F5) { ExecuteQuery(); return 0; }
476-
if (wParam == VK_F6) { SendMessage(hwnd, WM_COMMAND, IDM_VIEWRESULT, 0); return 0; }
477-
if (wParam == VK_F7) { SendMessage(hwnd, WM_COMMAND, IDM_VIEWSCHEMA, 0); return 0; }
478465
if (wParam == VK_UP || wParam == VK_DOWN || wParam == VK_LEFT || wParam == VK_RIGHT) {
479466
if (g_viewMode == 0) SetFocus(g_hwndQuery);
480467
else if (g_viewMode == 1) SetFocus(g_gridView ? g_hwndGrid : g_hwndResult);
@@ -527,32 +514,17 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPara
527514
OnSchemaDoubleClick();
528515
} else if (pnm->code == TVN_KEYDOWN) {
529516
TV_KEYDOWN *pKey = (TV_KEYDOWN*)lParam;
517+
/* Try global handler first */
518+
if (HandleGlobalKeys(WM_KEYDOWN, pKey->wVKey))
519+
return TRUE;
530520
if (pKey->wVKey == VK_DELETE) {
531521
OnSchemaDelete();
532522
return TRUE;
533523
} else if (pKey->wVKey == VK_RETURN) {
534524
OnSchemaDoubleClick();
535525
return TRUE;
536526
} else if (pKey->wVKey == VK_ESCAPE) {
537-
if (g_fullScreen) {
538-
SendMessage(hwnd, WM_COMMAND, IDM_FULLSCREEN, 0);
539-
} else {
540-
SendMessage(hwnd, WM_COMMAND, IDM_VIEWQUERY, 0);
541-
}
542-
return TRUE;
543-
} else if (GetKeyState(VK_CONTROL) < 0) {
544-
if (pKey->wVKey == '1') SendMessage(hwnd, WM_COMMAND, IDM_VIEWQUERY, 0);
545-
else if (pKey->wVKey == '2') SendMessage(hwnd, WM_COMMAND, IDM_VIEWRESULT, 0);
546-
else if (pKey->wVKey == '3') SendMessage(hwnd, WM_COMMAND, IDM_VIEWSCHEMA, 0);
547-
return TRUE;
548-
} else if (pKey->wVKey == VK_F5) {
549-
ExecuteQuery();
550-
return TRUE;
551-
} else if (pKey->wVKey == VK_F6) {
552-
SendMessage(hwnd, WM_COMMAND, IDM_VIEWRESULT, 0);
553-
return TRUE;
554-
} else if (pKey->wVKey == VK_F7) {
555-
SendMessage(hwnd, WM_COMMAND, IDM_VIEWSCHEMA, 0);
527+
SendMessage(hwnd, WM_COMMAND, IDM_VIEWQUERY, 0);
556528
return TRUE;
557529
}
558530
}

src/sqlite-ce-edit/schema.c

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -100,11 +100,9 @@ void GetSchemaStatus(wchar_t *buf, int bufLen) {
100100
static WNDPROC g_pfnSchemaProc;
101101

102102
static LRESULT CALLBACK SchemaSubclassProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
103-
/* Alt+X - Exit */
104-
if (msg == WM_SYSKEYDOWN && wParam == 'X') {
105-
SendMessage(g_hwndMain, WM_CLOSE, 0, 0);
103+
/* Global shortcuts first */
104+
if (HandleGlobalKeys(msg, wParam))
106105
return 0;
107-
}
108106
/* Suppress beep on Enter - only eat WM_CHAR, let WM_KEYDOWN through for TVN_KEYDOWN */
109107
if (msg == WM_CHAR && wParam == '\r')
110108
return 0;

0 commit comments

Comments
 (0)