-
Notifications
You must be signed in to change notification settings - Fork 65
/
winDebugMenu.c
74 lines (57 loc) · 1.88 KB
/
winDebugMenu.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#include "pharovm/pharo.h"
#include <Windows.h>
#define IDM_OPEN_DEBUGWINDOW 0xE001
LRESULT CALLBACK Pharo_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
EXPORT(int) enableDebugWindowMenu(HWND window){
LONG_PTR originalHandler;
char* errorMessage;
/*
* First check if the window userdata is not used.
* If it is used return FALSE
*/
originalHandler = GetWindowLongPtrW(window, GWLP_USERDATA);
if(originalHandler != 0){
return FALSE;
}
/**
* Store the original WndProc in the user data, so the new WndProc can delegate to it.
*/
originalHandler = GetWindowLongPtrW(window, GWLP_WNDPROC);
SetWindowLongPtrW(window, GWLP_USERDATA, originalHandler);
/*
* Copy the Menu so it can be updated with the new option
*/
HMENU windowMenu = GetSystemMenu(window, FALSE);
if(windowMenu == 0){
logErrorFromGetLastError("Error copying system menu");
return FALSE;
}
if (windowMenu != NULL){
if(AppendMenu(windowMenu, MF_SEPARATOR, 0, NULL) == 0){
logErrorFromGetLastError("Error creating menu");
return FALSE;
}
if(AppendMenu(windowMenu, MF_STRING, IDM_OPEN_DEBUGWINDOW, TEXT("Open Debug Window")) == 0){
logErrorFromGetLastError("Error creating menu");
return FALSE;
}
}
if(SetWindowLongPtrW(window, GWLP_WNDPROC, (LONG_PTR) Pharo_WindowProc) == 0){
logErrorFromGetLastError("Error enabling debug menu");
return FALSE;
}
return TRUE;
}
LRESULT CALLBACK Pharo_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam){
WNDPROC originalHandler = (WNDPROC) GetWindowLongPtrW(hwnd, GWLP_USERDATA);
if(msg == WM_SYSCOMMAND && wParam == IDM_OPEN_DEBUGWINDOW){
logDebug("Open DebugWindow Event");
openDebugWindow(hwnd);
return 0;
}
if(originalHandler){
return CallWindowProcW(originalHandler, hwnd, msg, wParam, lParam);
}else{
return DefWindowProcW(hwnd, msg, wParam, lParam);
}
}