Detlef Riekenberg : inetcpl: Add general propsheet and allow to set the homepage.
Alexandre Julliard
julliard at winehq.org
Fri Oct 1 11:38:49 CDT 2010
Module: wine
Branch: master
Commit: e859230ee40c60b45cade3934757cbc0363a3416
URL: http://source.winehq.org/git/wine.git/?a=commit;h=e859230ee40c60b45cade3934757cbc0363a3416
Author: Detlef Riekenberg <wine.dev at web.de>
Date: Fri Oct 1 13:19:03 2010 +0200
inetcpl: Add general propsheet and allow to set the homepage.
---
dlls/inetcpl.cpl/Makefile.in | 3 +-
dlls/inetcpl.cpl/cpl_En.rc | 17 ++++
dlls/inetcpl.cpl/general.c | 212 ++++++++++++++++++++++++++++++++++++++++++
dlls/inetcpl.cpl/inetcpl.c | 7 +-
dlls/inetcpl.cpl/inetcpl.h | 12 +++
5 files changed, 249 insertions(+), 2 deletions(-)
diff --git a/dlls/inetcpl.cpl/Makefile.in b/dlls/inetcpl.cpl/Makefile.in
index 12eb694..565e54e 100644
--- a/dlls/inetcpl.cpl/Makefile.in
+++ b/dlls/inetcpl.cpl/Makefile.in
@@ -1,9 +1,10 @@
MODULE = inetcpl.cpl
-IMPORTS = comctl32 user32
+IMPORTS = comctl32 shlwapi user32 advapi32
DELAYIMPORTS = cryptui
C_SRCS = \
content.c \
+ general.c \
inetcpl.c
RC_SRCS = \
diff --git a/dlls/inetcpl.cpl/cpl_En.rc b/dlls/inetcpl.cpl/cpl_En.rc
index f463df7..769ec60 100644
--- a/dlls/inetcpl.cpl/cpl_En.rc
+++ b/dlls/inetcpl.cpl/cpl_En.rc
@@ -29,6 +29,23 @@ BEGIN
IDS_CPL_INFO "Configure Wine Internet Browser and related settings"
END
+/* "General" propsheet */
+IDD_GENERAL DIALOG 0, 0, 320, 220
+STYLE WS_CAPTION | WS_CHILD | WS_DISABLED
+FONT 8, "MS Shell Dlg"
+CAPTION "General"
+BEGIN
+
+ GROUPBOX " Home page ", IDC_STATIC, 4, 4, 312, 52
+ LTEXT "You can choose the address that will be used as your home page.",
+ IDC_STATIC, 58, 10, 252, 10
+ EDITTEXT IDC_HOME_EDIT, 58, 22, 252, 12, WS_VISIBLE | ES_AUTOHSCROLL
+ PUSHBUTTON "&Current page", IDC_HOME_CURRENT, 58, 36, 80, 14
+ PUSHBUTTON "&Default page", IDC_HOME_DEFAULT, 144, 36, 80, 14
+ PUSHBUTTON "&Blank page", IDC_HOME_BLANK, 230, 36, 80, 14
+
+END
+
/* "Content" propsheet */
IDD_CONTENT DIALOG 0, 0, 320, 220
STYLE WS_CAPTION | WS_CHILD | WS_DISABLED
diff --git a/dlls/inetcpl.cpl/general.c b/dlls/inetcpl.cpl/general.c
new file mode 100644
index 0000000..0825897
--- /dev/null
+++ b/dlls/inetcpl.cpl/general.c
@@ -0,0 +1,212 @@
+/*
+ * Internet control panel applet: general propsheet
+ *
+ * Copyright 2010 Detlef Riekenberg
+ *
+ * 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 NONAMELESSUNION
+
+#include <stdarg.h>
+#include <windef.h>
+#include <winbase.h>
+#include <winuser.h>
+#include <wininet.h>
+#include <winreg.h>
+#include <shlwapi.h>
+#include <prsht.h>
+
+#include "inetcpl.h"
+#include "wine/debug.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(inetcpl);
+
+static const WCHAR about_blank[] = {'a','b','o','u','t',':','b','l','a','n','k',0};
+static const WCHAR start_page[] = {'S','t','a','r','t',' ','P','a','g','e',0};
+static const WCHAR reg_ie_main[] = {'S','o','f','t','w','a','r','e','\\',
+ 'M','i','c','r','o','s','o','f','t','\\',
+ 'I','n','t','e','r','n','e','t',' ','E','x','p','l','o','r','e','r','\\',
+ 'M','a','i','n',0};
+
+/* list of unimplemented buttons */
+static DWORD disable_me[] = {IDC_HOME_CURRENT,
+ IDC_HOME_DEFAULT, 0};
+
+/*********************************************************************
+ * parse_url_from_outside [internal]
+ *
+ * Filter an URL, add a usable scheme, when needed
+ *
+ */
+static DWORD parse_url_from_outside(LPCWSTR url, LPWSTR out, DWORD maxlen)
+{
+ HMODULE hdll;
+ DWORD (WINAPI *pParseURLFromOutsideSourceW)(LPCWSTR, LPWSTR, LPDWORD, LPDWORD);
+ DWORD res;
+
+ hdll = LoadLibraryA("shdocvw.dll");
+ pParseURLFromOutsideSourceW = (void *) GetProcAddress(hdll, (LPSTR) 170);
+
+ if (pParseURLFromOutsideSourceW)
+ {
+ res = pParseURLFromOutsideSourceW(url, out, &maxlen, NULL);
+ FreeLibrary(hdll);
+ return res;
+ }
+
+ ERR("failed to get ordinal 170: %d\n", GetLastError());
+ FreeLibrary(hdll);
+ return 0;
+}
+
+/*********************************************************************
+ * general_on_command [internal]
+ *
+ * handle WM_COMMAND
+ *
+ */
+static INT_PTR general_on_command(HWND hwnd, WPARAM wparam)
+{
+
+ switch (wparam)
+ {
+ case MAKEWPARAM(IDC_HOME_EDIT, EN_CHANGE):
+ /* enable apply button */
+ SendMessageW(GetParent(hwnd), PSM_CHANGED, (WPARAM)hwnd, 0);
+ break;
+
+ case MAKEWPARAM(IDC_HOME_BLANK, BN_CLICKED):
+ SetDlgItemTextW(hwnd, IDC_HOME_EDIT, about_blank);
+ break;
+
+ default:
+ TRACE("not implemented for command: %d/%d\n", HIWORD(wparam), LOWORD(wparam));
+ return FALSE;
+ }
+ return TRUE;
+}
+
+/*********************************************************************
+ * general_on_initdialog [internal]
+ *
+ * handle WM_INITDIALOG
+ *
+ */
+static VOID general_on_initdialog(HWND hwnd)
+{
+ WCHAR buffer[INTERNET_MAX_URL_LENGTH];
+ DWORD len;
+ DWORD type;
+ LONG res;
+ DWORD *ptr = disable_me;
+
+ /* disable unimplemented buttons */
+ while (*ptr)
+ {
+ EnableWindow(GetDlgItem(hwnd, *ptr), FALSE);
+ ptr++;
+ }
+
+ /* read current homepage from the registry. Try HCU first, then HKLM */
+ *buffer = 0;
+ len = sizeof(buffer);
+ type = REG_SZ;
+ res = SHRegGetUSValueW(reg_ie_main, start_page, &type, buffer, &len, FALSE, (LPBYTE) about_blank, sizeof(about_blank));
+
+ if (!res && (type == REG_SZ))
+ {
+ SetDlgItemTextW(hwnd, IDC_HOME_EDIT, buffer);
+ }
+}
+
+/*********************************************************************
+ * general_on_notify [internal]
+ *
+ * handle WM_NOTIFY
+ *
+ */
+static INT_PTR general_on_notify(HWND hwnd, WPARAM wparam, LPARAM lparam)
+{
+ PSHNOTIFY *psn;
+ WCHAR buffer[INTERNET_MAX_URL_LENGTH];
+ WCHAR parsed[INTERNET_MAX_URL_LENGTH];
+ LONG res;
+
+ psn = (PSHNOTIFY *) lparam;
+ TRACE("WM_NOTIFY (%p, 0x%lx, 0x%lx) from %p with code: %d\n", hwnd, wparam, lparam,
+ psn->hdr.hwndFrom, psn->hdr.code);
+
+ if (psn->hdr.code == PSN_APPLY)
+ {
+ *buffer = 0;
+ GetDlgItemTextW(hwnd, IDC_HOME_EDIT, buffer, sizeof(buffer)/sizeof(WCHAR));
+ TRACE("EDITTEXT has %s\n", debugstr_w(buffer));
+
+ res = parse_url_from_outside(buffer, parsed, sizeof(parsed)/sizeof(WCHAR));
+ TRACE("got %d with %s\n", res, debugstr_w(parsed));
+
+ if (res)
+ {
+ HKEY hkey;
+
+ /* update the dialog, when needed */
+ if (lstrcmpW(buffer, parsed))
+ SetDlgItemTextW(hwnd, IDC_HOME_EDIT, parsed);
+
+ /* update the registry */
+ res = RegOpenKeyW(HKEY_CURRENT_USER, reg_ie_main, &hkey);
+ if (!res)
+ {
+ res = RegSetValueExW(hkey, start_page, 0, REG_SZ, (const BYTE *)parsed,
+ (lstrlenW(parsed) + 1) * sizeof(WCHAR));
+ RegCloseKey(hkey);
+ return !res;
+ }
+ }
+ }
+ return FALSE;
+}
+
+/*********************************************************************
+ * general_dlgproc [internal]
+ *
+ */
+INT_PTR CALLBACK general_dlgproc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
+{
+
+ switch (msg)
+ {
+ case WM_INITDIALOG:
+ general_on_initdialog(hwnd);
+ return TRUE;
+
+ case WM_COMMAND:
+ return general_on_command(hwnd, wparam);
+
+ case WM_NOTIFY:
+ return general_on_notify(hwnd, wparam, lparam);
+
+ default:
+ /* do not flood the log */
+ if ((msg == WM_SETCURSOR) || (msg == WM_NCHITTEST) || (msg == WM_MOUSEMOVE))
+ return FALSE;
+
+ TRACE("(%p, 0x%08x/%d, 0x%lx, 0x%lx)\n", hwnd, msg, msg, wparam, lparam);
+
+ }
+ return FALSE;
+}
diff --git a/dlls/inetcpl.cpl/inetcpl.c b/dlls/inetcpl.cpl/inetcpl.c
index 80decfb..03b6282 100644
--- a/dlls/inetcpl.cpl/inetcpl.c
+++ b/dlls/inetcpl.cpl/inetcpl.c
@@ -27,7 +27,6 @@
#include <wingdi.h>
#include <winuser.h>
#include <commctrl.h>
-#include <commdlg.h>
#include <cpl.h>
#include "wine/debug.h"
@@ -93,6 +92,12 @@ static void display_cpl_sheets(HWND parent)
/* Fill out all PROPSHEETPAGE */
psp[id].dwSize = sizeof (PROPSHEETPAGEW);
psp[id].hInstance = hcpl;
+ psp[id].u.pszTemplate = MAKEINTRESOURCEW(IDD_GENERAL);
+ psp[id].pfnDlgProc = general_dlgproc;
+ id++;
+
+ psp[id].dwSize = sizeof (PROPSHEETPAGEW);
+ psp[id].hInstance = hcpl;
psp[id].u.pszTemplate = MAKEINTRESOURCEW(IDD_CONTENT);
psp[id].pfnDlgProc = content_dlgproc;
id++;
diff --git a/dlls/inetcpl.cpl/inetcpl.h b/dlls/inetcpl.cpl/inetcpl.h
index e1477ff..cee9d4f 100644
--- a/dlls/inetcpl.cpl/inetcpl.h
+++ b/dlls/inetcpl.cpl/inetcpl.h
@@ -19,12 +19,16 @@
*
*/
+#ifndef __WINE_INETCPL__
+#define __WINE_INETCPL__
+
#include <windef.h>
#include <winuser.h>
extern HMODULE hcpl;
INT_PTR CALLBACK content_dlgproc(HWND, UINT, WPARAM, LPARAM) DECLSPEC_HIDDEN;
+INT_PTR CALLBACK general_dlgproc(HWND, UINT, WPARAM, LPARAM) DECLSPEC_HIDDEN;
#define NUM_PROPERTY_PAGES 8
@@ -38,6 +42,14 @@ INT_PTR CALLBACK content_dlgproc(HWND, UINT, WPARAM, LPARAM) DECLSPEC_HIDDEN;
/* dialogs */
#define IDC_STATIC -1
+#define IDD_GENERAL 1000
+#define IDC_HOME_EDIT 1000
+#define IDC_HOME_CURRENT 1001
+#define IDC_HOME_DEFAULT 1002
+#define IDC_HOME_BLANK 1003
+
#define IDD_CONTENT 4000
#define IDC_CERT 4100
#define IDC_CERT_PUBLISHER 4101
+
+#endif
More information about the wine-cvs
mailing list