First commit, mainly testing.
[reactos.git] / rosapps / lib / dflat32 / sysmenu.c
1 /* ------------- sysmenu.c ------------ */
2
3 #include "dflat32/dflat.h"
4
5 int SystemMenuProc(DFWINDOW wnd, DFMESSAGE msg, PARAM p1, PARAM p2)
6 {
7 int mx, my;
8 DFWINDOW wnd1;
9 switch (msg) {
10 case CREATE_WINDOW:
11 wnd->holdmenu = ActiveMenuBar;
12 ActiveMenuBar = &SystemMenu;
13 SystemMenu.PullDown[0].Selection = 0;
14 break;
15 case LEFT_BUTTON:
16 wnd1 = GetParent(wnd);
17 mx = (int) p1 - GetLeft(wnd1);
18 my = (int) p2 - GetTop(wnd1);
19 if (HitControlBox(wnd1, mx, my))
20 return TRUE;
21 break;
22 case LB_CHOOSE:
23 DfPostMessage(wnd, CLOSE_WINDOW, 0, 0);
24 break;
25 case DOUBLE_CLICK:
26 if (p2 == GetTop(GetParent(wnd))) {
27 DfPostMessage(GetParent(wnd), msg, p1, p2);
28 DfSendMessage(wnd, CLOSE_WINDOW, TRUE, 0);
29 }
30 return TRUE;
31 case SHIFT_CHANGED:
32 return TRUE;
33 case CLOSE_WINDOW:
34 ActiveMenuBar = wnd->holdmenu;
35 break;
36 default:
37 break;
38 }
39 return DefaultWndProc(wnd, msg, p1, p2);
40 }
41
42 /* ------- Build a system menu -------- */
43 void BuildSystemMenu(DFWINDOW wnd)
44 {
45 int lf, tp, ht, wd;
46 DFWINDOW SystemMenuWnd;
47
48 SystemMenu.PullDown[0].Selections[6].Accelerator =
49 (GetClass(wnd) == APPLICATION) ? ALT_F4 : CTRL_F4;
50
51 lf = GetLeft(wnd)+1;
52 tp = GetTop(wnd)+1;
53 ht = MenuHeight(SystemMenu.PullDown[0].Selections);
54 wd = MenuWidth(SystemMenu.PullDown[0].Selections);
55
56 if (lf+wd > DfGetScreenWidth()-1)
57 lf = (DfGetScreenWidth()-1) - wd;
58 if (tp+ht > DfGetScreenHeight()-2)
59 tp = (DfGetScreenHeight()-2) - ht;
60
61 SystemMenuWnd = DfCreateWindow(POPDOWNMENU, NULL,
62 lf,tp,ht,wd,NULL,wnd,SystemMenuProc, 0);
63
64 #ifdef INCLUDE_RESTORE
65 if (wnd->condition == ISRESTORED)
66 DeactivateCommand(&SystemMenu, ID_SYSRESTORE);
67 else
68 ActivateCommand(&SystemMenu, ID_SYSRESTORE);
69 #endif
70
71 if (TestAttribute(wnd, MOVEABLE)
72 #ifdef INCLUDE_MAXIMIZE
73 && wnd->condition != ISMAXIMIZED
74 #endif
75 )
76 ActivateCommand(&SystemMenu, ID_SYSMOVE);
77 else
78 DeactivateCommand(&SystemMenu, ID_SYSMOVE);
79
80 if (wnd->condition != ISRESTORED ||
81 TestAttribute(wnd, SIZEABLE) == FALSE)
82 DeactivateCommand(&SystemMenu, ID_SYSSIZE);
83 else
84 ActivateCommand(&SystemMenu, ID_SYSSIZE);
85
86 #ifdef INCLUDE_MINIMIZE
87 if (wnd->condition == ISMINIMIZED ||
88 TestAttribute(wnd, MINMAXBOX) == FALSE)
89 DeactivateCommand(&SystemMenu, ID_SYSMINIMIZE);
90 else
91 ActivateCommand(&SystemMenu, ID_SYSMINIMIZE);
92 #endif
93
94 #ifdef INCLUDE_MAXIMIZE
95 if (wnd->condition != ISRESTORED ||
96 TestAttribute(wnd, MINMAXBOX) == FALSE)
97 DeactivateCommand(&SystemMenu, ID_SYSMAXIMIZE);
98 else
99 ActivateCommand(&SystemMenu, ID_SYSMAXIMIZE);
100 #endif
101
102 DfSendMessage(SystemMenuWnd, BUILD_SELECTIONS,
103 (PARAM) &SystemMenu.PullDown[0], 0);
104 DfSendMessage(SystemMenuWnd, SETFOCUS, TRUE, 0);
105 DfSendMessage(SystemMenuWnd, SHOW_WINDOW, 0, 0);
106 }
107
108 /* EOF */