4 * Copyright 1996 Ulrich Schmid <uschmid@mail.hh.provi.de>
18 static VOID MAIN_CreateGroups(void);
19 static VOID MAIN_MenuCommand(HWND hWnd, WPARAM wParam, LPARAM lParam);
20 static ATOM MAIN_RegisterMainWinClass(void);
21 static VOID MAIN_CreateMainWindow(void);
22 static VOID MAIN_CreateMDIWindow(void);
23 static VOID MAIN_AutoStart(void);
25 #define BUFFER_SIZE 1000
27 /***********************************************************************
32 int PASCAL WinMain (HANDLE hInstance, HANDLE prev, LPSTR cmdline, int show)
37 Globals.lpszIniFile = "progman.ini";
38 Globals.lpszIcoFile = "progman.ico";
39 #else /* Configuration in `wine.ini' */
41 CHAR buffer[MAX_PATHNAME_LEN], *p;
43 /* Redirect `progman.ini' */
44 PROFILE_GetWineIniString("progman", "progman.ini", "progman.ini",
45 buffer, sizeof(buffer));
46 Globals.lpszIniFile = p = LocalLock(LocalAlloc(LMEM_FIXED, lstrlen(buffer)+1));
47 hmemcpy16(p, buffer, 1 + lstrlen(buffer));
49 /* Redirect `progman.ico' */
50 PROFILE_GetWineIniString("progman", "progman.ico", "progman.ico",
51 buffer, sizeof(buffer));
52 Globals.lpszIcoFile = p = LocalLock(LocalAlloc(LMEM_FIXED, lstrlen(buffer)+1));
53 hmemcpy16(p, buffer, 1 + lstrlen(buffer));
59 Globals.lpszLanguage = Languages[Options.language].name;
61 Globals.lpszLanguage = "En";
64 Globals.hInstance = hInstance;
66 Globals.hActiveGroup = 0;
68 /* Read Options from `progman.ini' */
69 Globals.bAutoArrange =
70 GetPrivateProfileInt("Settings", "AutoArrange", 0, Globals.lpszIniFile);
72 GetPrivateProfileInt("Settings", "MinOnRun", 0, Globals.lpszIniFile);
73 Globals.bSaveSettings =
74 GetPrivateProfileInt("Settings", "SaveSettings", 0, Globals.lpszIniFile);
76 /* Load default icons */
77 Globals.hMainIcon = ExtractIcon(Globals.hInstance, Globals.lpszIcoFile, 0);
78 Globals.hGroupIcon = ExtractIcon(Globals.hInstance, Globals.lpszIcoFile, 0);
79 Globals.hDefaultIcon = ExtractIcon(Globals.hInstance, Globals.lpszIcoFile, 0);
80 if (!Globals.hMainIcon) Globals.hMainIcon = LoadIcon(0, MAKEINTRESOURCE(DEFAULTICON));
81 if (!Globals.hGroupIcon) Globals.hGroupIcon = LoadIcon(0, MAKEINTRESOURCE(DEFAULTICON));
82 if (!Globals.hDefaultIcon) Globals.hDefaultIcon = LoadIcon(0, MAKEINTRESOURCE(DEFAULTICON));
84 /* Register classes */
87 if (!MAIN_RegisterMainWinClass()) return(FALSE);
88 if (!GROUP_RegisterGroupWinClass()) return(FALSE);
89 if (!PROGRAM_RegisterProgramWinClass()) return(FALSE);
92 /* Create main window */
93 MAIN_CreateMainWindow();
94 Globals.hAccel = LoadAccelerators(Globals.hInstance, STRING_ACCEL);
96 /* Setup menu, stringtable and resourcenames */
97 STRING_SelectLanguageByName(Globals.lpszLanguage);
99 MAIN_CreateMDIWindow();
101 /* Initialize groups */
104 /* Start initial applications */
108 while (GetMessage (&msg, 0, 0, 0))
109 if (!TranslateAccelerator(Globals.hMainWnd, Globals.hAccel, &msg))
111 TranslateMessage (&msg);
112 DispatchMessage (&msg);
117 /***********************************************************************
122 static VOID MAIN_CreateGroups()
124 CHAR buffer[BUFFER_SIZE];
125 CHAR szPath[MAX_PATHNAME_LEN];
128 /* Initialize groups according the `Order' entry of `progman.ini' */
129 GetPrivateProfileString("Settings", "Order", "", buffer, sizeof(buffer), Globals.lpszIniFile);
131 while (ptr < buffer + sizeof(buffer))
134 ret = sscanf(ptr, "%d%n", &num, &skip);
136 MAIN_MessageBoxIDS_s(IDS_FILE_READ_ERROR_s, Globals.lpszIniFile, IDS_ERROR, MB_OK);
139 sprintf(key, "Group%d", num);
140 GetPrivateProfileString("Groups", key, "", szPath,
141 sizeof(szPath), Globals.lpszIniFile);
142 if (!szPath[0]) continue;
144 GRPFILE_ReadGroupFile(szPath);
148 /* FIXME initialize other groups, not enumerated by `Order' */
151 /***********************************************************************
156 VOID MAIN_AutoStart()
158 CHAR buffer[BUFFER_SIZE];
159 HLOCAL hGroup, hProgram;
161 GetPrivateProfileString("Settings", "AutoStart", "Autostart", buffer,
162 sizeof(buffer), Globals.lpszIniFile);
164 for (hGroup = GROUP_FirstGroup(); hGroup; hGroup = GROUP_NextGroup(hGroup))
165 if (!lstrcmp(buffer, GROUP_GroupName(hGroup)))
166 for (hProgram = PROGRAM_FirstProgram(hGroup); hProgram;
167 hProgram = PROGRAM_NextProgram(hProgram))
168 PROGRAM_ExecuteProgram(hProgram);
171 /***********************************************************************
176 static LRESULT MAIN_MainWndProc (HWND hWnd, UINT msg,
177 WPARAM wParam, LPARAM lParam)
180 printf("M %4.4x %4.4x\n", msg, wParam);
185 CheckMenuItem(Globals.hOptionMenu, PM_AUTO_ARRANGE,
186 MF_BYCOMMAND | (Globals.bAutoArrange ? MF_CHECKED : MF_UNCHECKED));
187 CheckMenuItem(Globals.hOptionMenu, PM_MIN_ON_RUN,
188 MF_BYCOMMAND | (Globals.bMinOnRun ? MF_CHECKED : MF_UNCHECKED));
189 CheckMenuItem(Globals.hOptionMenu, PM_SAVE_SETTINGS,
190 MF_BYCOMMAND | (Globals.bSaveSettings ? MF_CHECKED : MF_UNCHECKED));
194 if (wParam < PM_FIRST_CHILD)
195 MAIN_MenuCommand(hWnd, wParam, lParam);
202 return(DefFrameProc(hWnd, Globals.hMDIWnd, msg, wParam, lParam));
205 /***********************************************************************
210 static VOID MAIN_MenuCommand(HWND hWnd, WPARAM wParam, LPARAM lParam)
212 HLOCAL hActiveGroup = GROUP_ActiveGroup();
213 HLOCAL hActiveProgram = PROGRAM_ActiveProgram(hActiveGroup);
214 HWND hActiveGroupWnd = GROUP_GroupWnd(hActiveGroup);
220 switch (DIALOG_New((hActiveGroupWnd && !IsIconic(hActiveGroupWnd)) ?
221 PM_NEW_PROGRAM : PM_NEW_GROUP))
224 if (hActiveGroup) PROGRAM_NewProgram(hActiveGroup);
235 PROGRAM_ExecuteProgram(hActiveProgram);
236 else if (hActiveGroupWnd)
237 OpenIcon(hActiveGroupWnd);
243 PROGRAM_CopyMoveProgram(hActiveProgram, wParam == PM_MOVE);
249 if (DIALOG_Delete(IDS_DELETE_PROGRAM_s, PROGRAM_ProgramName(hActiveProgram)))
250 PROGRAM_DeleteProgram(hActiveProgram, TRUE);
252 else if (hActiveGroup)
254 if (DIALOG_Delete(IDS_DELETE_GROUP_s, GROUP_GroupName(hActiveGroup)))
255 GROUP_DeleteGroup(hActiveGroup);
261 PROGRAM_ModifyProgram(hActiveProgram);
262 else if (hActiveGroup)
263 GROUP_ModifyGroup(hActiveGroup);
275 case PM_AUTO_ARRANGE:
276 Globals.bAutoArrange = !Globals.bAutoArrange;
277 CheckMenuItem(Globals.hOptionMenu, PM_AUTO_ARRANGE,
278 MF_BYCOMMAND | (Globals.bAutoArrange ?
279 MF_CHECKED : MF_UNCHECKED));
280 WritePrivateProfileString("Settings", "AutoArrange",
281 Globals.bAutoArrange ? "1" : "0",
282 Globals.lpszIniFile);
283 WriteOutProfiles16();
287 Globals.bMinOnRun = !Globals.bMinOnRun;
288 CheckMenuItem(Globals.hOptionMenu, PM_MIN_ON_RUN,
289 MF_BYCOMMAND | (Globals.bMinOnRun ?
290 MF_CHECKED : MF_UNCHECKED));
291 WritePrivateProfileString("Settings", "MinOnRun",
292 Globals.bMinOnRun ? "1" : "0",
293 Globals.lpszIniFile);
294 WriteOutProfiles16();
297 case PM_SAVE_SETTINGS:
298 Globals.bSaveSettings = !Globals.bSaveSettings;
299 CheckMenuItem(Globals.hOptionMenu, PM_SAVE_SETTINGS,
300 MF_BYCOMMAND | (Globals.bSaveSettings ?
301 MF_CHECKED : MF_UNCHECKED));
302 WritePrivateProfileString("Settings", "SaveSettings",
303 Globals.bSaveSettings ? "1" : "0",
304 Globals.lpszIniFile);
305 WriteOutProfiles16();
310 if (hActiveGroupWnd && !IsIconic(hActiveGroupWnd))
311 ArrangeIconicWindows(hActiveGroupWnd);
313 SendMessage(Globals.hMDIWnd, WM_MDIICONARRANGE, 0, 0);
318 if (!WinHelp(Globals.hMainWnd, "progman.hlp", HELP_INDEX, 0))
319 MAIN_MessageBoxIDS(IDS_WINHELP_ERROR, IDS_ERROR, MB_OK);
323 if (!WinHelp(Globals.hMainWnd, "progman.hlp", HELP_HELPONHELP, 0))
324 MAIN_MessageBoxIDS(IDS_WINHELP_ERROR, IDS_ERROR, MB_OK);
328 WinExec("wintutor.exe", SW_SHOWNORMAL);
332 WineLicense(Globals.hMainWnd, Globals.lpszLanguage);
336 WineWarranty(Globals.hMainWnd, Globals.lpszLanguage);
340 ShellAbout(hWnd, "WINE", "Program Manager", 0);
344 if (wParam >= PM_FIRST_LANGUAGE && wParam <= PM_LAST_LANGUAGE)
345 STRING_SelectLanguageByNumber(wParam - PM_FIRST_LANGUAGE);
347 MAIN_MessageBoxIDS(IDS_NOT_IMPLEMENTED, IDS_ERROR, MB_OK);
352 /***********************************************************************
354 * MAIN_RegisterMainWinClass
357 static ATOM MAIN_RegisterMainWinClass()
361 class.style = CS_HREDRAW | CS_VREDRAW;
362 class.lpfnWndProc = MAIN_MainWndProc;
363 class.cbClsExtra = 0;
364 class.cbWndExtra = 0;
365 class.hInstance = Globals.hInstance;
366 class.hIcon = Globals.hMainIcon;
367 class.hCursor = LoadCursor (0, IDC_ARROW);
368 class.hbrBackground = GetStockObject (NULL_BRUSH);
369 class.lpszMenuName = 0;
370 class.lpszClassName = STRING_MAIN_WIN_CLASS_NAME;
372 return RegisterClass(&class);
375 /***********************************************************************
377 * MAIN_CreateMainWindow
380 static VOID MAIN_CreateMainWindow()
382 INT left , top, right, bottom, width, height, show;
386 Globals.hMainMenu = 0;
388 /* Get the geometry of the main window */
389 GetPrivateProfileString("Settings", "Window", "",
390 buffer, sizeof(buffer), Globals.lpszIniFile);
391 if (5 == sscanf(buffer, "%d %d %d %d %d", &left, &top, &right, &bottom, &show))
393 width = right - left;
394 height = bottom - top;
398 left = top = width = height = CW_USEDEFAULT;
399 show = SW_SHOWNORMAL;
402 /* Create main Window */
404 CreateWindow (STRING_MAIN_WIN_CLASS_NAME, "",
405 WS_OVERLAPPEDWINDOW, left, top, width, height,
406 0, 0, Globals.hInstance, 0);
408 ShowWindow (Globals.hMainWnd, show);
409 UpdateWindow (Globals.hMainWnd);
412 /***********************************************************************
414 * MAIN_CreateMDIWindow
417 static VOID MAIN_CreateMDIWindow()
419 CLIENTCREATESTRUCT ccs;
422 /* Get the geometry of the MDI window */
423 GetClientRect(Globals.hMainWnd, &rect);
425 ccs.hWindowMenu = Globals.hWindowsMenu;
426 ccs.idFirstChild = PM_FIRST_CHILD;
428 /* Create MDI Window */
430 CreateWindow (STRING_MDI_WIN_CLASS_NAME, "",
431 WS_CHILD, rect.left, rect.top,
432 rect.right - rect.left, rect.bottom - rect.top,
434 Globals.hInstance, &ccs);
436 ShowWindow (Globals.hMDIWnd, SW_SHOW);
437 UpdateWindow (Globals.hMDIWnd);
440 /**********************************************************************/
441 /***********************************************************************
445 INT MAIN_MessageBoxIDS(UINT ids_text, UINT ids_title, WORD type)
447 CHAR text[MAX_STRING_LEN];
448 CHAR title[MAX_STRING_LEN];
450 LoadString(Globals.hInstance, ids_text, text, sizeof(text));
451 LoadString(Globals.hInstance, ids_title, title, sizeof(title));
453 return(MessageBox(Globals.hMainWnd, text, title, type));
456 /***********************************************************************
458 * MAIN_MessageBoxIDS_s
460 INT MAIN_MessageBoxIDS_s(UINT ids_text, LPCSTR str, UINT ids_title, WORD type)
462 CHAR text[MAX_STRING_LEN];
463 CHAR title[MAX_STRING_LEN];
464 CHAR newtext[MAX_STRING_LEN + MAX_PATHNAME_LEN];
466 LoadString(Globals.hInstance, ids_text, text, sizeof(text));
467 LoadString(Globals.hInstance, ids_title, title, sizeof(title));
468 wsprintf(newtext, text, str);
470 return(MessageBox(Globals.hMainWnd, newtext, title, type));
473 /***********************************************************************
478 VOID MAIN_ReplaceString(HLOCAL *handle, LPSTR replace)
480 HLOCAL newhandle = LocalAlloc(LMEM_FIXED, strlen(replace) + 1);
483 LPSTR newstring = LocalLock(newhandle);
484 lstrcpy(newstring, replace);
488 else MAIN_MessageBoxIDS(IDS_OUT_OF_MEMORY, IDS_ERROR, MB_OK);
491 /* Local Variables: */
492 /* c-file-style: "GNU" */