Jason Green : winefile:
Add the ability to save window position to the registry.
Alexandre Julliard
julliard at wine.codeweavers.com
Tue Feb 21 05:04:41 CST 2006
Module: wine
Branch: refs/heads/master
Commit: 42d6fe6bd502a779b1521918c2bedae607d7e0fe
URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=42d6fe6bd502a779b1521918c2bedae607d7e0fe
Author: Jason Green <jave27 at gmail.com>
Date: Mon Feb 20 12:57:01 2006 -0500
winefile: Add the ability to save window position to the registry.
---
programs/winefile/En.rc | 2 -
programs/winefile/resource.h | 1
programs/winefile/winefile.c | 102 ++++++++++++++++++++++++++++++++++++++----
programs/winefile/winefile.h | 10 ++++
4 files changed, 104 insertions(+), 11 deletions(-)
diff --git a/programs/winefile/En.rc b/programs/winefile/En.rc
index 7a305d8..8220a26 100644
--- a/programs/winefile/En.rc
+++ b/programs/winefile/En.rc
@@ -113,7 +113,7 @@ IDM_WINEFILE MENU FIXED IMPURE
#endif
MENUITEM SEPARATOR
MENUITEM "&Minimize on run", 504
- MENUITEM "&Save settings on exit", 511
+ MENUITEM "&Save settings on exit", ID_VIEW_SAVESETTINGS
}
diff --git a/programs/winefile/resource.h b/programs/winefile/resource.h
index d4d0adc..9044970 100644
--- a/programs/winefile/resource.h
+++ b/programs/winefile/resource.h
@@ -63,6 +63,7 @@
#define ID_VIEW_TOOL_BAR 508
#define ID_VIEW_DRIVE_BAR 507
#define ID_VIEW_STATUSBAR 503
+#define ID_VIEW_SAVESETTINGS 511
#define ID_ABOUT 1803
#define ID_REFRESH 1704
diff --git a/programs/winefile/winefile.c b/programs/winefile/winefile.c
index 387711d..afaba10 100644
--- a/programs/winefile/winefile.c
+++ b/programs/winefile/winefile.c
@@ -2,6 +2,7 @@
* Winefile
*
* Copyright 2000, 2003, 2004, 2005 Martin Fuchs
+ * Copyright 2006 Jason Green
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -58,6 +59,13 @@
#define DEFAULT_SPLIT_POS 200
#endif
+static const WCHAR registry_key[] = { 'S','o','f','t','w','a','r','e','\\',
+ 'W','i','n','e','\\',
+ 'W','i','n','e','F','i','l','e','\0'};
+static const WCHAR reg_start_x[] = { 's','t','a','r','t','X','\0'};
+static const WCHAR reg_start_y[] = { 's','t','a','r','t','Y','\0'};
+static const WCHAR reg_width[] = { 'w','i','d','t','h','\0'};
+static const WCHAR reg_height[] = { 'h','e','i','g','h','t','\0'};
enum ENTRY_TYPE {
ET_WINDOWS,
@@ -1569,6 +1577,75 @@ static void get_path(Entry* dir, PTSTR p
}
}
+static windowOptions load_registry_settings(void)
+{
+ DWORD size;
+ DWORD type;
+ HKEY hKey;
+ windowOptions opts;
+
+ RegOpenKeyEx( HKEY_CURRENT_USER, registry_key,
+ 0, KEY_QUERY_VALUE, &hKey );
+
+ size = sizeof(DWORD);
+
+ if( RegQueryValueEx( hKey, reg_start_x, NULL, &type,
+ (LPBYTE) &opts.start_x, &size ) != ERROR_SUCCESS )
+ opts.start_x = CW_USEDEFAULT;
+
+ if( RegQueryValueEx( hKey, reg_start_y, NULL, &type,
+ (LPBYTE) &opts.start_y, &size ) != ERROR_SUCCESS )
+ opts.start_y = CW_USEDEFAULT;
+
+ if( RegQueryValueEx( hKey, reg_width, NULL, &type,
+ (LPBYTE) &opts.width, &size ) != ERROR_SUCCESS )
+ opts.width = CW_USEDEFAULT;
+
+ if( RegQueryValueEx( hKey, reg_height, NULL, &type,
+ (LPBYTE) &opts.height, &size ) != ERROR_SUCCESS )
+ opts.height = CW_USEDEFAULT;
+
+ RegCloseKey( hKey );
+
+ return opts;
+}
+
+static void save_registry_settings(void)
+{
+ WINDOWINFO wi;
+ HKEY hKey;
+ INT width, height;
+
+ wi.cbSize = sizeof( WINDOWINFO );
+ GetWindowInfo(Globals.hMainWnd, &wi);
+ width = wi.rcWindow.right - wi.rcWindow.left;
+ height = wi.rcWindow.bottom - wi.rcWindow.top;
+
+ if ( RegOpenKeyEx( HKEY_CURRENT_USER, registry_key,
+ 0, KEY_SET_VALUE, &hKey ) != ERROR_SUCCESS )
+ {
+ /* Unable to save registry settings - try to create key */
+ if ( RegCreateKeyEx( HKEY_CURRENT_USER, registry_key,
+ 0, NULL, REG_OPTION_NON_VOLATILE,
+ KEY_SET_VALUE, NULL, &hKey, NULL ) != ERROR_SUCCESS )
+ {
+ /* FIXME: Cannot create key */
+ return;
+ }
+ }
+ /* Save all of the settings */
+ RegSetValueEx( hKey, reg_start_x, 0, REG_DWORD,
+ (LPBYTE) &wi.rcWindow.left, sizeof(DWORD) );
+ RegSetValueEx( hKey, reg_start_y, 0, REG_DWORD,
+ (LPBYTE) &wi.rcWindow.top, sizeof(DWORD) );
+ RegSetValueEx( hKey, reg_width, 0, REG_DWORD,
+ (LPBYTE) &width, sizeof(DWORD) );
+ RegSetValueEx( hKey, reg_height, 0, REG_DWORD,
+ (LPBYTE) &height, sizeof(DWORD) );
+
+ /* TODO: Save more settings here (List vs. Detailed View, etc.) */
+ RegCloseKey( hKey );
+}
static void resize_frame_rect(HWND hwnd, PRECT prect)
{
@@ -2150,6 +2227,9 @@ static LRESULT CALLBACK FrameWndProc(HWN
switch(nmsg) {
case WM_CLOSE:
+ if (Globals.saveSettings == TRUE)
+ save_registry_settings();
+
DestroyWindow(hwnd);
/* clear handle variables */
@@ -2305,6 +2385,12 @@ static LRESULT CALLBACK FrameWndProc(HWN
toggle_child(hwnd, cmd, Globals.hstatusbar);
break;
+ case ID_VIEW_SAVESETTINGS:
+ Globals.saveSettings = !Globals.saveSettings;
+ CheckMenuItem(Globals.hMenuOptions, ID_VIEW_SAVESETTINGS,
+ Globals.saveSettings == TRUE ? MF_CHECKED : MF_UNCHECKED );
+ break;
+
case ID_EXECUTE: {
struct ExecuteDialog dlg;
@@ -4678,12 +4764,14 @@ static void show_frame(HWND hwndParent,
TCHAR buffer[MAX_PATH], b1[BUFFER_LEN];
ChildWnd* child;
HMENU hMenuFrame, hMenuWindow;
+ windowOptions opts;
CLIENTCREATESTRUCT ccs;
if (Globals.hMainWnd)
return;
+ opts = load_registry_settings();
hMenuFrame = LoadMenu(Globals.hInstance, MAKEINTRESOURCE(IDM_WINEFILE));
hMenuWindow = GetSubMenu(hMenuFrame, GetMenuItemCount(hMenuFrame)-2);
@@ -4697,7 +4785,7 @@ static void show_frame(HWND hwndParent,
/* create main window */
Globals.hMainWnd = CreateWindowEx(0, (LPCTSTR)(int)Globals.hframeClass, RS(b1,IDS_WINE_FILE), WS_OVERLAPPEDWINDOW,
- CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
+ opts.start_x, opts.start_y, opts.width, opts.height,
hwndParent, Globals.hMenuFrame, Globals.hInstance, 0/*lpParam*/);
@@ -4705,9 +4793,9 @@ static void show_frame(HWND hwndParent,
WS_CHILD|WS_CLIPCHILDREN|WS_VSCROLL|WS_HSCROLL|WS_VISIBLE|WS_BORDER,
0, 0, 0, 0,
Globals.hMainWnd, 0, Globals.hInstance, &ccs);
-
-
+
CheckMenuItem(Globals.hMenuOptions, ID_VIEW_DRIVE_BAR, MF_BYCOMMAND|MF_CHECKED);
+ CheckMenuItem(Globals.hMenuOptions, ID_VIEW_SAVESETTINGS, MF_BYCOMMAND);
create_drive_bar();
@@ -4737,7 +4825,7 @@ static void show_frame(HWND hwndParent,
WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS|WS_BORDER|CCS_NODIVIDER, 0,0,0,0,
Globals.hMainWnd, (HMENU)IDW_STATUSBAR, hinstance, 0);*/
- /*TODO: read paths and window placements from registry */
+ /*TODO: read paths from registry */
if (!path || !*path) {
GetCurrentDirectory(MAX_PATH, buffer);
@@ -4849,13 +4937,9 @@ static int find_window_class(LPCTSTR cla
static int winefile_main(HINSTANCE hinstance, int cmdshow, LPCTSTR path)
{
MSG msg;
-
+
InitInstance(hinstance);
- if (cmdshow == SW_SHOWNORMAL)
- /*TODO: read window placement from registry */
- cmdshow = SW_MAXIMIZE;
-
show_frame(0, cmdshow, path);
while(GetMessage(&msg, 0, 0, 0)) {
diff --git a/programs/winefile/winefile.h b/programs/winefile/winefile.h
index 45d800d..0057289 100644
--- a/programs/winefile/winefile.h
+++ b/programs/winefile/winefile.h
@@ -107,6 +107,13 @@ enum IMAGE {
#define FRM_CALC_CLIENT 0xBF83
#define Frame_CalcFrameClient(hwnd, prt) ((BOOL)SNDMSG(hwnd, FRM_CALC_CLIENT, 0, (LPARAM)(PRECT)prt))
+typedef struct
+{
+ int start_x;
+ int start_y;
+ int width;
+ int height;
+} windowOptions;
typedef struct
{
@@ -132,7 +139,8 @@ typedef struct
TCHAR drives[BUFFER_LEN];
BOOL prescan_node; /*TODO*/
-
+ BOOL saveSettings;
+
#ifdef _SHELL_FOLDERS
IShellFolder* iDesktop;
IMalloc* iMalloc;
More information about the wine-cvs
mailing list