Alexander Nicolaysen Sørnes : shdocvw: Allow navigating to Favorites in IE.
Alexandre Julliard
julliard at winehq.org
Mon Aug 2 11:03:53 CDT 2010
Module: wine
Branch: master
Commit: a91bb52c6980a05720f1bb9ea60b153bff2a0955
URL: http://source.winehq.org/git/wine.git/?a=commit;h=a91bb52c6980a05720f1bb9ea60b153bff2a0955
Author: Alexander Nicolaysen Sørnes <alex at thehandofagony.com>
Date: Thu Jul 29 12:12:54 2010 +0200
shdocvw: Allow navigating to Favorites in IE.
---
dlls/shdocvw/iexplore.c | 74 ++++++++++++++++++++++++++++++++++++++++++++--
dlls/shdocvw/resource.h | 3 ++
2 files changed, 73 insertions(+), 4 deletions(-)
diff --git a/dlls/shdocvw/iexplore.c b/dlls/shdocvw/iexplore.c
index f22dcd5..bef25ab 100644
--- a/dlls/shdocvw/iexplore.c
+++ b/dlls/shdocvw/iexplore.c
@@ -83,15 +83,55 @@ static HMENU get_fav_menu(HMENU menu)
return GetSubMenu(menu, 1);
}
-static void add_fav_to_menu(HMENU menu, LPWSTR title)
+static LPCWSTR get_fav_url_from_id(HMENU menu, UINT id)
{
MENUITEMINFOW item;
item.cbSize = sizeof(item);
- item.fMask = MIIM_FTYPE | MIIM_STRING;
+ item.fMask = MIIM_DATA;
+
+ if(!GetMenuItemInfoW(menu, id, FALSE, &item))
+ return NULL;
+
+ return (LPWSTR)item.dwItemData;
+}
+
+static void free_fav_menu_data(HMENU menu)
+{
+ LPCWSTR url;
+ int i;
+
+ for(i = 0; (url = get_fav_url_from_id(menu, ID_BROWSE_GOTOFAV_FIRST + i)); i++)
+ heap_free((LPWSTR)url);
+}
+
+static void add_fav_to_menu(HMENU menu, LPWSTR title, LPCWSTR url)
+{
+ MENUITEMINFOW item;
+ /* Subtract the number of standard elements in the Favorites menu */
+ INT favcount = GetMenuItemCount(menu) - 2;
+ LPWSTR urlbuf;
+
+ if(favcount > (ID_BROWSE_GOTOFAV_MAX - ID_BROWSE_GOTOFAV_FIRST))
+ {
+ FIXME("Add support for more than %d Favorites\n", favcount);
+ return;
+ }
+
+ urlbuf = heap_alloc((lstrlenW(url) + 1) * sizeof(WCHAR));
+
+ if(!urlbuf)
+ return;
+
+ lstrcpyW(urlbuf, url);
+
+ item.cbSize = sizeof(item);
+ item.fMask = MIIM_FTYPE | MIIM_STRING | MIIM_DATA | MIIM_ID;
item.fType = MFT_STRING;
item.dwTypeData = title;
- InsertMenuItemW(menu, GetMenuItemCount(menu), TRUE, &item);
+ item.wID = ID_BROWSE_GOTOFAV_FIRST + favcount;
+ item.dwItemData = (ULONG_PTR)urlbuf;
+ InsertMenuItemW(menu, favcount + 2, TRUE, &item);
}
static void add_favs_to_menu(HMENU menu, LPCWSTR dir)
@@ -125,14 +165,20 @@ static void add_favs_to_menu(HMENU menu, LPCWSTR dir)
do
{
WCHAR* fileext;
+ WCHAR* url = NULL;
lstrcpyW(filename, finddata.cFileName);
if(FAILED(IPersistFile_Load(urlfile, path, 0)))
continue;
+ urlobj->lpVtbl->GetURL(urlobj, &url);
+
+ if(!url)
+ continue;
+
fileext = filename + lstrlenW(filename) - lstrlenW(urlext) + 1;
*fileext = 0;
- add_fav_to_menu(menu, filename);
+ add_fav_to_menu(menu, filename, url);
} while(FindNextFileW(findhandle, &finddata));
}
@@ -159,6 +205,18 @@ static HMENU create_ie_menu(void)
return menu;
}
+static void ie_navigate(InternetExplorer* This, LPCWSTR url)
+{
+ VARIANT variant;
+
+ V_VT(&variant) = VT_BSTR;
+ V_BSTR(&variant) = SysAllocString(url);
+
+ IWebBrowser2_Navigate2(WEBBROWSER2(This), &variant, NULL, NULL, NULL, NULL);
+
+ SysFreeString(V_BSTR(&variant));
+}
+
static INT_PTR CALLBACK ie_dialog_open_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
static InternetExplorer* This;
@@ -310,6 +368,7 @@ static LRESULT iewnd_OnDestroy(InternetExplorer *This)
{
TRACE("%p\n", This);
+ free_fav_menu_data(get_fav_menu(This->menu));
This->frame_hwnd = NULL;
PostQuitMessage(0); /* FIXME */
@@ -343,6 +402,13 @@ static LRESULT CALLBACK iewnd_OnCommand(InternetExplorer *This, HWND hwnd, UINT
break;
default:
+ if(LOWORD(wparam) >= ID_BROWSE_GOTOFAV_FIRST && LOWORD(wparam) <= ID_BROWSE_GOTOFAV_MAX)
+ {
+ LPCWSTR url = get_fav_url_from_id(get_fav_menu(This->menu), LOWORD(wparam));
+
+ if(url)
+ ie_navigate(This, url);
+ }
return DefWindowProcW(hwnd, msg, wparam, lparam);
}
return 0;
diff --git a/dlls/shdocvw/resource.h b/dlls/shdocvw/resource.h
index 5e7f45d..898703c 100644
--- a/dlls/shdocvw/resource.h
+++ b/dlls/shdocvw/resource.h
@@ -39,3 +39,6 @@
#define ID_BROWSE_ABOUT 336
#define ID_BROWSE_ADDFAV 1200
+
+#define ID_BROWSE_GOTOFAV_FIRST 2000
+#define ID_BROWSE_GOTOFAV_MAX 65000
More information about the wine-cvs
mailing list