Complete windows main window documentation

This commit is contained in:
Vincent Sanders 2016-10-29 17:24:31 +01:00
parent 57715fc70c
commit 3ecced92f3
2 changed files with 320 additions and 232 deletions

View File

@ -67,6 +67,9 @@ static int open_windows = 0;
/**
* Obtain the DPI of the display.
*
* \param hwnd A win32 window handle to get the DPI for
* \return The DPI of the device teh window is displayed on.
*/
static int get_window_dpi(HWND hwnd)
{
@ -86,7 +89,9 @@ static int get_window_dpi(HWND hwnd)
/**
* set accelerators
* create and attach accelerator table to main window
*
* \param gw gui window context.
*/
static void nsws_window_set_accels(struct gui_window *w)
{
@ -132,6 +137,9 @@ static void nsws_window_set_accels(struct gui_window *w)
/**
* creation of a new full browser window
*
* \param gw gui window context.
* \return The newly created window instance.
*/
static HWND nsws_window_create(struct gui_window *gw)
{
@ -192,29 +200,15 @@ static HWND nsws_window_create(struct gui_window *gw)
/**
* calculate the dimensions of the url bar relative to the parent toolbar
* toolbar command message handler
*
* \todo This entire command handler appears superfluous.
*
* \param gw The graphical window context
* \param notification_code The notification code of the message
* \param identifier The identifier the command was delivered for
* \param ctrl_window The controlling window.
*/
static void
urlbar_dimensions(HWND hWndParent,
int toolbuttonsize,
int buttonc,
int *x,
int *y,
int *width,
int *height)
{
RECT rc;
const int cy_edit = 23;
GetClientRect(hWndParent, &rc);
*x = (toolbuttonsize + 1) * (buttonc + 1) + (NSWS_THROBBER_WIDTH>>1);
*y = ((((rc.bottom - 1) - cy_edit) >> 1) * 2) / 3;
*width = (rc.right - 1) - *x - (NSWS_THROBBER_WIDTH>>1) - NSWS_THROBBER_WIDTH;
*height = cy_edit;
}
static LRESULT
nsws_window_toolbar_command(struct gui_window *gw,
int notification_code,
@ -274,8 +268,46 @@ nsws_window_toolbar_command(struct gui_window *gw,
}
/**
* calculate the dimensions of the url bar relative to the parent toolbar
*
* \param hWndParent The parent window of the url bar
* \param toolbuttonsize size of the buttons
* \param buttonc The number of buttons
* \param[out] x The calculated x location
* \param[out] y The calculated y location
* \param[out] width The calculated width
* \param[out] height The calculated height
*/
static void
urlbar_dimensions(HWND hWndParent,
int toolbuttonsize,
int buttonc,
int *x,
int *y,
int *width,
int *height)
{
RECT rc;
const int cy_edit = 23;
GetClientRect(hWndParent, &rc);
*x = (toolbuttonsize + 1) * (buttonc + 1) + (NSWS_THROBBER_WIDTH>>1);
*y = ((((rc.bottom - 1) - cy_edit) >> 1) * 2) / 3;
*width = (rc.right - 1) - *x - (NSWS_THROBBER_WIDTH>>1) - NSWS_THROBBER_WIDTH;
*height = cy_edit;
}
/**
* callback for toolbar events
*
* message handler for toolbar window
*
* \param hwnd win32 window handle message arrived for
* \param msg The message ID
* \param wparam The w parameter of the message.
* \param lparam The l parameter of the message.
*/
static LRESULT CALLBACK
nsws_window_toolbar_callback(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
@ -340,40 +372,15 @@ nsws_window_toolbar_callback(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
}
static HIMAGELIST
get_imagelist(int resid, int bsize, int bcnt)
{
HIMAGELIST hImageList;
HBITMAP hScrBM;
LOG("resource id %d, bzize %d, bcnt %d", resid, bsize, bcnt);
hImageList = ImageList_Create(bsize, bsize, ILC_COLOR24 | ILC_MASK, 0,
bcnt);
if (hImageList == NULL)
return NULL;
hScrBM = LoadImage(hInstance, MAKEINTRESOURCE(resid),
IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR);
if (hScrBM == NULL) {
win_perror("LoadImage");
return NULL;
}
if (ImageList_AddMasked(hImageList, hScrBM, 0xcccccc) == -1) {
/* failed to add masked bitmap */
ImageList_Destroy(hImageList);
hImageList = NULL;
}
DeleteObject(hScrBM);
return hImageList;
}
/**
* callback for url bar events
*
* message handler for urlbar window
*
* \param hwnd win32 window handle message arrived for
* \param msg The message ID
* \param wparam The w parameter of the message.
* \param lparam The l parameter of the message.
*/
static LRESULT CALLBACK
nsws_window_urlbar_callback(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
@ -426,16 +433,20 @@ nsws_window_urlbar_callback(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
* create a urlbar and message handler
*
* Create an Edit control for enerting urls
*
* \param gw win32 frontends window context.
* \param hWndParent The main containing window.
* \return win32 window handle of created window or NULL on error.
*/
static HWND
nsws_window_urlbar_create(struct gui_window *gw, HWND hwndparent)
nsws_window_urlbar_create(struct gui_window *gw, HWND hWndParent)
{
int urlx, urly, urlwidth, urlheight;
HWND hwnd;
WNDPROC urlproc;
HFONT hFont;
urlbar_dimensions(hwndparent,
urlbar_dimensions(hWndParent,
gw->toolbuttonsize,
gw->toolbuttonc,
&urlx, &urly, &urlwidth, &urlheight);
@ -449,7 +460,7 @@ nsws_window_urlbar_create(struct gui_window *gw, HWND hwndparent)
urly,
urlwidth,
urlheight,
hwndparent,
hWndParent,
(HMENU)IDC_MAIN_URLBAR,
hInstance,
0);
@ -463,19 +474,23 @@ nsws_window_urlbar_create(struct gui_window *gw, HWND hwndparent)
/* subclass the message handler */
urlproc = (WNDPROC)SetWindowLongPtr(hwnd,
GWLP_WNDPROC,
(LONG_PTR)nsws_window_urlbar_callback);
GWLP_WNDPROC,
(LONG_PTR)nsws_window_urlbar_callback);
/* save the real handler */
SetProp(hwnd, TEXT("OrigMsgProc"), (HANDLE)urlproc);
hFont = CreateFont(urlheight - 4, 0, 0, 0, FW_BOLD, FALSE, FALSE, FALSE, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_SWISS, "Arial");
hFont = CreateFont(urlheight - 4, 0, 0, 0, FW_BOLD, FALSE, FALSE,
FALSE, ANSI_CHARSET, OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
DEFAULT_PITCH | FF_SWISS, "Arial");
if (hFont != NULL) {
LOG("Setting font object");
SendMessage(hwnd, WM_SETFONT, (WPARAM)hFont, 0);
}
LOG("Created url bar hwnd:%p, x:%d, y:%d, w:%d, h:%d", hwnd, urlx, urly, urlwidth, urlheight);
LOG("Created url bar hwnd:%p, x:%d, y:%d, w:%d, h:%d",
hwnd, urlx, urly, urlwidth, urlheight);
return hwnd;
}
@ -483,9 +498,12 @@ nsws_window_urlbar_create(struct gui_window *gw, HWND hwndparent)
/**
* creation of throbber
*
* \param gw win32 frontends window context.
* \return win32 window handle of created window or NULL on error.
*/
static HWND
nsws_window_throbber_create(struct gui_window *w)
nsws_window_throbber_create(struct gui_window *gw)
{
HWND hwnd;
char avi[PATH_MAX];
@ -493,11 +511,11 @@ nsws_window_throbber_create(struct gui_window *w)
hwnd = CreateWindow(ANIMATE_CLASS,
"",
WS_CHILD | WS_VISIBLE | ACS_TRANSPARENT,
w->width - NSWS_THROBBER_WIDTH - 4,
gw->width - NSWS_THROBBER_WIDTH - 4,
8,
NSWS_THROBBER_WIDTH,
NSWS_THROBBER_WIDTH,
w->main,
gw->main,
(HMENU) IDC_MAIN_THROBBER,
hInstance,
NULL);
@ -505,16 +523,64 @@ nsws_window_throbber_create(struct gui_window *w)
nsws_find_resource(avi, "throbber.avi", "windows/res/throbber.avi");
LOG("setting throbber avi as %s", avi);
Animate_Open(hwnd, avi);
if (w->throbbing)
if (gw->throbbing) {
Animate_Play(hwnd, 0, -1, -1);
else
} else {
Animate_Seek(hwnd, 0);
}
ShowWindow(hwnd, SW_SHOWNORMAL);
return hwnd;
}
/* create a toolbar add controls and message handler */
/**
* create a win32 image list for the toolbar.
*
* \param resid The resource ID of the image.
* \param bsize The size of the image to load.
* \param bcnt The number of bitmaps to load into the list.
* \return The image list or NULL on error.
*/
static HIMAGELIST
get_imagelist(int resid, int bsize, int bcnt)
{
HIMAGELIST hImageList;
HBITMAP hScrBM;
LOG("resource id %d, bzize %d, bcnt %d", resid, bsize, bcnt);
hImageList = ImageList_Create(bsize, bsize, ILC_COLOR24 | ILC_MASK, 0,
bcnt);
if (hImageList == NULL)
return NULL;
hScrBM = LoadImage(hInstance, MAKEINTRESOURCE(resid),
IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR);
if (hScrBM == NULL) {
win_perror("LoadImage");
return NULL;
}
if (ImageList_AddMasked(hImageList, hScrBM, 0xcccccc) == -1) {
/* failed to add masked bitmap */
ImageList_Destroy(hImageList);
hImageList = NULL;
}
DeleteObject(hScrBM);
return hImageList;
}
/**
* create win32 main window toolbar and add controls and message handler
*
* \param gw win32 frontends window context.
* \param hWndParent The main containing window.
* \return win32 window handle of created window or NULL on error.
*/
static HWND
nsws_window_create_toolbar(struct gui_window *gw, HWND hWndParent)
{
@ -599,15 +665,17 @@ nsws_window_create_toolbar(struct gui_window *gw, HWND hWndParent)
/**
* creation of status bar
*
* \param gw win32 frontends window context.
*/
static HWND nsws_window_create_statusbar(struct gui_window *w)
static HWND nsws_window_create_statusbar(struct gui_window *gw)
{
HWND hwnd = CreateWindowEx(0,
STATUSCLASSNAME,
NULL,
WS_CHILD | WS_VISIBLE,
0, 0, 0, 0,
w->main,
gw->main,
(HMENU)IDC_MAIN_STATUSBAR,
hInstance,
NULL);
@ -616,12 +684,18 @@ static HWND nsws_window_create_statusbar(struct gui_window *w)
}
/**
* Update popup context menu editing functionality
*
* \param w win32 frontends window context.
*/
static void nsws_update_edit(struct gui_window *w)
{
browser_editor_flags editor_flags = (w->bw == NULL) ?
BW_EDITOR_NONE : browser_window_get_editor_flags(w->bw);
bool paste, copy, del;
bool sel = (editor_flags & BW_EDITOR_CAN_COPY);
if (GetFocus() == w->urlbar) {
DWORD i, ii;
SendMessage(w->urlbar, EM_GETSEL, (WPARAM)&i, (LPARAM)&ii);
@ -629,7 +703,7 @@ static void nsws_update_edit(struct gui_window *w)
copy = (i != ii);
del = (i != ii);
} else if (sel){
} else if (sel) {
paste = (editor_flags & BW_EDITOR_CAN_PASTE);
copy = sel;
del = (editor_flags & BW_EDITOR_CAN_CUT);
@ -668,6 +742,14 @@ static void nsws_update_edit(struct gui_window *w)
}
/**
* Handle win32 context menu message
*
* \param gw win32 frontends graphical window.
* \param hwnd The win32 window handle
* \param int x The x coordinate of the event.
* \param y the y cooordiante of the event.
*/
static bool
nsws_ctx_menu(struct gui_window *w, HWND hwnd, int x, int y)
{
@ -702,6 +784,8 @@ nsws_ctx_menu(struct gui_window *w, HWND hwnd, int x, int y)
/**
* update state of forward/back buttons/menu items when page changes
*
* \param w win32 frontends graphical window.
*/
static void nsws_window_update_forward_back(struct gui_window *w)
{
@ -735,37 +819,10 @@ static void nsws_window_update_forward_back(struct gui_window *w)
}
static bool win32_window_get_scroll(struct gui_window *w, int *sx, int *sy)
{
LOG("get scroll");
if (w == NULL)
return false;
*sx = w->scrollx;
*sy = w->scrolly;
return true;
}
static void nsws_set_scale(struct gui_window *gw, float scale)
{
assert(gw != NULL);
if (gw->scale == scale)
return;
gw->scale = scale;
if (gw->bw == NULL)
return;
browser_window_set_scale(gw->bw, scale, true);
}
/**
* redraw the whole window
*
* \param gw win32 frontends graphical window.
*/
static void win32_window_redraw_window(struct gui_window *gw)
{
@ -778,90 +835,32 @@ static void win32_window_redraw_window(struct gui_window *gw)
/**
* scroll the window
* Set scale of a win32 browser window
*
* \param w The win32 gui window to scroll.
* \param sx the new 'absolute' horizontal scroll location
* \param sy the new 'absolute' vertical scroll location
* \param gw win32 frontend window context
* \param scale The new scale
*/
void win32_window_set_scroll(struct gui_window *w, int sx, int sy)
static void nsws_set_scale(struct gui_window *gw, float scale)
{
SCROLLINFO si;
nserror err;
int height;
int width;
POINT p;
int x, y;
if ((w == NULL) || (w->bw == NULL))
return;
assert(gw != NULL);
err = browser_window_get_extents(w->bw, true, &width, &height);
if (err != NSERROR_OK) {
if (gw->scale == scale) {
return;
}
/*LOG("scroll sx,sy:%d,%d x,y:%d,%d w.h:%d,%d",sx,sy,w->scrollx,w->scrolly, width,height);*/
x = gw->scrollx;
y = gw->scrolly;
/* The resulting gui window scroll must remain withn the
* windows bounding box.
*/
if (sx < 0) {
w->requestscrollx = -w->scrollx;
} else if (sx > (width - w->width)) {
w->requestscrollx = (width - w->width) - w->scrollx;
} else {
w->requestscrollx = sx - w->scrollx;
}
if (sy < 0) {
w->requestscrolly = -w->scrolly;
} else if (sy > (height - w->height)) {
w->requestscrolly = (height - w->height) - w->scrolly;
} else {
w->requestscrolly = sy - w->scrolly;
gw->scale = scale;
if (gw->bw != NULL) {
browser_window_set_scale(gw->bw, scale, true);
}
/*LOG("requestscroll x,y:%d,%d", w->requestscrollx, w->requestscrolly);*/
/* set the vertical scroll offset */
si.cbSize = sizeof(si);
si.fMask = SIF_ALL;
si.nMin = 0;
si.nMax = height - 1;
si.nPage = w->height;
si.nPos = max(w->scrolly + w->requestscrolly, 0);
si.nPos = min(si.nPos, height - w->height);
SetScrollInfo(w->drawingarea, SB_VERT, &si, TRUE);
/*LOG("SetScrollInfo VERT min:%d max:%d page:%d pos:%d", si.nMin, si.nMax, si.nPage, si.nPos);*/
/* set the horizontal scroll offset */
si.cbSize = sizeof(si);
si.fMask = SIF_ALL;
si.nMin = 0;
si.nMax = width -1;
si.nPage = w->width;
si.nPos = max(w->scrollx + w->requestscrollx, 0);
si.nPos = min(si.nPos, width - w->width);
SetScrollInfo(w->drawingarea, SB_HORZ, &si, TRUE);
/*LOG("SetScrollInfo HORZ min:%d max:%d page:%d pos:%d", si.nMin, si.nMax, si.nPage, si.nPos);*/
/* Set caret position */
GetCaretPos(&p);
HideCaret(w->drawingarea);
SetCaretPos(p.x - w->requestscrollx, p.y - w->requestscrolly);
ShowCaret(w->drawingarea);
RECT r, redraw;
r.top = 0;
r.bottom = w->height + 1;
r.left = 0;
r.right = w->width + 1;
ScrollWindowEx(w->drawingarea, - w->requestscrollx, - w->requestscrolly, &r, NULL, NULL, &redraw, SW_INVALIDATE);
/*LOG("ScrollWindowEx %d, %d", - w->requestscrollx, - w->requestscrolly);*/
w->scrolly += w->requestscrolly;
w->scrollx += w->requestscrollx;
w->requestscrollx = 0;
w->requestscrolly = 0;
win32_window_redraw_window(gw);
win32_window_set_scroll(gw, x, y);
}
@ -1074,38 +1073,17 @@ nsws_window_command(HWND hwnd,
case IDM_NAV_GLOBALHISTORY:
break;
case IDM_VIEW_ZOOMPLUS: {
int x, y;
win32_window_get_scroll(gw, &x, &y);
if (gw->bw != NULL) {
nsws_set_scale(gw, gw->scale * 1.1);
}
win32_window_redraw_window(gw);
win32_window_set_scroll(gw, x, y);
case IDM_VIEW_ZOOMPLUS:
nsws_set_scale(gw, gw->scale * 1.1);
break;
}
case IDM_VIEW_ZOOMMINUS: {
int x, y;
win32_window_get_scroll(gw, &x, &y);
if (gw->bw != NULL) {
nsws_set_scale(gw, gw->scale * 0.9);
}
win32_window_redraw_window(gw);
win32_window_set_scroll(gw, x, y);
case IDM_VIEW_ZOOMMINUS:
nsws_set_scale(gw, gw->scale * 0.9);
break;
}
case IDM_VIEW_ZOOMNORMAL: {
int x, y;
win32_window_get_scroll(gw, &x, &y);
if (gw->bw != NULL) {
nsws_set_scale(gw, 1.0);
}
win32_window_redraw_window(gw);
win32_window_set_scroll(gw, x, y);
case IDM_VIEW_ZOOMNORMAL:
nsws_set_scale(gw, 1.0);
break;
}
case IDM_VIEW_SOURCE:
break;
@ -1234,6 +1212,27 @@ nsws_window_command(HWND hwnd,
}
/**
* Get the scroll position of a win32 browser window.
*
* \param g gui_window
* \param sx receives x ordinate of point at top-left of window
* \param sy receives y ordinate of point at top-left of window
* \return true iff successful
*/
static bool win32_window_get_scroll(struct gui_window *gw, int *sx, int *sy)
{
LOG("get scroll");
if (gw == NULL)
return false;
*sx = gw->scrollx;
*sy = gw->scrolly;
return true;
}
/**
* handle WM_SIZE message on main browser window
*
@ -1359,37 +1358,6 @@ nsws_window_event_callback(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
}
/* exported interface documented in windows/window.h */
nserror
nsws_create_main_class(HINSTANCE hinstance) {
nserror ret = NSERROR_OK;
WNDCLASSEX w;
/* main window */
w.cbSize = sizeof(WNDCLASSEX);
w.style = 0;
w.lpfnWndProc = nsws_window_event_callback;
w.cbClsExtra = 0;
w.cbWndExtra = 0;
w.hInstance = hinstance;
w.hIcon = LoadIcon(hinstance, MAKEINTRESOURCE(IDR_NETSURF_ICON));
w.hCursor = NULL;
w.hbrBackground = (HBRUSH)(COLOR_MENU + 1);
w.lpszMenuName = NULL;
w.lpszClassName = windowclassname_main;
w.hIconSm = LoadIcon(hinstance, MAKEINTRESOURCE(IDR_NETSURF_ICON));
if (RegisterClassEx(&w) == 0) {
win_perror("DrawableClass");
ret = NSERROR_INIT_FAILED;
}
hInstance = hinstance;
return ret;
}
/**
* create a new gui_window to contain a browser_window.
*
@ -1808,6 +1776,119 @@ bool nsws_window_go(HWND hwnd, const char *urltxt)
}
/* exported interface documented in windows/window.h */
void win32_window_set_scroll(struct gui_window *w, int sx, int sy)
{
SCROLLINFO si;
nserror err;
int height;
int width;
POINT p;
if ((w == NULL) || (w->bw == NULL))
return;
err = browser_window_get_extents(w->bw, true, &width, &height);
if (err != NSERROR_OK) {
return;
}
/*LOG("scroll sx,sy:%d,%d x,y:%d,%d w.h:%d,%d",sx,sy,w->scrollx,w->scrolly, width,height);*/
/* The resulting gui window scroll must remain withn the
* windows bounding box.
*/
if (sx < 0) {
w->requestscrollx = -w->scrollx;
} else if (sx > (width - w->width)) {
w->requestscrollx = (width - w->width) - w->scrollx;
} else {
w->requestscrollx = sx - w->scrollx;
}
if (sy < 0) {
w->requestscrolly = -w->scrolly;
} else if (sy > (height - w->height)) {
w->requestscrolly = (height - w->height) - w->scrolly;
} else {
w->requestscrolly = sy - w->scrolly;
}
/*LOG("requestscroll x,y:%d,%d", w->requestscrollx, w->requestscrolly);*/
/* set the vertical scroll offset */
si.cbSize = sizeof(si);
si.fMask = SIF_ALL;
si.nMin = 0;
si.nMax = height - 1;
si.nPage = w->height;
si.nPos = max(w->scrolly + w->requestscrolly, 0);
si.nPos = min(si.nPos, height - w->height);
SetScrollInfo(w->drawingarea, SB_VERT, &si, TRUE);
/*LOG("SetScrollInfo VERT min:%d max:%d page:%d pos:%d", si.nMin, si.nMax, si.nPage, si.nPos);*/
/* set the horizontal scroll offset */
si.cbSize = sizeof(si);
si.fMask = SIF_ALL;
si.nMin = 0;
si.nMax = width -1;
si.nPage = w->width;
si.nPos = max(w->scrollx + w->requestscrollx, 0);
si.nPos = min(si.nPos, width - w->width);
SetScrollInfo(w->drawingarea, SB_HORZ, &si, TRUE);
/*LOG("SetScrollInfo HORZ min:%d max:%d page:%d pos:%d", si.nMin, si.nMax, si.nPage, si.nPos);*/
/* Set caret position */
GetCaretPos(&p);
HideCaret(w->drawingarea);
SetCaretPos(p.x - w->requestscrollx, p.y - w->requestscrolly);
ShowCaret(w->drawingarea);
RECT r, redraw;
r.top = 0;
r.bottom = w->height + 1;
r.left = 0;
r.right = w->width + 1;
ScrollWindowEx(w->drawingarea, - w->requestscrollx, - w->requestscrolly, &r, NULL, NULL, &redraw, SW_INVALIDATE);
/*LOG("ScrollWindowEx %d, %d", - w->requestscrollx, - w->requestscrolly);*/
w->scrolly += w->requestscrolly;
w->scrollx += w->requestscrollx;
w->requestscrollx = 0;
w->requestscrolly = 0;
}
/* exported interface documented in windows/window.h */
nserror
nsws_create_main_class(HINSTANCE hinstance) {
nserror ret = NSERROR_OK;
WNDCLASSEX w;
/* main window */
w.cbSize = sizeof(WNDCLASSEX);
w.style = 0;
w.lpfnWndProc = nsws_window_event_callback;
w.cbClsExtra = 0;
w.cbWndExtra = 0;
w.hInstance = hinstance;
w.hIcon = LoadIcon(hinstance, MAKEINTRESOURCE(IDR_NETSURF_ICON));
w.hCursor = NULL;
w.hbrBackground = (HBRUSH)(COLOR_MENU + 1);
w.lpszMenuName = NULL;
w.lpszClassName = windowclassname_main;
w.hIconSm = LoadIcon(hinstance, MAKEINTRESOURCE(IDR_NETSURF_ICON));
if (RegisterClassEx(&w) == 0) {
win_perror("DrawableClass");
ret = NSERROR_INIT_FAILED;
}
hInstance = hinstance;
return ret;
}
/* exported interface documented in windows/window.h */
HWND gui_window_main_window(struct gui_window *w)
{

View File

@ -37,7 +37,7 @@ struct browser_mouse {
struct gui_window {
/* The front's private data connected to a browser window */
/* currently 1<->1 gui_window<->windows window [non-tabbed] */
struct browser_window *bw; /** the browser_window */
struct browser_window *bw; /**< the browser_window */
HWND main; /**< handle to the actual window */
HWND toolbar; /**< toolbar handle */
@ -90,6 +90,13 @@ struct gui_window *nsws_get_gui_window(HWND hwnd);
*/
bool nsws_window_go(HWND hwnd, const char *urltxt);
/**
* scroll the window
*
* \param w The win32 gui window to scroll.
* \param sx the new 'absolute' horizontal scroll location
* \param sy the new 'absolute' vertical scroll location
*/
void win32_window_set_scroll(struct gui_window *w, int sx, int sy);
/**