Alexandre Julliard a0b2b1d0f6 Release 971116
Sun Nov 16 07:42:44 1997  Alex Korobka <alex@trantor.pharm.sunysb.edu>

	* [windows/dce.c] [windows/clipboard.c] [windows/nonclient.c]
	Bug fixes.

	* [misc/shell.c] [resources/*]
	New "About" dialog.

Sat Nov 15 17:30:18 1997  Alexandre Julliard  <julliard@lrc.epfl.ch>

	* [configure.in] [Makefile.in]
	Replaced --with-library option by --disable-emulator. The default
 	is now to build both the library and the emulator.
	Renamed --with options to --enable to follow autoconf guidelines.

	* [loader/main.c] [miscemu/main.c] (New file)
	Split initialization in WinelibInit/EmulatorInit.

	* [loader/*.c]
	Removed all remaining #ifdef's WINELIB.

	* [controls/widgets.c] [windows/mdi.c]
	Converted MDIClientWndProc to 32-bit.

	* [debugger/break.c] [if1632/signal.c] [include/selectors.h]
	  [scheduler/thread.c]
	Code and data selector values are now computed at run-time.

	* [library/libres.c]
	Moved to loader/ directory.

	* [misc/main.c] [misc/version.c] (New file)
	Moved all version stuff to version.c. Cleaned up a bit.

	* [msdos/dpmi.c]
	Update the REALMODECALL structure on return from real-mode
	interrupt.

	* [windows/event.c] [windows/keyboard.c]
	Changed the way event coordinates are determined. Don't rely on
	the ConfigureNotify event values. This should fix all problems
	with cursor position in -desktop and -managed modes.

Sat Nov 15 16:09:36 1997  Slaven Rezic  <eserte@cs.tu-berlin.de>

	* [controls/button.c]
	(BUTTON_CheckAutoRadioButton): Prevent possible endless loop.

Wed Nov 12 03:42:45 1997  Chris Faherty <chrisf@america.com>

	* [misc/ver.c]
	Changed VerInstall32A to assume srcdir as destination if destdir
	is blank.  This was causing alot of DLL installation into SYSTEM
	directory to fail.

	* [loader/ne_image.c]
	NE_LoadSegment buffer[100] was too small and getting overruns.
	Changed it to buffer[200].

Sat Nov  8 06:09:57 1997  Len White <phreak@cgocable.net>

	* [misc/ddeml.c] [include/ddeml.h] [if1632/ddeml.spec]
	Added stub functions DdeConnectList(), DdeQueryNextServer(),
	DdeDisconnectList(), DdeSetUserHandle(), DdeAbandonTransaction(),
	DdePostAdvise(), DdeCreateDataHandle(), DdeAddData(), DdeGetData(),
	DdeAccessData(), DdeUnaccessData(), DdeEnableCallback(),
	DdeCmpStringHandles().

Fri Nov  7 19:44:26 1997  Olaf Flebbe  <o.flebbe@science-computing.de>

	* [files/directory.c]
	Fix typo in directory.c [broke loading of cdplayer on nt40]

	* [misc/main.c]
	Implemented -winver nt40.

	* [loader/resource.c] [user32.spec]
	Stubs for CopyAcceleratorTable, Destroy AcceleratorTable.

Thu Nov  6 22:37:04 1997  Morten Welinder  <welinder@rentec.com>

	* [files/drive.c]
	(GetDiskFreeSpace32A): Cap at 2GB.

	* [include/windows.h]
	Prototype DrawIconEx and CreateDIBSection32.
	Define OBM_RADIOCHECK.
	Add DI_* macros.

	* [objects/dib.c] [if1632/gdi.spec]
	CreateDIBSection is a WINAPI.  Renamed to CreateDIBSection32.
	Implement CreateDIBSection16.

	* [if1632/user.spec] [if1632/user32.spec]
	Add DrawIconEx.

	* [objects/cursoricon.c]
	(CopyIcon32): Fix bogus implementation.

	* [objects/bitmap.c]
	(CopyBitmap32): New function.
	(CopyImage32): Do bitmaps.

	* [graphics/x11drv/text.c]
	(X11DRV_ExtTextOut): Change ascent and descent default to avoid
	zero-thinkness overstrike line.

	* [include/debugstr.h] [misc/debugstr.c]
	New files.

	* [msdos/dpmi.c]
	Don't prototype do_mscdex. In INT_Int31Handler, handle real-mode
	int 0x21, ah=0x52.

	* [msdos/int2f.c]
	Add dummys for 0x1681 and 0x1682.

	* [misc/registry.c]
	Fix memory leaks in RegDeleteKey32W.

	* [objects/text.c]
	In TEXT_NextLine, fix another off-by-one bug.

	* [include/bitmaps/obm_radiocheck]
	New file.  (It a small circle used to radio-button menu items
	when selected.)
	
	* [objects/oembitmap.c]
	Add obm_radiocheck.

	* [include/windows.h] [if1632/user32.spec] [controls/menu.c]
	  [if1632/user.spec]
	Define CheckMenuRadioItem{16,32}.  Define GetMenuItemRect{16,32}.

Wed Nov  5 11:30:14 1997  Marcus Meissner <msmeissn@cip.informatik.uni-erlangen.de>
	* [misc/main.c]
	Auto adjust versions depending on binary.

Tue Nov  4 15:21:00 1997  Kristian Nielsen  <kristian.nielsen@risoe.dk>

	* [controls/listbox.c]
	Paint full background in listbox items with tab stops enabled.

	* [if1632/thunk.c]
	Copy some more message parameter structures (DRAWITEMSTRUCT16,
	COMPAREITEMSTRUCT16) to the stack segment to fix broken programs
	that need this.

	* [windows/dce.c]
	Only clip sibling windows when the parent has the WS_CLIPSIBLINGS
	style set.

	* [windows/focus.c]
	Make order of events in FOCUS_SwitchFocus() reflect API docs.

	* [windows/defdlg.c]
	Fix problem with loss of focus in some dialogs.

	* [win32/code_page.c]
	Fix return value for MultiByteToWideChar().

	* [BUGS]
	BCW now works.
1997-11-16 17:38:29 +00:00

515 lines
14 KiB
C

/*
* Program Manager
*
* Copyright 1996 Ulrich Schmid <uschmid@mail.hh.provi.de>
*/
#include <stdio.h>
#include "windows.h"
#include "license.h"
#include "progman.h"
#ifdef WINELIB
#include "resource.h"
#include "options.h"
#include "shell.h"
void LIBWINE_Register_accel();
void LIBWINE_Register_De();
void LIBWINE_Register_En();
void LIBWINE_Register_Fi();
void LIBWINE_Register_Fr();
void LIBWINE_Register_It();
void LIBWINE_Register_Ko();
void LIBWINE_Register_Hu();
#endif
GLOBALS Globals;
static VOID MAIN_CreateGroups(void);
static VOID MAIN_MenuCommand(HWND hWnd, WPARAM wParam, LPARAM lParam);
static ATOM MAIN_RegisterMainWinClass(void);
static VOID MAIN_CreateMainWindow(void);
static VOID MAIN_CreateMDIWindow(void);
static VOID MAIN_AutoStart(void);
#define BUFFER_SIZE 1000
/***********************************************************************
*
* WinMain
*/
int PASCAL WinMain (HANDLE hInstance, HANDLE prev, LPSTR cmdline, int show)
{
MSG msg;
#if defined(WINELIB) && !defined(HAVE_WINE_CONSTRUCTOR)
/* Register resources */
LIBWINE_Register_accel();
LIBWINE_Register_De();
LIBWINE_Register_En();
LIBWINE_Register_Fi();
LIBWINE_Register_Fr();
LIBWINE_Register_It();
LIBWINE_Register_Ko();
LIBWINE_Register_Hu();
#endif
#ifndef WINELIB
Globals.lpszIniFile = "progman.ini";
Globals.lpszIcoFile = "progman.ico";
#else /* Configuration in `wine.ini' */
{
CHAR buffer[MAX_PATHNAME_LEN], *p;
/* Redirect `progman.ini' */
PROFILE_GetWineIniString("progman", "progman.ini", "progman.ini",
buffer, sizeof(buffer));
Globals.lpszIniFile = p = LocalLock(LocalAlloc(LMEM_FIXED, lstrlen(buffer)));
hmemcpy(p, buffer, 1 + lstrlen(buffer));
/* Redirect `progman.ico' */
PROFILE_GetWineIniString("progman", "progman.ico", "progman.ico",
buffer, sizeof(buffer));
Globals.lpszIcoFile = p = LocalLock(LocalAlloc(LMEM_FIXED, lstrlen(buffer)));
hmemcpy(p, buffer, 1 + lstrlen(buffer));
}
#endif
/* Select Language */
#ifdef WINELIB
Globals.lpszLanguage = Languages[Options.language].name;
#else
Globals.lpszLanguage = "En";
#endif
Globals.hInstance = hInstance;
Globals.hGroups = 0;
Globals.hActiveGroup = 0;
/* Read Options from `progman.ini' */
Globals.bAutoArrange =
GetPrivateProfileInt("Settings", "AutoArrange", 0, Globals.lpszIniFile);
Globals.bMinOnRun =
GetPrivateProfileInt("Settings", "MinOnRun", 0, Globals.lpszIniFile);
Globals.bSaveSettings =
GetPrivateProfileInt("Settings", "SaveSettings", 0, Globals.lpszIniFile);
/* Load default icons */
Globals.hMainIcon = ExtractIcon(Globals.hInstance, Globals.lpszIcoFile, 0);
Globals.hGroupIcon = ExtractIcon(Globals.hInstance, Globals.lpszIcoFile, 0);
Globals.hDefaultIcon = ExtractIcon(Globals.hInstance, Globals.lpszIcoFile, 0);
if (!Globals.hMainIcon) Globals.hMainIcon = LoadIcon(0, MAKEINTRESOURCE(DEFAULTICON));
if (!Globals.hGroupIcon) Globals.hGroupIcon = LoadIcon(0, MAKEINTRESOURCE(DEFAULTICON));
if (!Globals.hDefaultIcon) Globals.hDefaultIcon = LoadIcon(0, MAKEINTRESOURCE(DEFAULTICON));
/* Register classes */
if (!prev)
{
if (!MAIN_RegisterMainWinClass()) return(FALSE);
if (!GROUP_RegisterGroupWinClass()) return(FALSE);
if (!PROGRAM_RegisterProgramWinClass()) return(FALSE);
}
/* Create main window */
MAIN_CreateMainWindow();
Globals.hAccel = LoadAccelerators(Globals.hInstance, STRING_ACCEL);
/* Setup menu, stringtable and resourcenames */
STRING_SelectLanguageByName(Globals.lpszLanguage);
MAIN_CreateMDIWindow();
/* Initialize groups */
MAIN_CreateGroups();
/* Start initial applications */
MAIN_AutoStart();
/* Message loop */
while (GetMessage (&msg, 0, 0, 0))
if (!TranslateAccelerator(Globals.hMainWnd, Globals.hAccel, &msg))
{
TranslateMessage (&msg);
DispatchMessage (&msg);
}
return 0;
}
/***********************************************************************
*
* MAIN_CreateGroups
*/
static VOID MAIN_CreateGroups()
{
CHAR buffer[BUFFER_SIZE];
CHAR szPath[MAX_PATHNAME_LEN];
CHAR key[20], *ptr;
/* Initialize groups according the `Order' entry of `progman.ini' */
GetPrivateProfileString("Settings", "Order", "", buffer, sizeof(buffer), Globals.lpszIniFile);
ptr = buffer;
while (ptr < buffer + sizeof(buffer))
{
int num, skip, ret;
ret = sscanf(ptr, "%d%n", &num, &skip);
if (ret == 0)
MAIN_MessageBoxIDS_s(IDS_FILE_READ_ERROR_s, Globals.lpszIniFile, IDS_ERROR, MB_OK);
if (ret != 1) break;
sprintf(key, "Group%d", num);
GetPrivateProfileString("Groups", key, "", szPath,
sizeof(szPath), Globals.lpszIniFile);
if (!szPath[0]) continue;
GRPFILE_ReadGroupFile(szPath);
ptr += skip;
}
/* FIXME initialize other groups, not enumerated by `Order' */
}
/***********************************************************************
*
* MAIN_AutoStart
*/
VOID MAIN_AutoStart()
{
CHAR buffer[BUFFER_SIZE];
HLOCAL hGroup, hProgram;
GetPrivateProfileString("Settings", "AutoStart", "Autostart", buffer,
sizeof(buffer), Globals.lpszIniFile);
for (hGroup = GROUP_FirstGroup(); hGroup; hGroup = GROUP_NextGroup(hGroup))
if (!lstrcmp(buffer, GROUP_GroupName(hGroup)))
for (hProgram = PROGRAM_FirstProgram(hGroup); hProgram;
hProgram = PROGRAM_NextProgram(hProgram))
PROGRAM_ExecuteProgram(hProgram);
}
/***********************************************************************
*
* MAIN_MainWndProc
*/
static LRESULT MAIN_MainWndProc (HWND hWnd, UINT msg,
WPARAM wParam, LPARAM lParam)
{
#if 0
printf("M %4.4x %4.4x\n", msg, wParam);
#endif
switch (msg)
{
case WM_INITMENU:
CheckMenuItem(Globals.hOptionMenu, PM_AUTO_ARRANGE,
MF_BYCOMMAND | (Globals.bAutoArrange ? MF_CHECKED : MF_UNCHECKED));
CheckMenuItem(Globals.hOptionMenu, PM_MIN_ON_RUN,
MF_BYCOMMAND | (Globals.bMinOnRun ? MF_CHECKED : MF_UNCHECKED));
CheckMenuItem(Globals.hOptionMenu, PM_SAVE_SETTINGS,
MF_BYCOMMAND | (Globals.bSaveSettings ? MF_CHECKED : MF_UNCHECKED));
break;
case WM_COMMAND:
if (wParam < PM_FIRST_CHILD)
MAIN_MenuCommand(hWnd, wParam, lParam);
break;
case WM_DESTROY:
PostQuitMessage (0);
break;
}
return(DefFrameProc(hWnd, Globals.hMDIWnd, msg, wParam, lParam));
}
/***********************************************************************
*
* MAIN_MenuCommand
*/
static VOID MAIN_MenuCommand(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
HLOCAL hActiveGroup = GROUP_ActiveGroup();
HLOCAL hActiveProgram = PROGRAM_ActiveProgram(hActiveGroup);
HWND hActiveGroupWnd = GROUP_GroupWnd(hActiveGroup);
switch(wParam)
{
/* Menu File */
case PM_NEW:
switch (DIALOG_New((hActiveGroupWnd && !IsIconic(hActiveGroupWnd)) ?
PM_NEW_PROGRAM : PM_NEW_GROUP))
{
case PM_NEW_PROGRAM:
if (hActiveGroup) PROGRAM_NewProgram(hActiveGroup);
break;
case PM_NEW_GROUP:
GROUP_NewGroup();
break;
}
break;
case PM_OPEN:
if (hActiveProgram)
PROGRAM_ExecuteProgram(hActiveProgram);
else if (hActiveGroupWnd)
OpenIcon(hActiveGroupWnd);
break;
case PM_MOVE:
case PM_COPY:
if (hActiveProgram)
PROGRAM_CopyMoveProgram(hActiveProgram, wParam == PM_MOVE);
break;
case PM_DELETE:
if (hActiveProgram)
{
if (DIALOG_Delete(IDS_DELETE_PROGRAM_s, PROGRAM_ProgramName(hActiveProgram)))
PROGRAM_DeleteProgram(hActiveProgram, TRUE);
}
else if (hActiveGroup)
{
if (DIALOG_Delete(IDS_DELETE_GROUP_s, GROUP_GroupName(hActiveGroup)))
GROUP_DeleteGroup(hActiveGroup);
}
break;
case PM_ATTRIBUTES:
if (hActiveProgram)
PROGRAM_ModifyProgram(hActiveProgram);
else if (hActiveGroup)
GROUP_ModifyGroup(hActiveGroup);
break;
case PM_EXECUTE:
DIALOG_Execute();
break;
case PM_EXIT:
PostQuitMessage(0);
break;
/* Menu Options */
case PM_AUTO_ARRANGE:
Globals.bAutoArrange = !Globals.bAutoArrange;
CheckMenuItem(Globals.hOptionMenu, PM_AUTO_ARRANGE,
MF_BYCOMMAND | (Globals.bAutoArrange ?
MF_CHECKED : MF_UNCHECKED));
WritePrivateProfileString("Settings", "AutoArrange",
Globals.bAutoArrange ? "1" : "0",
Globals.lpszIniFile);
WriteOutProfiles();
break;
case PM_MIN_ON_RUN:
Globals.bMinOnRun = !Globals.bMinOnRun;
CheckMenuItem(Globals.hOptionMenu, PM_MIN_ON_RUN,
MF_BYCOMMAND | (Globals.bMinOnRun ?
MF_CHECKED : MF_UNCHECKED));
WritePrivateProfileString("Settings", "MinOnRun",
Globals.bMinOnRun ? "1" : "0",
Globals.lpszIniFile);
WriteOutProfiles();
break;
case PM_SAVE_SETTINGS:
Globals.bSaveSettings = !Globals.bSaveSettings;
CheckMenuItem(Globals.hOptionMenu, PM_SAVE_SETTINGS,
MF_BYCOMMAND | (Globals.bSaveSettings ?
MF_CHECKED : MF_UNCHECKED));
WritePrivateProfileString("Settings", "SaveSettings",
Globals.bSaveSettings ? "1" : "0",
Globals.lpszIniFile);
WriteOutProfiles();
break;
/* Menu Windows */
case PM_ARRANGE:
if (hActiveGroupWnd && !IsIconic(hActiveGroupWnd))
ArrangeIconicWindows(hActiveGroupWnd);
else
SendMessage(Globals.hMDIWnd, WM_MDIICONARRANGE, 0, 0);
break;
/* Menu Help */
case PM_CONTENTS:
if (!WinHelp(Globals.hMainWnd, "progman.hlp", HELP_INDEX, 0))
MAIN_MessageBoxIDS(IDS_WINHELP_ERROR, IDS_ERROR, MB_OK);
break;
case PM_HELPONHELP:
if (!WinHelp(Globals.hMainWnd, "progman.hlp", HELP_HELPONHELP, 0))
MAIN_MessageBoxIDS(IDS_WINHELP_ERROR, IDS_ERROR, MB_OK);
break;
case PM_TUTORIAL:
WinExec("wintutor.exe", SW_SHOWNORMAL);
break;
case PM_LICENSE:
WineLicense(Globals.hMainWnd, Globals.lpszLanguage);
break;
case PM_NO_WARRANTY:
WineWarranty(Globals.hMainWnd, Globals.lpszLanguage);
break;
case PM_ABOUT_WINE:
ShellAbout(hWnd, "WINE", "Program Manager", 0);
break;
default:
if (wParam >= PM_FIRST_LANGUAGE && wParam <= PM_LAST_LANGUAGE)
STRING_SelectLanguageByNumber(wParam - PM_FIRST_LANGUAGE);
else
MAIN_MessageBoxIDS(IDS_NOT_IMPLEMENTED, IDS_ERROR, MB_OK);
break;
}
}
/***********************************************************************
*
* MAIN_RegisterMainWinClass
*/
static ATOM MAIN_RegisterMainWinClass()
{
WNDCLASS class;
class.style = CS_HREDRAW | CS_VREDRAW;
class.lpfnWndProc = MAIN_MainWndProc;
class.cbClsExtra = 0;
class.cbWndExtra = 0;
class.hInstance = Globals.hInstance;
class.hIcon = Globals.hMainIcon;
class.hCursor = LoadCursor (0, IDC_ARROW);
class.hbrBackground = GetStockObject (NULL_BRUSH);
class.lpszMenuName = 0;
class.lpszClassName = STRING_MAIN_WIN_CLASS_NAME;
return RegisterClass(&class);
}
/***********************************************************************
*
* MAIN_CreateMainWindow
*/
static VOID MAIN_CreateMainWindow()
{
INT left , top, right, bottom, width, height, show;
CHAR buffer[100];
Globals.hMDIWnd = 0;
Globals.hMainMenu = 0;
/* Get the geometry of the main window */
GetPrivateProfileString("Settings", "Window", "",
buffer, sizeof(buffer), Globals.lpszIniFile);
if (5 == sscanf(buffer, "%d %d %d %d %d", &left, &top, &right, &bottom, &show))
{
width = right - left;
height = bottom - top;
}
else
{
left = top = width = height = CW_USEDEFAULT;
show = SW_SHOWNORMAL;
}
/* Create main Window */
Globals.hMainWnd =
CreateWindow (STRING_MAIN_WIN_CLASS_NAME, "",
WS_OVERLAPPEDWINDOW, left, top, width, height,
0, 0, Globals.hInstance, 0);
ShowWindow (Globals.hMainWnd, show);
UpdateWindow (Globals.hMainWnd);
}
/***********************************************************************
*
* MAIN_CreateMDIWindow
*/
static VOID MAIN_CreateMDIWindow()
{
CLIENTCREATESTRUCT ccs;
RECT rect;
/* Get the geometry of the MDI window */
GetClientRect(Globals.hMainWnd, &rect);
ccs.hWindowMenu = Globals.hWindowsMenu;
ccs.idFirstChild = PM_FIRST_CHILD;
/* Create MDI Window */
Globals.hMDIWnd =
CreateWindow (STRING_MDI_WIN_CLASS_NAME, "",
WS_CHILD, rect.left, rect.top,
rect.right - rect.left, rect.bottom - rect.top,
Globals.hMainWnd, 0,
Globals.hInstance, &ccs);
ShowWindow (Globals.hMDIWnd, SW_SHOW);
UpdateWindow (Globals.hMDIWnd);
}
/**********************************************************************/
/***********************************************************************
*
* MAIN_MessageBoxIDS
*/
INT MAIN_MessageBoxIDS(UINT ids_text, UINT ids_title, WORD type)
{
CHAR text[MAX_STRING_LEN];
CHAR title[MAX_STRING_LEN];
LoadString(Globals.hInstance, ids_text, text, sizeof(text));
LoadString(Globals.hInstance, ids_title, title, sizeof(title));
return(MessageBox(Globals.hMainWnd, text, title, type));
}
/***********************************************************************
*
* MAIN_MessageBoxIDS_s
*/
INT MAIN_MessageBoxIDS_s(UINT ids_text, LPCSTR str, UINT ids_title, WORD type)
{
CHAR text[MAX_STRING_LEN];
CHAR title[MAX_STRING_LEN];
CHAR newtext[MAX_STRING_LEN + MAX_PATHNAME_LEN];
LoadString(Globals.hInstance, ids_text, text, sizeof(text));
LoadString(Globals.hInstance, ids_title, title, sizeof(title));
wsprintf(newtext, text, str);
return(MessageBox(Globals.hMainWnd, newtext, title, type));
}
/***********************************************************************
*
* MAIN_ReplaceString
*/
VOID MAIN_ReplaceString(HLOCAL *handle, LPSTR replace)
{
HLOCAL newhandle = LocalAlloc(LMEM_FIXED, strlen(replace) + 1);
if (newhandle)
{
LPSTR newstring = LocalLock(newhandle);
lstrcpy(newstring, replace);
LocalFree(*handle);
*handle = newhandle;
}
else MAIN_MessageBoxIDS(IDS_OUT_OF_MEMORY, IDS_ERROR, MB_OK);
}
/* Local Variables: */
/* c-file-style: "GNU" */
/* End: */