From: Dmitry Kozliuk Subject: winecfg: Move application selection to listbox outside any tab. Message-Id: <548D84AF.1040102@gmail.com> Date: Sun, 14 Dec 2014 15:38:07 +0300 Implementation of #12441 enhancement. Changed winecfg UI so that applications are listed on the left while tabbed settings reside on the right. To reduce confusion, window title is set to "Wine Configuration for " only for the tabs used to manage application-specific settings. Please see https://bugs.winehq.org/show_bug.cgi?id=12441#c13 for extended user & developer notes to this patch. Tested on openSuSE 13.2 (x86_64). --- programs/winecfg/about.c | 8 ++ programs/winecfg/appdefaults.c | 80 ++++++++++++----- programs/winecfg/audio.c | 7 +- programs/winecfg/driveui.c | 7 +- programs/winecfg/libraries.c | 10 ++- programs/winecfg/main.c | 189 ++++++++++++++++++++++++++++++++++------- programs/winecfg/resource.h | 6 ++ programs/winecfg/theme.c | 7 +- programs/winecfg/winecfg.c | 26 ------ programs/winecfg/winecfg.h | 15 +++- programs/winecfg/winecfg.rc | 34 +++++--- programs/winecfg/x11drvdlg.c | 10 ++- 12 files changed, 302 insertions(+), 97 deletions(-) diff --git a/programs/winecfg/about.c b/programs/winecfg/about.c index 09cc015..0447981 100644 --- a/programs/winecfg/about.c +++ b/programs/winecfg/about.c @@ -74,6 +74,10 @@ AboutDlgProc (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) if(wParam == IDC_ABT_WEB_LINK) ShellExecuteA(NULL, "open", PACKAGE_URL, NULL, NULL, SW_SHOW); break; + + case PSN_SETACTIVE: + current_page = hDlg; + break; } break; @@ -174,6 +178,10 @@ AboutDlgProc (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) return (INT_PTR)CreateSolidBrush(GetSysColor(COLOR_WINDOW)); } break; + + case WM_APPLICATIONCHANGED: + set_window_title(NULL); + break; } return FALSE; diff --git a/programs/winecfg/appdefaults.c b/programs/winecfg/appdefaults.c index 7dd3900..bdb21c5 100644 --- a/programs/winecfg/appdefaults.c +++ b/programs/winecfg/appdefaults.c @@ -35,6 +35,9 @@ WINE_DEFAULT_DEBUG_CHANNEL(winecfg); +static HWND compatibility_dialog; +static HWND application_list_dialog; + static const struct { const char *szVersion; @@ -203,7 +206,7 @@ static void add_listview_item(HWND listview, WCHAR *text, void *association) } /* Called when the application is initialized (cannot reinit!) */ -static void init_appsheet(HWND dialog) +static void init_applist(HWND dialog) { HWND listview; LVITEMW item; @@ -238,8 +241,6 @@ static void init_appsheet(HWND dialog) RegCloseKey(key); } - init_comboboxes(dialog); - /* Select the default settings listview item */ item.iItem = 0; item.iSubItem = 0; @@ -297,14 +298,10 @@ static void on_selection_change(HWND dialog, HWND listview) disable(IDC_APP_REMOVEAPP); } - /* reset the combo boxes if we changed from/to global/app-specific */ - - if ((oldapp && !current_app) || (!oldapp && current_app)) - init_comboboxes(dialog); - - update_comboboxes(dialog); - - set_window_title(dialog); + if (current_page) + { + SendMessageW(current_page, WM_APPLICATIONCHANGED, (WPARAM)0, (LPARAM)oldapp); + } } static BOOL list_contains_file(HWND listview, WCHAR *filename) @@ -397,7 +394,7 @@ static void on_remove_app_click(HWND dialog) SendMessageW(listview, LVM_SETITEMSTATE, -1, (LPARAM)&item); SetFocus(listview); - SendMessageW(GetParent(dialog), PSM_CHANGED, (WPARAM) dialog, 0); + SendMessageW(GetParent(compatibility_dialog), PSM_CHANGED, (WPARAM)compatibility_dialog, 0); } static void on_winver_change(HWND dialog) @@ -490,25 +487,38 @@ AppDlgProc (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) switch (uMsg) { case WM_INITDIALOG: - init_appsheet(hDlg); + compatibility_dialog = hDlg; + init_comboboxes(hDlg); + /* force sheet controls update if application list was created first */ + if (application_list_dialog) + { + on_selection_change(hDlg, GetDlgItem(hDlg, IDC_APP_LISTVIEW)); + } break; case WM_SHOWWINDOW: - set_window_title(hDlg); + current_page = hDlg; + break; + + case WM_APPLICATIONCHANGED: + set_window_title(current_app); + /* reset the combo boxes if we changed from/to global/app-specific (lParam = old app name) */ + if ((lParam && !current_app) || (!lParam && current_app)) + init_comboboxes(hDlg); + update_comboboxes(hDlg); break; case WM_NOTIFY: switch (((LPNMHDR)lParam)->code) { - case LVN_ITEMCHANGED: - on_selection_change(hDlg, GetDlgItem(hDlg, IDC_APP_LISTVIEW)); - break; case PSN_APPLY: apply(); SetWindowLongPtrW(hDlg, DWLP_MSGRESULT, PSNRET_NOERROR); break; + case PSN_SETACTIVE: + current_page = hDlg; + break; } - break; case WM_COMMAND: @@ -521,6 +531,39 @@ AppDlgProc (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) on_winver_change(hDlg); break; } + } + break; + } + + return 0; +} + +INT_PTR CALLBACK +AppListDlgProc (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + switch (uMsg) + { + case WM_INITDIALOG: + application_list_dialog = hDlg; + init_applist(hDlg); + break; + + case WM_SHOWWINDOW: + set_window_title(current_app); + break; + + case WM_NOTIFY: + switch (((LPNMHDR)lParam)->code) + { + case LVN_ITEMCHANGED: + on_selection_change(hDlg, GetDlgItem(hDlg, IDC_APP_LISTVIEW)); + break; + } + break; + + case WM_COMMAND: + switch(HIWORD(wParam)) + { case BN_CLICKED: switch(LOWORD(wParam)) { @@ -533,7 +576,6 @@ AppDlgProc (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) } break; } - break; } diff --git a/programs/winecfg/audio.c b/programs/winecfg/audio.c index 4e3158c..3d19c0b 100644 --- a/programs/winecfg/audio.c +++ b/programs/winecfg/audio.c @@ -354,7 +354,7 @@ AudioDlgProc (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) break; case WM_SHOWWINDOW: - set_window_title(hDlg); + set_window_title(NULL); break; case WM_NOTIFY: @@ -367,12 +367,17 @@ AudioDlgProc (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) SetWindowLongPtrW(hDlg, DWLP_MSGRESULT, PSNRET_NOERROR); break; case PSN_SETACTIVE: + current_page = hDlg; break; } break; case WM_INITDIALOG: initAudioDlg(hDlg); break; + + case WM_APPLICATIONCHANGED: + set_window_title(NULL); + break; } return FALSE; diff --git a/programs/winecfg/driveui.c b/programs/winecfg/driveui.c index 98e057b..cf1db0e 100644 --- a/programs/winecfg/driveui.c +++ b/programs/winecfg/driveui.c @@ -694,7 +694,7 @@ DriveDlgProc (HWND dialog, UINT msg, WPARAM wParam, LPARAM lParam) break; case WM_SHOWWINDOW: - set_window_title(dialog); + set_window_title(NULL); break; case WM_COMMAND: @@ -793,6 +793,7 @@ DriveDlgProc (HWND dialog, UINT msg, WPARAM wParam, LPARAM lParam) SetWindowLongPtrW(dialog, DWLP_MSGRESULT, PSNRET_NOERROR); break; case PSN_SETACTIVE: + current_page = dialog; break; case LVN_ITEMCHANGED: { @@ -804,6 +805,10 @@ DriveDlgProc (HWND dialog, UINT msg, WPARAM wParam, LPARAM lParam) } } break; + + case WM_APPLICATIONCHANGED: + set_window_title(NULL); + break; } return FALSE; diff --git a/programs/winecfg/libraries.c b/programs/winecfg/libraries.c index 660737b..c3f09af 100644 --- a/programs/winecfg/libraries.c +++ b/programs/winecfg/libraries.c @@ -534,6 +534,7 @@ static INT_PTR CALLBACK loadorder_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM wParam EndDialog(hwndDlg, wParam); return TRUE; } + break; } return FALSE; } @@ -594,11 +595,16 @@ LibrariesDlgProc (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) init_libsheet(hDlg); break; case WM_SHOWWINDOW: - set_window_title(hDlg); + set_window_title(current_app); break; - case WM_NOTIFY: + case WM_APPLICATIONCHANGED: + load_library_settings(hDlg); + set_window_title(current_app); + break; + case WM_NOTIFY: switch (((LPNMHDR)lParam)->code) { case PSN_SETACTIVE: + current_page = hDlg; load_library_settings(hDlg); break; } diff --git a/programs/winecfg/main.c b/programs/winecfg/main.c index 6ac5f89..28c9c12 100644 --- a/programs/winecfg/main.c +++ b/programs/winecfg/main.c @@ -36,26 +36,30 @@ WINE_DEFAULT_DEBUG_CHANNEL(winecfg); +HWND current_page; + +static HWND s_main_window; + static INT CALLBACK PropSheetCallback (HWND hWnd, UINT uMsg, LPARAM lParam) { switch (uMsg) { - /* - * hWnd = NULL, lParam == dialog resource - */ - case PSCB_PRECREATE: - break; - - case PSCB_INITIALIZED: - /* Set the window icon */ - SendMessageW( hWnd, WM_SETICON, ICON_BIG, - (LPARAM)LoadIconW( (HINSTANCE)GetWindowLongPtrW(hWnd, GWLP_HINSTANCE), - MAKEINTRESOURCEW(IDI_WINECFG) )); - break; - - default: - break; + /* + * hWnd = NULL, lParam == dialog resource + */ + case PSCB_PRECREATE: + break; + + case PSCB_INITIALIZED: + /* Set the window icon */ + SendMessageW( hWnd, WM_SETICON, ICON_BIG, + (LPARAM)LoadIconW( (HINSTANCE)GetWindowLongPtrW(hWnd, GWLP_HINSTANCE), + MAKEINTRESOURCEW(IDI_WINECFG) )); + break; + + default: + break; } return 0; } @@ -63,7 +67,7 @@ PropSheetCallback (HWND hWnd, UINT uMsg, LPARAM lParam) #define NUM_PROPERTY_PAGES 7 static INT_PTR -doPropertySheet (HINSTANCE hInstance, HWND hOwner) +create_property_sheet (HINSTANCE hInstance, HWND hOwner) { PROPSHEETPAGEW psp[NUM_PROPERTY_PAGES]; PROPSHEETHEADERW psh; @@ -96,7 +100,7 @@ doPropertySheet (HINSTANCE hInstance, HWND hOwner) psp[pg].pszTitle = load_string (IDS_TAB_DLLS); psp[pg].lParam = 0; pg++; - + /* * Fill out the (X11Drv) PROPSHEETPAGE data structure * for the property sheet @@ -159,7 +163,7 @@ doPropertySheet (HINSTANCE hInstance, HWND hOwner) * Fill out the PROPSHEETHEADER */ psh.dwSize = sizeof (PROPSHEETHEADERW); - psh.dwFlags = PSH_PROPSHEETPAGE | PSH_USEICONID | PSH_USECALLBACK; + psh.dwFlags = PSH_MODELESS | PSH_PROPSHEETPAGE | PSH_USEICONID | PSH_USECALLBACK; psh.hwndParent = hOwner; psh.hInstance = hInstance; psh.u.pszIcon = MAKEINTRESOURCEW (IDI_WINECFG); @@ -190,7 +194,7 @@ static BOOL ProcessCmdLine(LPSTR lpCmdLine) { if ((lpCmdLine[0] == '/' || lpCmdLine[0] == '-') && - (lpCmdLine[1] == 'D' || lpCmdLine[1] == 'd')) + (lpCmdLine[1] == 'D' || lpCmdLine[1] == 'd')) { gui_mode = FALSE; if (autodetect_drives()) { @@ -202,6 +206,135 @@ ProcessCmdLine(LPSTR lpCmdLine) return FALSE; } +static BOOL +perform_control_layout(HWND dialog, HWND application_list_dialog, HWND property_sheet) +{ + RECT settings_client_area, dialog_client_area, application_list_area; + + GetClientRect(dialog, &dialog_client_area); + GetClientRect(property_sheet, &settings_client_area); + GetClientRect(application_list_dialog, &application_list_area); + + SetParent(property_sheet, dialog); + SetWindowLongW(property_sheet, GWL_STYLE, WS_CHILD | WS_VISIBLE); + SetWindowLongW(property_sheet, GWL_EXSTYLE, 0); + SetWindowPos( + property_sheet, + NULL, + dialog_client_area.right - settings_client_area.right, + dialog_client_area.top, + settings_client_area.right, + settings_client_area.bottom, + SWP_NOZORDER); + + SetParent(application_list_dialog, dialog); + SetWindowPos( + application_list_dialog, + NULL, + 0, + 0, + application_list_area.right, + application_list_area.bottom, + SWP_NOZORDER); + + return TRUE; +} + +void set_window_title(LPCWSTR application) +{ + WCHAR newtitle[256]; + + /* update the window title */ + if (application) + { + WCHAR apptitle[256]; + LoadStringW (GetModuleHandleW(NULL), IDS_WINECFG_TITLE_APP, apptitle, + sizeof(apptitle)/sizeof(apptitle[0])); + wsprintfW (newtitle, apptitle, application); + } + else + { + LoadStringW (GetModuleHandleW(NULL), IDS_WINECFG_TITLE, newtitle, + sizeof(newtitle)/sizeof(newtitle[0])); + } + + WINE_TRACE("setting title to %s\n", wine_dbgstr_w (newtitle)); + SetWindowTextW(s_main_window, newtitle); +} + +static BOOL +on_init_main_window(HWND dialog) +{ + HWND property_sheet; + HWND application_list_dialog; + + s_main_window = dialog; + current_page = NULL; + if ((property_sheet = (HWND)create_property_sheet(GetModuleHandleW(NULL), dialog))) + { + application_list_dialog = CreateDialogW( + GetModuleHandleW(NULL), + (LPCWSTR)MAKEINTRESOURCE(IDD_APPLIST), + dialog, + AppListDlgProc); + if (!application_list_dialog) + { + WINE_ERR("failed to create application list frame, error = %d\n", GetLastError()); + return FALSE; + } + SetWindowTextW(dialog, load_string(IDS_WINECFG_TITLE)); + return perform_control_layout(dialog, application_list_dialog, property_sheet); + } + else + { + WINE_ERR("failed to create settings property sheet, error = %d\n", GetLastError()); + return FALSE; + } +} + +/***************************************************************************** + * Name : MainDialogProc + * Description: Main dialog message processing routine. + * Parameters : dialog - dialog window handle; + * hMessage - message code; + * wParam, lParam - optional additional message data. + * Returns : TRUE if message was processed successfully, FALSE otherwise. + */ +static INT_PTR CALLBACK +MainDialogProc(HWND dialog, UINT uMessage, WPARAM wParam, LPARAM lParam) +{ + switch (uMessage) + { + case WM_INITDIALOG: + if (!on_init_main_window(dialog)) + { + CloseWindow(dialog); + return FALSE; + } + return TRUE; + + case WM_COMMAND: + switch (LOWORD(wParam)) + { + case IDCANCEL: + DestroyWindow(dialog); + return TRUE; + } + break; + + case WM_DESTROY: + PostQuitMessage(0); + return TRUE; + + case WM_CLOSE: + DestroyWindow(dialog); + return TRUE; + } + return FALSE; +} + + + /***************************************************************************** * Name : WinMain * Description: Main windows entry point @@ -248,20 +381,12 @@ WinMain (HINSTANCE hInstance, HINSTANCE hPrev, LPSTR szCmdLine, int nShow) 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 (); + + InitCommonControls(); CoInitializeEx(NULL, COINIT_APARTMENTTHREADED); - if (doPropertySheet (hInstance, NULL) > 0) { - WINE_TRACE("OK\n"); - } else { - WINE_TRACE("Cancel\n"); - } - CoUninitialize(); - ExitProcess (0); + DialogBoxW(hInstance, (LPCWSTR)MAKEINTRESOURCE(IDD_MAINWINDOW), NULL, MainDialogProc); + CoUninitialize(); + ExitProcess(0); return 0; } diff --git a/programs/winecfg/resource.h b/programs/winecfg/resource.h index fffc4da..b1cb289 100644 --- a/programs/winecfg/resource.h +++ b/programs/winecfg/resource.h @@ -47,6 +47,12 @@ #define IDS_WINECFG_TITLE_APP 18 /* App specific title */ #define IDI_WINECFG 100 #define IDI_LOGO 102 + +#define IDD_MAINWINDOW 106 +#define IDG_APPLICATIONS 210 + +#define IDD_APPLIST 301 + #define IDD_ABOUTCFG 107 #define IDD_APPCFG 108 #define IDD_AUDIOCFG 109 diff --git a/programs/winecfg/theme.c b/programs/winecfg/theme.c index 0618974..779e04d 100644 --- a/programs/winecfg/theme.c +++ b/programs/winecfg/theme.c @@ -1127,7 +1127,7 @@ ThemeDlgProc (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) break; case WM_SHOWWINDOW: - set_window_title(hDlg); + set_window_title(NULL); break; case WM_COMMAND: @@ -1257,6 +1257,7 @@ ThemeDlgProc (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) break; } case PSN_SETACTIVE: { + current_page = hDlg; init_dialog (hDlg); break; } @@ -1267,6 +1268,10 @@ ThemeDlgProc (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) on_draw_item(hDlg, wParam, lParam); break; + case WM_APPLICATIONCHANGED: + set_window_title(NULL); + break; + default: break; } diff --git a/programs/winecfg/winecfg.c b/programs/winecfg/winecfg.c index 3ed406b..7b55ae9 100644 --- a/programs/winecfg/winecfg.c +++ b/programs/winecfg/winecfg.c @@ -49,32 +49,6 @@ HKEY config_key = NULL; HMENU hPopupMenus = 0; -/* this is called from the WM_SHOWWINDOW handlers of each tab page. - * - * it's a nasty hack, necessary because the property sheet insists on resetting the window title - * to the title of the tab, which is utterly useless. dropping the property sheet is on the todo list. - */ -void set_window_title(HWND dialog) -{ - WCHAR newtitle[256]; - - /* update the window title */ - if (current_app) - { - WCHAR apptitle[256]; - LoadStringW (GetModuleHandleW(NULL), IDS_WINECFG_TITLE_APP, apptitle, - sizeof(apptitle)/sizeof(apptitle[0])); - wsprintfW (newtitle, apptitle, current_app); - } - else - { - LoadStringW (GetModuleHandleW(NULL), IDS_WINECFG_TITLE, newtitle, - sizeof(newtitle)/sizeof(newtitle[0])); - } - - WINE_TRACE("setting title to %s\n", wine_dbgstr_w (newtitle)); - SendMessageW (GetParent(dialog), PSM_SETTITLEW, 0, (LPARAM) newtitle); -} WCHAR* load_string (UINT id) diff --git a/programs/winecfg/winecfg.h b/programs/winecfg/winecfg.h index 110856a..521fffd 100644 --- a/programs/winecfg/winecfg.h +++ b/programs/winecfg/winecfg.h @@ -40,6 +40,13 @@ extern WCHAR* current_app; /* NULL means editing global settings */ +extern HWND current_page; /* Defined in main.c, set by settings dialogs. */ + +/* Sent to a settings page to indicate that current application was changed; + * wParam is reserved, lParam is previous application name (may be NULL). + * */ +#define WM_APPLICATIONCHANGED (WM_USER + 1) + /* Use get_reg_key and set_reg_key to alter registry settings. The changes made through set_reg_key won't be committed to the registry until process_all_settings is called, however get_reg_key will still return accurate information. @@ -76,8 +83,11 @@ WCHAR *keypathW(const WCHAR *section); BOOL initialize(HINSTANCE hInstance); extern HKEY config_key; -/* hack for the property sheet control */ -void set_window_title(HWND dialog); +/* Sets main dialog window title. The `application' can be used to indicate + * that currently visible settings are application-specific, otherwise + * when `application' is NULL, the title says something like `Wine config'. + */ +void set_window_title(LPCWSTR application); /* Window procedures */ INT_PTR CALLBACK GraphDlgProc (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); @@ -88,6 +98,7 @@ INT_PTR CALLBACK LibrariesDlgProc (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM l INT_PTR CALLBACK AudioDlgProc (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); INT_PTR CALLBACK ThemeDlgProc (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); INT_PTR CALLBACK AboutDlgProc (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); +INT_PTR CALLBACK AppListDlgProc(HWND hDialog, UINT uMessage, WPARAM wParam, LPARAM lParam); /* Drive management */ BOOL load_drives(void); diff --git a/programs/winecfg/winecfg.rc b/programs/winecfg/winecfg.rc index 9f763a7..2ce4414 100644 --- a/programs/winecfg/winecfg.rc +++ b/programs/winecfg/winecfg.rc @@ -29,7 +29,7 @@ LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT STRINGTABLE BEGIN - IDS_TAB_APPLICATIONS "Applications" + IDS_TAB_APPLICATIONS "Compatibility" IDS_TAB_DLLS "Libraries" IDS_TAB_DRIVES "Drives" IDS_CHOOSE_PATH "Select the Unix target directory, please." @@ -57,7 +57,7 @@ BEGIN IDS_DLL_NATIVE_BUILTIN "native, builtin" IDS_DLL_BUILTIN_NATIVE "builtin, native" IDS_DLL_DISABLED "disabled" - IDS_DEFAULT_SETTINGS "Default Settings" + IDS_DEFAULT_SETTINGS "(Default)" IDS_EXECUTABLE_FILTER "Wine Programs (*.exe; *.exe.so)" IDS_USE_GLOBAL_SETTINGS "Use global settings" IDS_SELECT_EXECUTABLE "Select an executable file" @@ -123,6 +123,24 @@ BEGIN IDC_SYSPARAMS_MENUBAR "Menu Bar" END +IDD_MAINWINDOW DIALOGEX 0, 0, 400, 276 +STYLE WS_POPUP | WS_CAPTION | WS_SYSMENU | DS_MODALFRAME | DS_CENTER +FONT 8, "MS Shell Dlg" +CAPTION "Wine configuration" +BEGIN +END + +IDD_APPLIST DIALOGEX 0, 0, 120, 276 +STYLE WS_CHILD | WS_VISIBLE +FONT 8, "MS Shell Dlg" +BEGIN + GROUPBOX "Settings for: ", IDG_APPLICATIONS, 4, 4, 116, 247 + CONTROL "", IDC_APP_LISTVIEW, "SysListView32", WS_BORDER | WS_TABSTOP | LVS_LIST | LVS_SINGLESEL | LVS_SHOWSELALWAYS, + 12, 16, 100, 206 + PUSHBUTTON "&Add...", IDC_APP_ADDAPP, 12, 228, 48, 14 + PUSHBUTTON "&Remove", IDC_APP_REMOVEAPP, 64, 228, 48, 14 +END + IDD_ABOUTCFG DIALOGEX 0, 0, 260, 220 STYLE WS_CHILD FONT 8, "MS Shell Dlg" @@ -144,15 +162,9 @@ IDD_APPCFG DIALOG 0, 0, 260, 220 STYLE WS_CHILD | WS_DISABLED FONT 8, "MS Shell Dlg" BEGIN - GROUPBOX "Application settings",IDC_STATIC, 8,4,244,210 - LTEXT "Wine can mimic different Windows versions for each application. This tab is linked to the Libraries and Graphics tabs to allow you to change system-wide or per-application settings in those tabs as well.", - IDC_STATIC,15,15,227,45 - CONTROL "",IDC_APP_LISTVIEW,"SysListView32",WS_BORDER | WS_TABSTOP | LVS_LIST | LVS_SINGLESEL | LVS_SHOWSELALWAYS, - 15,60,230,110 - PUSHBUTTON "&Add application...",IDC_APP_ADDAPP, 15,174,112,14 - PUSHBUTTON "&Remove application",IDC_APP_REMOVEAPP, 133,174,112,14 - LTEXT "&Windows Version:",IDC_STATIC,17,196,80,8 - COMBOBOX IDC_WINVER,100,194,145,56,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + GROUPBOX "Compatibility settings",IDC_STATIC, 8, 4, 244, 30 + LTEXT "&Windows Version:", IDC_STATIC, 17, 18, 80, 8 + COMBOBOX IDC_WINVER, 100, 15, 145, 56, CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP END IDD_GRAPHCFG DIALOG 0, 0, 260, 220 diff --git a/programs/winecfg/x11drvdlg.c b/programs/winecfg/x11drvdlg.c index 809068e..de9f1db 100644 --- a/programs/winecfg/x11drvdlg.c +++ b/programs/winecfg/x11drvdlg.c @@ -350,7 +350,12 @@ GraphDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) break; case WM_SHOWWINDOW: - set_window_title(hDlg); + set_window_title(current_app); + break; + + case WM_APPLICATIONCHANGED: + set_window_title(current_app); + init_dialog (hDlg); break; case WM_TIMER: @@ -411,7 +416,8 @@ GraphDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) break; } case PSN_SETACTIVE: { - init_dialog (hDlg); + current_page = hDlg; + init_dialog (hDlg); break; } }