add page info button to url entry and update on change for win32

This commit is contained in:
Vincent Sanders 2019-12-16 00:31:48 +00:00
parent dba2df4b9a
commit 0e304aba42
2 changed files with 232 additions and 83 deletions

View File

@ -55,19 +55,34 @@
#include "windows/global_history.h"
#include "windows/window.h"
/** List of all our gui windows */
/**
* List of all gui windows
*/
static struct gui_window *window_list = NULL;
/** The main window class name */
/**
* The main window class name
*/
static const LPCWSTR windowclassname_main = L"nswsmainwindow";
/** width of the throbber element */
/**
* width of the throbber element
*/
#define NSWS_THROBBER_WIDTH 24
/** height of the url entry box */
/**
* height of the url entry box
*/
#define NSWS_URLBAR_HEIGHT 23
/** Number of open windows */
/**
* height of the Page Information bitmap button
*/
#define NSW32_PGIBUTTON_HEIGHT 16
/**
* Number of open windows
*/
static int open_windows = 0;
@ -129,6 +144,23 @@ static HWND nsws_window_create(HINSTANCE hInstance, struct gui_window *gw)
{
HWND hwnd;
INITCOMMONCONTROLSEX icc;
int xpos = CW_USEDEFAULT;
int ypos = CW_USEDEFAULT;
int width = CW_USEDEFAULT;
int height = CW_USEDEFAULT;
if ((nsoption_int(window_width) >= 100) &&
(nsoption_int(window_height) >= 100) &&
(nsoption_int(window_x) >= 0) &&
(nsoption_int(window_y) >= 0)) {
xpos = nsoption_int(window_x);
ypos = nsoption_int(window_y);
width = nsoption_int(window_width);
height = nsoption_int(window_height);
NSLOG(netsurf, DEBUG, "Setting Window position %d,%d %d,%d",
xpos, ypos, width, height);
}
icc.dwSize = sizeof(icc);
icc.dwICC = ICC_BAR_CLASSES | ICC_WIN95_CLASSES;
@ -140,51 +172,28 @@ static HWND nsws_window_create(HINSTANCE hInstance, struct gui_window *gw)
gw->mainmenu = LoadMenu(hInstance, MAKEINTRESOURCE(IDR_MENU_MAIN));
gw->rclick = LoadMenu(hInstance, MAKEINTRESOURCE(IDR_MENU_CONTEXT));
NSLOG(netsurf, INFO,
"creating hInstance %p GUI window %p",
hInstance, gw);
hwnd = CreateWindowExW(0,
windowclassname_main,
L"NetSurf Browser",
WS_OVERLAPPEDWINDOW |
WS_CLIPCHILDREN |
WS_CLIPSIBLINGS |
CS_DBLCLKS,
CW_USEDEFAULT,
CW_USEDEFAULT,
gw->width,
gw->height,
NULL,
gw->mainmenu,
hInstance,
NULL);
windowclassname_main,
L"NetSurf Browser",
WS_OVERLAPPEDWINDOW |
WS_CLIPCHILDREN |
WS_CLIPSIBLINGS |
CS_DBLCLKS,
xpos,
ypos,
width,
height,
NULL,
gw->mainmenu,
hInstance,
(LPVOID)gw);
if (hwnd == NULL) {
NSLOG(netsurf, INFO, "Window create failed");
return NULL;
} else {
nsws_window_set_accels(gw);
}
/* set the gui window associated with this browser */
SetProp(hwnd, TEXT("GuiWnd"), (HANDLE)gw);
if ((nsoption_int(window_width) >= 100) &&
(nsoption_int(window_height) >= 100) &&
(nsoption_int(window_x) >= 0) &&
(nsoption_int(window_y) >= 0)) {
NSLOG(netsurf, INFO,
"Setting Window position %d,%d %d,%d",
nsoption_int(window_x), nsoption_int(window_y),
nsoption_int(window_width), nsoption_int(window_height));
SetWindowPos(hwnd, HWND_TOP,
nsoption_int(window_x),
nsoption_int(window_y),
nsoption_int(window_width),
nsoption_int(window_height),
SWP_SHOWWINDOW);
}
nsws_window_set_accels(gw);
return hwnd;
}
@ -295,7 +304,7 @@ urlbar_dimensions(HWND hWndParent,
/**
* callback for toolbar events
*
* message handler for toolbar window
* subclass message handler for toolbar window
*
* \param hwnd win32 window handle message arrived for
* \param msg The message ID
@ -311,7 +320,11 @@ nsws_window_toolbar_callback(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
LOG_WIN_MSG(hwnd, msg, wparam, lparam);
toolproc = (WNDPROC)GetProp(hwnd, TEXT("OrigMsgProc"));
assert(toolproc != NULL);
gw = nsws_get_gui_window(hwnd);
assert(gw != NULL);
switch (msg) {
case WM_SIZE:
@ -347,19 +360,15 @@ nsws_window_toolbar_callback(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
return 0;
}
break;
}
/* remove properties if window is being destroyed */
if (msg == WM_NCDESTROY) {
case WM_NCDESTROY:
/* remove properties if window is being destroyed */
RemoveProp(hwnd, TEXT("GuiWnd"));
toolproc = (WNDPROC)RemoveProp(hwnd, TEXT("OrigMsgProc"));
} else {
toolproc = (WNDPROC)GetProp(hwnd, TEXT("OrigMsgProc"));
}
RemoveProp(hwnd, TEXT("OrigMsgProc"));
/* put the original message handler back */
SetWindowLongPtr(hwnd, GWLP_WNDPROC, (LONG_PTR)toolproc);
break;
if (toolproc == NULL) {
/* the original toolbar procedure is not available */
return DefWindowProc(hwnd, msg, wparam, lparam);
}
/* chain to the next handler */
@ -367,10 +376,21 @@ nsws_window_toolbar_callback(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
}
static void set_urlbar_edit_size(HWND hwnd)
{
RECT rc;
GetClientRect(hwnd, &rc);
rc.left += NSW32_PGIBUTTON_HEIGHT;
SendMessage(hwnd, EM_SETRECT, 0, (LPARAM)&rc);
NSLOG(netsurf, DEBUG, "left:%ld right:%ld top:%ld bot:%ld",
rc.left,rc.right,rc.top,rc.bottom);
}
/**
* callback for url bar events
*
* message handler for urlbar window
* subclass message handler for urlbar window
*
* \param hwnd win32 window handle message arrived for
* \param msg The message ID
@ -383,12 +403,15 @@ nsws_window_urlbar_callback(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
struct gui_window *gw;
WNDPROC urlproc;
HFONT hFont;
LRESULT result;
LOG_WIN_MSG(hwnd, msg, wparam, lparam);
gw = nsws_get_gui_window(hwnd);
urlproc = (WNDPROC)GetProp(hwnd, TEXT("OrigMsgProc"));
assert(urlproc != NULL);
gw = nsws_get_gui_window(hwnd);
assert(gw != NULL);
/* override messages */
switch (msg) {
@ -411,19 +434,21 @@ nsws_window_urlbar_callback(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
/* remove properties if window is being destroyed */
RemoveProp(hwnd, TEXT("GuiWnd"));
RemoveProp(hwnd, TEXT("OrigMsgProc"));
/* put the original message handler back */
SetWindowLongPtr(hwnd, GWLP_WNDPROC, (LONG_PTR)urlproc);
break;
}
if (urlproc == NULL) {
/* the original toolbar procedure is not available */
return DefWindowProc(hwnd, msg, wparam, lparam);
case WM_SIZE:
result = CallWindowProc(urlproc, hwnd, msg, wparam, lparam);
set_urlbar_edit_size(hwnd);
return result;
}
/* chain to the next handler */
return CallWindowProc(urlproc, hwnd, msg, wparam, lparam);
}
/**
* create a urlbar and message handler
*
@ -441,6 +466,7 @@ nsws_window_urlbar_create(HINSTANCE hInstance,
{
int urlx, urly, urlwidth, urlheight;
HWND hwnd;
HWND hbutton;
WNDPROC urlproc;
HFONT hFont;
@ -453,7 +479,8 @@ nsws_window_urlbar_create(HINSTANCE hInstance,
hwnd = CreateWindowEx(0L,
TEXT("Edit"),
NULL,
WS_CHILD | WS_BORDER | WS_VISIBLE | ES_LEFT | ES_AUTOHSCROLL,
WS_CHILD | WS_BORDER | WS_VISIBLE |
ES_LEFT | ES_AUTOHSCROLL | ES_MULTILINE,
urlx,
urly,
urlwidth,
@ -461,7 +488,7 @@ nsws_window_urlbar_create(HINSTANCE hInstance,
hWndParent,
(HMENU)IDC_MAIN_URLBAR,
hInstance,
0);
NULL);
if (hwnd == NULL) {
return NULL;
@ -487,6 +514,28 @@ nsws_window_urlbar_create(HINSTANCE hInstance,
SendMessage(hwnd, WM_SETFONT, (WPARAM)hFont, 0);
}
/* Create the page info button */
hbutton = CreateWindowEx(0L,
TEXT("BUTTON"),
NULL,
WS_CHILD | WS_VISIBLE | BS_BITMAP | BS_FLAT,
(NSWS_URLBAR_HEIGHT - NSW32_PGIBUTTON_HEIGHT) /2,
(NSWS_URLBAR_HEIGHT - NSW32_PGIBUTTON_HEIGHT) /2,
NSW32_PGIBUTTON_HEIGHT,
NSW32_PGIBUTTON_HEIGHT,
hwnd,
(HMENU)IDC_PAGEINFO,
hInstance,
NULL);
/* put a property on the parent toolbar so it can set the page info */
SetProp(hWndParent, TEXT("hPGIbutton"), (HANDLE)hbutton);
SendMessageW(hbutton, BM_SETIMAGE, IMAGE_BITMAP, (LPARAM)gw->hPageInfo[PAGE_STATE_UNKNOWN]);
set_urlbar_edit_size(hwnd);
NSLOG(netsurf, INFO,
"Created url bar hwnd:%p, x:%d, y:%d, w:%d, h:%d", hwnd, urlx,
urly, urlwidth, urlheight);
@ -620,7 +669,7 @@ nsws_window_create_toolbar(HINSTANCE hInstance,
hWndToolbar = CreateWindowEx(0,
TOOLBARCLASSNAME,
"Toolbar",
WS_CHILD | WS_VISIBLE | TBSTYLE_FLAT,
WS_CHILD | TBSTYLE_FLAT,
0, 0, 0, 0,
hWndParent,
NULL,
@ -685,15 +734,21 @@ nsws_window_create_toolbar(HINSTANCE hInstance,
TB_BUTTONSTRUCTSIZE,
(WPARAM)sizeof(TBBUTTON),
0);
SendMessage(hWndToolbar,
TB_ADDBUTTONS,
(WPARAM)gw->toolbuttonc,
(LPARAM)&tbButtons);
/* create url widget */
gw->urlbar = nsws_window_urlbar_create(hInstance, hWndToolbar, gw);
/* create throbber widget */
gw->throbber = nsws_window_throbber_create(hInstance, hWndToolbar, gw);
SendMessage(hWndToolbar, TB_AUTOSIZE, 0, 0);
ShowWindow(hWndToolbar, TRUE);
return hWndToolbar;
}
@ -1330,12 +1385,30 @@ nsws_window_event_callback(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
struct gui_window *gw;
RECT rmain;
LPCREATESTRUCTW createstruct;
LOG_WIN_MSG(hwnd, msg, wparam, lparam);
/* deal with window creation as a special case */
if (msg == WM_CREATE) {
/* To cause all the component child windows to be
gw = nsws_get_gui_window(hwnd);
switch (msg) {
case WM_NCCREATE: /* non client area create */
/* gw is passed as the lpParam from createwindowex() */
createstruct = (LPCREATESTRUCTW)lparam;
gw = (struct gui_window *)createstruct->lpCreateParams;
/* set the gui window associated with this window handle */
SetProp(hwnd, TEXT("GuiWnd"), (HANDLE)gw);
NSLOG(netsurf, INFO,
"created hWnd:%p hInstance %p GUI window %p",
hwnd, createstruct->hInstance, gw);
break;
case WM_CREATE:
/*
* To cause all the component child windows to be
* re-sized correctly a WM_SIZE message of the actual
* created size must be sent.
*
@ -1344,19 +1417,9 @@ nsws_window_event_callback(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
* until after the WM_CREATE message is dispatched.
*/
GetClientRect(hwnd, &rmain);
PostMessage(hwnd, WM_SIZE, 0, MAKELPARAM(rmain.right, rmain.bottom));
return DefWindowProcW(hwnd, msg, wparam, lparam);
}
gw = nsws_get_gui_window(hwnd);
if (gw == NULL) {
NSLOG(netsurf, INFO,
"Unable to find gui window structure for hwnd %p", hwnd);
return DefWindowProcW(hwnd, msg, wparam, lparam);
}
switch (msg) {
PostMessage(hwnd, WM_SIZE, 0,
MAKELPARAM(rmain.right, rmain.bottom));
break;
case WM_CONTEXTMENU:
if (nsws_ctx_menu(gw, hwnd, GET_X_LPARAM(lparam),
@ -1389,6 +1452,63 @@ nsws_window_event_callback(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
return DefWindowProcW(hwnd, msg, wparam, lparam);
}
static void destroy_page_info_bitmaps(struct gui_window *gw)
{
DeleteObject(gw->hPageInfo[PAGE_STATE_UNKNOWN]);
DeleteObject(gw->hPageInfo[PAGE_STATE_INTERNAL]);
DeleteObject(gw->hPageInfo[PAGE_STATE_LOCAL]);
DeleteObject(gw->hPageInfo[PAGE_STATE_INSECURE]);
DeleteObject(gw->hPageInfo[PAGE_STATE_SECURE_OVERRIDE]);
DeleteObject(gw->hPageInfo[PAGE_STATE_SECURE_ISSUES]);
DeleteObject(gw->hPageInfo[PAGE_STATE_SECURE]);
}
static void load_page_info_bitmaps(HINSTANCE hInstance, struct gui_window *gw)
{
gw->hPageInfo[PAGE_STATE_UNKNOWN] = LoadImage(hInstance,
MAKEINTRESOURCE(IDB_PAGEINFO_INTERNAL),
IMAGE_BITMAP,
0,
0,
LR_DEFAULTCOLOR);
gw->hPageInfo[PAGE_STATE_INTERNAL] = LoadImage(hInstance,
MAKEINTRESOURCE(IDB_PAGEINFO_INTERNAL),
IMAGE_BITMAP,
0,
0,
LR_DEFAULTCOLOR);
gw->hPageInfo[PAGE_STATE_LOCAL] = LoadImage(hInstance,
MAKEINTRESOURCE(IDB_PAGEINFO_LOCAL),
IMAGE_BITMAP,
0,
0,
LR_DEFAULTCOLOR);
gw->hPageInfo[PAGE_STATE_INSECURE] = LoadImage(hInstance,
MAKEINTRESOURCE(IDB_PAGEINFO_INSECURE),
IMAGE_BITMAP,
0,
0,
LR_DEFAULTCOLOR);
gw->hPageInfo[PAGE_STATE_SECURE_OVERRIDE] = LoadImage(hInstance,
MAKEINTRESOURCE(IDB_PAGEINFO_WARNING),
IMAGE_BITMAP,
0,
0,
LR_DEFAULTCOLOR);
gw->hPageInfo[PAGE_STATE_SECURE_ISSUES] = LoadImage(hInstance,
MAKEINTRESOURCE(IDB_PAGEINFO_WARNING),
IMAGE_BITMAP,
0,
0,
LR_DEFAULTCOLOR);
gw->hPageInfo[PAGE_STATE_SECURE] = LoadImage(hInstance,
MAKEINTRESOURCE(IDB_PAGEINFO_SECURE),
IMAGE_BITMAP,
0,
0,
LR_DEFAULTCOLOR);
}
/**
* create a new gui_window to contain a browser_window.
@ -1422,6 +1542,8 @@ win32_window_create(struct browser_window *bw,
gw->requestscrolly = 0;
gw->localhistory = NULL;
load_page_info_bitmaps(hinst, gw);
gw->mouse = malloc(sizeof(struct browser_mouse));
if (gw->mouse == NULL) {
free(gw);
@ -1480,6 +1602,8 @@ static void win32_window_destroy(struct gui_window *w)
DestroyAcceleratorTable(w->acceltable);
destroy_page_info_bitmaps(w);
free(w);
w = NULL;
}
@ -1713,6 +1837,25 @@ static void win32_window_stop_throbber(struct gui_window *w)
}
/**
* win32 page info change.
*
* \param gw window to chnage info on
*/
static void win32_window_page_info_change(struct gui_window *gw)
{
HWND hbutton;
browser_window_page_info_state pistate;
hbutton = GetProp(gw->toolbar, TEXT("hPGIbutton"));
pistate = browser_window_get_page_info_state(gw->bw);
SendMessageW(hbutton, BM_SETIMAGE, IMAGE_BITMAP,
(LPARAM)gw->hPageInfo[pistate]);
}
/**
* process miscellaneous window events
*
@ -1740,6 +1883,10 @@ win32_window_event(struct gui_window *gw, enum gui_window_event event)
win32_window_stop_throbber(gw);
break;
case GW_EVENT_PAGE_INFO_CHANGE:
win32_window_page_info_change(gw);
break;
default:
break;
}

View File

@ -27,7 +27,7 @@ extern struct gui_window_table *win32_window_table;
struct browser_mouse {
struct gui_window *gui;
struct box *box;
double pressed_x;
double pressed_y;
bool waiting;
@ -62,6 +62,8 @@ struct gui_window {
HACCEL acceltable; /**< accelerators */
HBITMAP hPageInfo[8]; /**< page info handles */
int scrollx; /**< current scroll location */
int scrolly; /**< current scroll location */