From 0eb9663b1cabc3a4be4ca924b534056ec8371326 Mon Sep 17 00:00:00 2001 From: Vincent Sanders Date: Tue, 2 Feb 2010 23:43:09 +0000 Subject: Make window resizeing not delete all child windows and recreate them a resize is sufficient svn path=/trunk/netsurf/; revision=9952 --- windows/gui.c | 387 ++++++++++++++++++++++++++++++++-------------------------- 1 file changed, 214 insertions(+), 173 deletions(-) (limited to 'windows/gui.c') diff --git a/windows/gui.c b/windows/gui.c index 73e6b72fa..27e5824ca 100644 --- a/windows/gui.c +++ b/windows/gui.c @@ -182,29 +182,18 @@ static void redraw(void) w = w->next; continue; } -// current_hwnd = w->main; + current_hwnd = w->drawingarea; -// PostMessage(w->toolbar, WM_PAINT, 0, 0); -// PostMessage(w->urlbar, WM_PAINT, 0, 0); w->scrolly += w->requestscrolly; w->scrollx += w->requestscrollx; w->scrolly = MAX(w->scrolly, 0); - w->scrolly = MIN(w->scrolly, c->height * w->bw->scale - - w->height); + w->scrolly = MIN(w->scrolly, c->height * w->bw->scale - w->height); w->scrollx = MAX(w->scrollx, 0); - w->scrollx = MIN(w->scrollx, c->width * w->bw->scale - - w->width); + w->scrollx = MIN(w->scrollx, c->width * w->bw->scale - w->width); /* redraw */ -/* w->redraw.left = MIN(w->redraw.left, w->scrollx); - w->redraw.top = MIN(w->redraw.top, w->scrolly + w->voffset ); - w->redraw.right = MAX(w->redraw.right, w->scrollx + w->width); - w->redraw.bottom = MAX(w->redraw.bottom, w->scrolly + - w->height + w->voffset ); -*/ current_redraw_browser = bw; nsws_plot_set_scale(bw->scale); -/* doublebuffering = true; */ hdc = GetDC(w->main); if (w->bufferbm == NULL) { w->bufferbm = CreateCompatibleBitmap(hdc, w->width, @@ -284,6 +273,7 @@ LRESULT CALLBACK nsws_window_url_callback(HWND hwnd, UINT msg, WPARAM wparam, LRESULT CALLBACK nsws_window_toolbar_callback(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) { + int x,y; bool match = false; struct gui_window *w = window_list; while (w != NULL) { @@ -305,23 +295,46 @@ LRESULT CALLBACK nsws_window_toolbar_callback(HWND hwnd, UINT msg, } } - if ((msg == WM_LBUTTONUP) || - (msg == WM_LBUTTONDOWN) || - (msg == WM_MOUSEMOVE)) { - int x,y; + switch (msg) { + case WM_LBUTTONUP: + case WM_LBUTTONDOWN: + case WM_MOUSEMOVE: x = GET_X_LPARAM(lparam); y = GET_Y_LPARAM(lparam); - if ((w != NULL) && + if ((w != NULL) && (x > w->ntoolbuttons * w->toolbuttondimension)) { if (msg == WM_LBUTTONDOWN) SetFocus(w->urlbar); + return CallWindowProc((WNDPROC) nsws_window_url_callback, w->urlbar, msg, wparam, MAKELONG(x - w->ntoolbuttons * w->toolbuttondimension, y)); } + break; + case WM_SIZE: + /* resize url */ + if (w->urlbar != NULL) { + w->urlbarwidth = LOWORD(lparam) - w->ntoolbuttons * w->toolbuttondimension - 8 - NSWS_THROBBER_WIDTH; + MoveWindow(w->urlbar, + w->toolbuttondimension * w->ntoolbuttons + 2, + 8, + w->urlbarwidth - 8, + w->toolbuttondimension - 12, + true); + } + /* move throbber */ + if (w->throbber != NULL) { + MoveWindow(w->throbber, + LOWORD(lparam) - NSWS_THROBBER_WIDTH - 4, 8, + NSWS_THROBBER_WIDTH, NSWS_THROBBER_WIDTH, + true); + } + + break; } + return CallWindowProc((WNDPROC) toolproc, hwnd, msg, wparam, lparam); } @@ -504,16 +517,16 @@ static void nsws_window_set_ico(struct gui_window *w) */ static void nsws_window_urlbar_create(struct gui_window *w) { - HWND hwnd = CreateWindow("EDIT", - "", + HWND hwnd = CreateWindow("EDIT", + "", WS_CHILD | WS_VISIBLE | ES_AUTOHSCROLL | ES_OEMCONVERT, - w->toolbuttondimension * w->ntoolbuttons + 2, + w->toolbuttondimension * w->ntoolbuttons + 2, 8, - w->urlbarwidth - 8, + w->urlbarwidth - 8, w->toolbuttondimension - 12, - w->main, - (HMENU) NSWS_ID_URLBAR, - hinstance, + w->main, + (HMENU) NSWS_ID_URLBAR, + hinstance, NULL); /*urlproc = (FARPROC) SetWindowLong(hwnd, GWL_WNDPROC, (DWORD) nsws_window_url_callback);*/ @@ -531,9 +544,14 @@ static void nsws_window_throbber_create(struct gui_window *w) hwnd = CreateWindow(ANIMATE_CLASS, "", WS_CHILD | WS_VISIBLE | ACS_TRANSPARENT, - w->width - NSWS_THROBBER_WIDTH - 4, 8, - NSWS_THROBBER_WIDTH, NSWS_THROBBER_WIDTH, w->main, - (HMENU) NSWS_ID_THROBBER, hinstance, NULL); + w->width - NSWS_THROBBER_WIDTH - 4, + 8, + NSWS_THROBBER_WIDTH, + NSWS_THROBBER_WIDTH, + w->main, + (HMENU) NSWS_ID_THROBBER, + hinstance, + NULL); nsws_find_resource(avi, "throbber.avi", "windows/res/throbber.avi"); LOG(("setting throbber avi as %s", avi)); @@ -549,7 +567,7 @@ static void nsws_window_throbber_create(struct gui_window *w) /** * creation of toolbar */ -static void +static void nsws_window_toolbar_create(struct gui_window *w) { unsigned int listid = 0; @@ -565,16 +583,16 @@ nsws_window_toolbar_create(struct gui_window *w) * the arrangements of url bar / buttons although much has * changed since then */ - HWND hwnd = CreateWindow(TOOLBARCLASSNAME, - NULL, + HWND hwnd = CreateWindow(TOOLBARCLASSNAME, + NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | TBSTYLE_FLAT, 0, 0, w->width, w->toolbuttondimension + 8, w->main, (HMENU) NSWS_ID_TOOLBAR, hinstance, NULL); HIMAGELIST hImageList = ImageList_Create(w->toolbuttondimension - 8, - w->toolbuttondimension - 8, - 0, - w->ntoolbuttons, + w->toolbuttondimension - 8, + 0, + w->ntoolbuttons, 0); SendMessage(hwnd, TB_BUTTONSTRUCTSIZE, (WPARAM) sizeof(TBBUTTON), 0); @@ -638,15 +656,15 @@ static void nsws_window_drawingarea_create(struct gui_window *w) { /* potentially make drawingarea window from frameless window + scrollbars here */ - w->drawingarea = CreateWindow(windowclassname_drawable, - NULL, + w->drawingarea = CreateWindow(windowclassname_drawable, + NULL, WS_VISIBLE|WS_CHILD, - 0, - w->toolbuttondimension + 8, - w->width, + 0, + w->toolbuttondimension + 8, + w->width, w->height - (w->toolbuttondimension + 8), - w->main, - NULL, + w->main, + NULL, hinstance, NULL); if (w->drawingarea == NULL) @@ -679,8 +697,8 @@ static LRESULT nsws_drawable_mousemove(struct gui_window *gw, int x, int y) bool ctrl = ((GetKeyState(VK_CONTROL) & 0x8000) == 0x8000); bool alt = ((GetKeyState(VK_MENU) & 0x8000) == 0x8000); - if ((gw == NULL) || - (gw->mouse == NULL) || + if ((gw == NULL) || + (gw->mouse == NULL) || (gw->bw == NULL)) return 0; @@ -716,8 +734,8 @@ static LRESULT nsws_drawable_mousemove(struct gui_window *gw, int x, int y) static LRESULT nsws_drawable_mousedown(struct gui_window *gw, int x, int y, browser_mouse_state button) { - if ((gw == NULL) || - (gw->mouse == NULL) || + if ((gw == NULL) || + (gw->mouse == NULL) || (gw->bw == NULL)) { nsws_localhistory_close(gw); return 0; @@ -741,19 +759,19 @@ static LRESULT nsws_drawable_mousedown(struct gui_window *gw, int x, int y, brow return 0; } -static LRESULT -nsws_drawable_mouseup(struct gui_window *gw, - int x, - int y, - browser_mouse_state press, +static LRESULT +nsws_drawable_mouseup(struct gui_window *gw, + int x, + int y, + browser_mouse_state press, browser_mouse_state click) { bool shift = ((GetKeyState(VK_SHIFT) & 0x8000) == 0x8000); bool ctrl = ((GetKeyState(VK_CONTROL) & 0x8000) == 0x8000); bool alt = ((GetKeyState(VK_MENU) & 0x8000) == 0x8000); - if ((gw == NULL) || - (gw->mouse == NULL) || + if ((gw == NULL) || + (gw->mouse == NULL) || (gw->bw == NULL)) return 0; @@ -771,12 +789,12 @@ nsws_drawable_mouseup(struct gui_window *gw, gw->mouse->state &= ~BROWSER_MOUSE_MOD_3; if ((gw->mouse->state & click) != 0) - browser_window_mouse_click(gw->bw, + browser_window_mouse_click(gw->bw, gw->mouse->state, (x + gw->scrollx) / gw->bw->scale, (y + gw->scrolly) / gw->bw->scale); else - browser_window_mouse_drag_end(gw->bw, + browser_window_mouse_drag_end(gw->bw, 0, (x + gw->scrollx) / gw->bw->scale, (y + gw->scrolly) / gw->bw->scale); @@ -805,6 +823,90 @@ static void nsws_drawable_paint(struct gui_window *gw, HWND hwnd) plot.clip(0, 0, gw->width, gw->height); /* vrs - very suspect */ } +static void nsws_drawable_key(struct gui_window *gw, HWND hwnd, WPARAM wparam) +{ + if (GetFocus() != hwnd) + return; + + uint32_t i; + bool shift = ((GetKeyState(VK_SHIFT) & 0x8000) == 0x8000); + bool capslock = ((GetKeyState(VK_CAPITAL) & 1) == 1); + + switch(wparam) { + case VK_LEFT: + i = KEY_LEFT; + if (shift) + SendMessage(hwnd, WM_HSCROLL, + MAKELONG(SB_LINELEFT, 0), 0); + break; + + case VK_RIGHT: + i = KEY_RIGHT; + if (shift) + SendMessage(hwnd, WM_HSCROLL, + MAKELONG(SB_LINERIGHT, 0), 0); + break; + + case VK_UP: + i = KEY_UP; + if (shift) + SendMessage(hwnd, WM_VSCROLL, + MAKELONG(SB_LINEUP, 0), 0); + break; + + case VK_DOWN: + i = KEY_DOWN; + if (shift) + SendMessage(hwnd, WM_VSCROLL, + MAKELONG(SB_LINEDOWN, 0), 0); + break; + + case VK_HOME: + i = KEY_LINE_START; + if (shift) + SendMessage(hwnd, WM_HSCROLL, + MAKELONG(SB_PAGELEFT, 0), 0); + break; + + case VK_END: + i = KEY_LINE_END; + if (shift) + SendMessage(hwnd, WM_HSCROLL, + MAKELONG(SB_PAGERIGHT, 0), 0); + break; + + case VK_DELETE: + i = KEY_DELETE_RIGHT; + break; + + case VK_NEXT: + i = wparam; + SendMessage(hwnd, WM_VSCROLL, MAKELONG(SB_PAGEDOWN, 0), + 0); + break; + + case VK_PRIOR: + i = wparam; + SendMessage(hwnd, WM_VSCROLL, MAKELONG(SB_PAGEUP, 0), + 0); + break; + + default: + i = wparam; + break; + } + + if ((i >= 'A') && (i <= 'Z') && + (((!capslock) && (!shift)) || + ((capslock) && (shift)))) + i += 'a' - 'A'; + + if (gw != NULL) + browser_window_key_press(gw->bw, i); + +} + + /* Called when activity occours within the drawable window. */ LRESULT CALLBACK nsws_window_drawable_event_callback(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) { @@ -822,32 +924,32 @@ LRESULT CALLBACK nsws_window_drawable_event_callback(HWND hwnd, UINT msg, WPARAM switch(msg) { - case WM_MOUSEMOVE: + case WM_MOUSEMOVE: nsws_drawable_mousemove(gw, - GET_X_LPARAM(lparam), + GET_X_LPARAM(lparam), GET_Y_LPARAM(lparam)); break; - case WM_LBUTTONDOWN: + case WM_LBUTTONDOWN: nsws_drawable_mousedown(gw, - GET_X_LPARAM(lparam), + GET_X_LPARAM(lparam), GET_Y_LPARAM(lparam), BROWSER_MOUSE_PRESS_1); SetFocus(hwnd); nsws_localhistory_close(gw); break; - case WM_RBUTTONDOWN: + case WM_RBUTTONDOWN: nsws_drawable_mousedown(gw, - GET_X_LPARAM(lparam), + GET_X_LPARAM(lparam), GET_Y_LPARAM(lparam), BROWSER_MOUSE_PRESS_2); SetFocus(hwnd); break; - case WM_LBUTTONUP: + case WM_LBUTTONUP: nsws_drawable_mouseup(gw, - GET_X_LPARAM(lparam), + GET_X_LPARAM(lparam), GET_Y_LPARAM(lparam), BROWSER_MOUSE_PRESS_1, BROWSER_MOUSE_CLICK_1); @@ -855,7 +957,7 @@ LRESULT CALLBACK nsws_window_drawable_event_callback(HWND hwnd, UINT msg, WPARAM case WM_RBUTTONUP: nsws_drawable_mouseup(gw, - GET_X_LPARAM(lparam), + GET_X_LPARAM(lparam), GET_Y_LPARAM(lparam), BROWSER_MOUSE_PRESS_2, BROWSER_MOUSE_CLICK_2); @@ -865,75 +967,9 @@ LRESULT CALLBACK nsws_window_drawable_event_callback(HWND hwnd, UINT msg, WPARAM nsws_drawable_paint(gw, hwnd); break; - case WM_KEYDOWN: { - if (GetFocus() != hwnd) - break; - uint32_t i; - bool shift = ((GetKeyState(VK_SHIFT) & 0x8000) == 0x8000); - bool capslock = ((GetKeyState(VK_CAPITAL) & 1) == 1); - switch(wparam) { - case VK_LEFT: - i = KEY_LEFT; - if (shift) - SendMessage(hwnd, WM_HSCROLL, - MAKELONG(SB_LINELEFT, 0), 0); - break; - case VK_RIGHT: - i = KEY_RIGHT; - if (shift) - SendMessage(hwnd, WM_HSCROLL, - MAKELONG(SB_LINERIGHT, 0), 0); - break; - case VK_UP: - i = KEY_UP; - if (shift) - SendMessage(hwnd, WM_VSCROLL, - MAKELONG(SB_LINEUP, 0), 0); - break; - case VK_DOWN: - i = KEY_DOWN; - if (shift) - SendMessage(hwnd, WM_VSCROLL, - MAKELONG(SB_LINEDOWN, 0), 0); - break; - case VK_HOME: - i = KEY_LINE_START; - if (shift) - SendMessage(hwnd, WM_HSCROLL, - MAKELONG(SB_PAGELEFT, 0), 0); - break; - case VK_END: - i = KEY_LINE_END; - if (shift) - SendMessage(hwnd, WM_HSCROLL, - MAKELONG(SB_PAGERIGHT, 0), 0); - break; - case VK_DELETE: - i = KEY_DELETE_RIGHT; - break; - case VK_NEXT: - i = wparam; - SendMessage(hwnd, WM_VSCROLL, MAKELONG(SB_PAGEDOWN, 0), - 0); - break; - case VK_PRIOR: - i = wparam; - SendMessage(hwnd, WM_VSCROLL, MAKELONG(SB_PAGEUP, 0), - 0); - break; - default: - i = wparam; - break; - } - if ((i >= 'A') && (i <= 'Z') && - (((!capslock) && (!shift)) || - ((capslock) && (shift)))) - i += 'a' - 'A'; - if (gw != NULL) - browser_window_key_press(gw->bw, i); + case WM_KEYDOWN: + nsws_drawable_key(gw, hwnd, wparam); break; - } - default: break; } @@ -941,35 +977,58 @@ LRESULT CALLBACK nsws_window_drawable_event_callback(HWND hwnd, UINT msg, WPARAM return DefWindowProc(hwnd, msg, wparam, lparam); } -static void -nsws_window_resize(struct gui_window *w, - HWND hwnd, - WPARAM wparam, +static void +nsws_window_resize(struct gui_window *w, + HWND hwnd, + WPARAM wparam, LPARAM lparam) { - if ((w->toolbar == NULL) || (w->urlbar == NULL) || + if ((w->toolbar == NULL) || + (w->urlbar == NULL) || (w->statusbar == NULL)) return; + int x, y; RECT rmain, rstatus, rtool; GetClientRect(hwnd, &rmain); GetClientRect(w->toolbar, &rtool); GetWindowRect(w->statusbar, &rstatus); gui_window_get_scroll(w, &x, &y); - w->height = HIWORD(lparam) - - (rtool.bottom - rtool.top) - + w->height = HIWORD(lparam) - + (rtool.bottom - rtool.top) - (rstatus.bottom - rstatus.top); w->width = LOWORD(lparam); if (w->drawingarea != NULL) { - MoveWindow(w->drawingarea, 0 ,rtool.bottom, w->width, w->height, true); + MoveWindow(w->drawingarea, + 0, + rtool.bottom, + w->width, + w->height, + true); } if (w->statusbar != NULL) { - MoveWindow(w->statusbar, 0 ,rtool.bottom + w->height, w->width, (rstatus.bottom - rstatus.top+1) , true); + MoveWindow(w->statusbar, + 0, + rtool.bottom + w->height, + w->width, + (rstatus.bottom - rstatus.top + 1), + true); } + nsws_window_update_forward_back(w); + if (w->toolbar != NULL) { + MoveWindow(w->toolbar, + 0, + 0, + w->width, + (rtool.bottom - rtool.top), + true); + } + + /* update double buffering context */ HDC hdc = GetDC(hwnd); if (w->bufferdc == NULL) w->bufferdc = CreateCompatibleDC(hdc); @@ -979,32 +1038,14 @@ nsws_window_resize(struct gui_window *w, SelectObject(w->bufferdc, w->bufferbm); } ReleaseDC(hwnd, hdc); - w->urlbarwidth = w->width - w->ntoolbuttons * - w->toolbuttondimension - 8 - - NSWS_THROBBER_WIDTH; - if (w->bw != NULL) { + /* update browser window to new dimensions */ + if (w->bw != NULL) { browser_window_reformat(w->bw, w->width, w->height); redraw(); } gui_window_set_scroll(w, x, y); - /* re-create toolbar to adjust width of url bar holder */ - DestroyWindow(w->toolbar); - DestroyWindow(w->throbber); - /* memorize url */ - int len = SendMessage(w->urlbar, WM_GETTEXTLENGTH, 0, 0); - char temp[len + 1]; - SendMessage(w->urlbar, WM_GETTEXT, (WPARAM) (len + 1), - (LPARAM) temp); - DestroyWindow(w->urlbar); - nsws_window_toolbar_create(w); - SendMessage(w->urlbar, WM_SETTEXT, 0, (LPARAM) temp); -/* SendMessage(w->toolbar, TB_AUTOSIZE, 0, 0); - */ -// SendMessage(w->statusbar, WM_SIZE, 0, MAKELONG(w->width, 0)); - nsws_window_update_forward_back(w); - if (w->toolbar != NULL) SendMessage(w->toolbar, TB_SETSTATE, (WPARAM) NSWS_ID_NAV_STOP, @@ -2118,7 +2159,7 @@ void gui_window_place_caret(struct gui_window *w, int x, int y, int height) /** * clear window caret */ -void +void gui_window_remove_caret(struct gui_window *w) { if (w == NULL) @@ -2126,31 +2167,31 @@ gui_window_remove_caret(struct gui_window *w) HideCaret(w->drawingarea); } -void +void gui_window_set_icon(struct gui_window *g, struct content *icon) { } -void +void gui_window_set_search_ico(struct content *ico) { } -bool -save_complete_gui_save(const char *path, +bool +save_complete_gui_save(const char *path, const char *filename, - size_t len, - const char *sourcedata, + size_t len, + const char *sourcedata, content_type type) { return false; } -int -save_complete_htmlSaveFileFormat(const char *path, +int +save_complete_htmlSaveFileFormat(const char *path, const char *filename, - xmlDocPtr cur, - const char *encoding, + xmlDocPtr cur, + const char *encoding, int format) { return 0; @@ -2417,7 +2458,7 @@ void gui_init2(int argc, char** argv) void gui_stdout(void) { - /* mwindows compile flag normally invalidates stdout unless + /* mwindows compile flag normally invalidates stdout unless already redirected */ if (_get_osfhandle(fileno(stdout)) == -1) { AllocConsole(); -- cgit v1.2.3