| /* | |
| * WineCfg main entry point | |
| * | |
| * Copyright 2002 Jaco Greeff | |
| * Copyright 2003 Dimitrie O. Paun | |
| * Copyright 2003 Mike Hearn | |
| * | |
| * This library is free software; you can redistribute it and/or | |
| * modify it under the terms of the GNU Lesser General Public | |
| * License as published by the Free Software Foundation; either | |
| * version 2.1 of the License, or (at your option) any later version. | |
| * | |
| * This library is distributed in the hope that it will be useful, | |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
| * Lesser General Public License for more details. | |
| * | |
| * You should have received a copy of the GNU Lesser General Public | |
| * License along with this library; if not, write to the Free Software | |
| * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA | |
| * | |
| */ | |
| #define WIN32_LEAN_AND_MEAN | |
| #define NONAMELESSUNION | |
| #define NONAMELESSSTRUCT | |
| #include <windows.h> | |
| #include <commctrl.h> | |
| #include <objbase.h> | |
| #include <wine/debug.h> | |
| #include "resource.h" | |
| #include "winecfg.h" | |
| WINE_DEFAULT_DEBUG_CHANNEL(winecfg); | |
| static INT CALLBACK | |
| PropSheetCallback (HWND hWnd, UINT uMsg, LPARAM lParam) | |
| { | |
| switch (uMsg) | |
| { | |
| /* | |
| * hWnd = NULL, lParam == dialog resource | |
| */ | |
| case PSCB_PRECREATE: | |
| break; | |
| case PSCB_INITIALIZED: | |
| break; | |
| default: | |
| break; | |
| } | |
| return 0; | |
| } | |
| static INT_PTR CALLBACK | |
| AboutDlgProc (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) | |
| { | |
| char *owner, *org; | |
| switch (uMsg) { | |
| case WM_NOTIFY: | |
| switch(((LPNMHDR)lParam)->code) | |
| { | |
| case PSN_APPLY: | |
| /*save registration info to registry */ | |
| owner = get_text(hDlg, IDC_ABT_OWNER); | |
| org = get_text(hDlg, IDC_ABT_ORG); | |
| set_reg_key(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows\\CurrentVersion", | |
| "RegisteredOwner", owner ? owner : ""); | |
| set_reg_key(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows\\CurrentVersion", | |
| "RegisteredOrganization", org ? org : ""); | |
| set_reg_key(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows NT\\CurrentVersion", | |
| "RegisteredOwner", owner ? owner : ""); | |
| set_reg_key(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows NT\\CurrentVersion", | |
| "RegisteredOrganization", org ? org : ""); | |
| apply(); | |
| HeapFree(GetProcessHeap(), 0, owner); | |
| HeapFree(GetProcessHeap(), 0, org); | |
| break; | |
| } | |
| break; | |
| case WM_INITDIALOG: | |
| /* read owner and organization info from registry, load it into text box */ | |
| owner = get_reg_key(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows NT\\CurrentVersion", | |
| "RegisteredOwner", ""); | |
| org = get_reg_key(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows NT\\CurrentVersion", | |
| "RegisteredOrganization", ""); | |
| SetDlgItemText(hDlg, IDC_ABT_OWNER, owner); | |
| SetDlgItemText(hDlg, IDC_ABT_ORG, org); | |
| SendMessage(GetParent(hDlg), PSM_UNCHANGED, 0, 0); | |
| HeapFree(GetProcessHeap(), 0, owner); | |
| HeapFree(GetProcessHeap(), 0, org); | |
| break; | |
| case WM_COMMAND: | |
| switch(HIWORD(wParam)) | |
| { | |
| case EN_CHANGE: | |
| /* enable apply button */ | |
| SendMessage(GetParent(hDlg), PSM_CHANGED, 0, 0); | |
| break; | |
| } | |
| break; | |
| } | |
| return FALSE; | |
| } | |
| #define NUM_PROPERTY_PAGES 7 | |
| static INT_PTR | |
| doPropertySheet (HINSTANCE hInstance, HWND hOwner) | |
| { | |
| PROPSHEETPAGEW psp[NUM_PROPERTY_PAGES]; | |
| PROPSHEETHEADERW psh; | |
| int pg = 0; /* start with page 0 */ | |
| /* | |
| * Fill out the (Applications) PROPSHEETPAGE data structure | |
| * for the property sheet | |
| */ | |
| psp[pg].dwSize = sizeof (PROPSHEETPAGEW); | |
| psp[pg].dwFlags = PSP_USETITLE; | |
| psp[pg].hInstance = hInstance; | |
| psp[pg].u.pszTemplate = MAKEINTRESOURCEW (IDD_APPCFG); | |
| psp[pg].u2.pszIcon = NULL; | |
| psp[pg].pfnDlgProc = AppDlgProc; | |
| psp[pg].pszTitle = load_string (IDS_TAB_APPLICATIONS); | |
| psp[pg].lParam = 0; | |
| pg++; | |
| /* | |
| * Fill out the (Libraries) PROPSHEETPAGE data structure | |
| * for the property sheet | |
| */ | |
| psp[pg].dwSize = sizeof (PROPSHEETPAGEW); | |
| psp[pg].dwFlags = PSP_USETITLE; | |
| psp[pg].hInstance = hInstance; | |
| psp[pg].u.pszTemplate = MAKEINTRESOURCEW (IDD_DLLCFG); | |
| psp[pg].u2.pszIcon = NULL; | |
| psp[pg].pfnDlgProc = LibrariesDlgProc; | |
| psp[pg].pszTitle = load_string (IDS_TAB_DLLS); | |
| psp[pg].lParam = 0; | |
| pg++; | |
| /* | |
| * Fill out the (X11Drv) PROPSHEETPAGE data structure | |
| * for the property sheet | |
| */ | |
| psp[pg].dwSize = sizeof (PROPSHEETPAGEW); | |
| psp[pg].dwFlags = PSP_USETITLE; | |
| psp[pg].hInstance = hInstance; | |
| psp[pg].u.pszTemplate = MAKEINTRESOURCEW (IDD_GRAPHCFG); | |
| psp[pg].u2.pszIcon = NULL; | |
| psp[pg].pfnDlgProc = GraphDlgProc; | |
| psp[pg].pszTitle = load_string (IDS_TAB_GRAPHICS); | |
| psp[pg].lParam = 0; | |
| pg++; | |
| psp[pg].dwSize = sizeof (PROPSHEETPAGEW); | |
| psp[pg].dwFlags = PSP_USETITLE; | |
| psp[pg].hInstance = hInstance; | |
| psp[pg].u.pszTemplate = MAKEINTRESOURCEW (IDD_DESKTOP_INTEGRATION); | |
| psp[pg].u2.pszIcon = NULL; | |
| psp[pg].pfnDlgProc = ThemeDlgProc; | |
| psp[pg].pszTitle = load_string (IDS_TAB_DESKTOP_INTEGRATION); | |
| psp[pg].lParam = 0; | |
| pg++; | |
| psp[pg].dwSize = sizeof (PROPSHEETPAGEW); | |
| psp[pg].dwFlags = PSP_USETITLE; | |
| psp[pg].hInstance = hInstance; | |
| psp[pg].u.pszTemplate = MAKEINTRESOURCEW (IDD_DRIVECFG); | |
| psp[pg].u2.pszIcon = NULL; | |
| psp[pg].pfnDlgProc = DriveDlgProc; | |
| psp[pg].pszTitle = load_string (IDS_TAB_DRIVES); | |
| psp[pg].lParam = 0; | |
| pg++; | |
| psp[pg].dwSize = sizeof (PROPSHEETPAGEW); | |
| psp[pg].dwFlags = PSP_USETITLE; | |
| psp[pg].hInstance = hInstance; | |
| psp[pg].u.pszTemplate = MAKEINTRESOURCEW (IDD_AUDIOCFG); | |
| psp[pg].u2.pszIcon = NULL; | |
| psp[pg].pfnDlgProc = AudioDlgProc; | |
| psp[pg].pszTitle = load_string (IDS_TAB_AUDIO); | |
| psp[pg].lParam = 0; | |
| pg++; | |
| /* | |
| * Fill out the (General) PROPSHEETPAGE data structure | |
| * for the property sheet | |
| */ | |
| psp[pg].dwSize = sizeof (PROPSHEETPAGEW); | |
| psp[pg].dwFlags = PSP_USETITLE; | |
| psp[pg].hInstance = hInstance; | |
| psp[pg].u.pszTemplate = MAKEINTRESOURCEW (IDD_ABOUTCFG); | |
| psp[pg].u2.pszIcon = NULL; | |
| psp[pg].pfnDlgProc = AboutDlgProc; | |
| psp[pg].pszTitle = load_string (IDS_TAB_ABOUT); | |
| psp[pg].lParam = 0; | |
| pg++; | |
| /* | |
| * Fill out the PROPSHEETHEADER | |
| */ | |
| psh.dwSize = sizeof (PROPSHEETHEADERW); | |
| psh.dwFlags = PSH_PROPSHEETPAGE | PSH_USEICONID | PSH_USECALLBACK; | |
| psh.hwndParent = hOwner; | |
| psh.hInstance = hInstance; | |
| psh.u.pszIcon = NULL; | |
| psh.pszCaption = load_string (IDS_WINECFG_TITLE); | |
| psh.nPages = NUM_PROPERTY_PAGES; | |
| psh.u3.ppsp = psp; | |
| psh.pfnCallback = PropSheetCallback; | |
| psh.u2.nStartPage = 0; | |
| /* | |
| * Display the modal property sheet | |
| */ | |
| return PropertySheetW (&psh); | |
| } | |
| /****************************************************************************** | |
| * Name : ProcessCmdLine | |
| * Description: Checks command line parameters for 'autodetect drives' option | |
| * Parameters : lpCmdLine - the command line | |
| * Returns : TRUE - if '/D' was found. Drive autodetection was carried out. | |
| * FALSE - no '/D' option found in command line | |
| * Notes : This is a very simple implementation, which only works | |
| * correctly if the one and only cmd line option is '/D' or | |
| * no option at all. Has to be reworked, if more options are to | |
| * be supported. | |
| */ | |
| static BOOL | |
| ProcessCmdLine(LPSTR lpCmdLine) | |
| { | |
| if ((lpCmdLine[0] == '/' || lpCmdLine[0] == '-') && | |
| (lpCmdLine[1] == 'D' || lpCmdLine[1] == 'd')) | |
| { | |
| gui_mode = FALSE; | |
| if (autodetect_drives()) { | |
| apply_drive_changes(); | |
| } | |
| return TRUE; | |
| } | |
| return FALSE; | |
| } | |
| /***************************************************************************** | |
| * Name : WinMain | |
| * Description: Main windows entry point | |
| * Parameters : hInstance | |
| * hPrev | |
| * szCmdLine | |
| * nShow | |
| * Returns : Program exit code | |
| */ | |
| int WINAPI | |
| WinMain (HINSTANCE hInstance, HINSTANCE hPrev, LPSTR szCmdLine, int nShow) | |
| { | |
| if (ProcessCmdLine(szCmdLine)) { | |
| return 0; | |
| } | |
| if (initialize(hInstance) != 0) { | |
| WINE_ERR("initialization failed, aborting\n"); | |
| ExitProcess(1); | |
| } | |
| /* | |
| * The next 9 lines should be all that is needed | |
| * for the Wine Configuration property sheet | |
| */ | |
| InitCommonControls (); | |
| CoInitializeEx(NULL, COINIT_APARTMENTTHREADED); | |
| if (doPropertySheet (hInstance, NULL) > 0) { | |
| WINE_TRACE("OK\n"); | |
| } else { | |
| WINE_TRACE("Cancel\n"); | |
| } | |
| CoUninitialize(); | |
| ExitProcess (0); | |
| return 0; | |
| } |