Author: MarkieB
Date: Mon Aug 31 12:42:01 2009
New Revision: 9527
URL:
http://source.netsurf-browser.org?rev=9527&view=rev
Log:
add full handling of mouse events; migrate mouse state struct to core
Modified:
branches/MarkieB/windows/desktop/browser.h
branches/MarkieB/windows/gtk/gtk_window.h
branches/MarkieB/windows/windows/gui.c
Modified: branches/MarkieB/windows/desktop/browser.h
URL:
http://source.netsurf-browser.org/branches/MarkieB/windows/desktop/browse...
==============================================================================
--- branches/MarkieB/windows/desktop/browser.h (original)
+++ branches/MarkieB/windows/desktop/browser.h Mon Aug 31 12:42:01 2009
@@ -211,6 +211,16 @@
BROWSER_MOUSE_MOD_3 = 4096 /* secondary modifier key pressed
* (eg. Alt) */
} browser_mouse_state;
+
+struct browser_mouse {
+ struct gui_window *gui;
+ struct box *box;
+
+ double pressed_x;
+ double pressed_y;
+ bool waiting;
+ browser_mouse_state state;
+};
struct browser_scroll_data {
struct browser_window *bw;
Modified: branches/MarkieB/windows/gtk/gtk_window.h
URL:
http://source.netsurf-browser.org/branches/MarkieB/windows/gtk/gtk_window...
==============================================================================
--- branches/MarkieB/windows/gtk/gtk_window.h (original)
+++ branches/MarkieB/windows/gtk/gtk_window.h Mon Aug 31 12:42:01 2009
@@ -53,16 +53,6 @@
struct gui_window *next, *prev;
};
-struct browser_mouse {
- struct gui_window *gui;
- struct box *box;
-
- gdouble pressed_x;
- gdouble pressed_y;
- gboolean waiting;
- browser_mouse_state state;
-};
-
extern struct gui_window * window_list;
extern int temp_open_background;
Modified: branches/MarkieB/windows/windows/gui.c
URL:
http://source.netsurf-browser.org/branches/MarkieB/windows/windows/gui.c?...
==============================================================================
--- branches/MarkieB/windows/windows/gui.c (original)
+++ branches/MarkieB/windows/windows/gui.c Mon Aug 31 12:42:01 2009
@@ -78,7 +78,7 @@
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;
+ struct browser_window *bw; /** the browser_window */
HWND main; /**< handle to the actual window */
HWND toolbar; /**< toolbar handle */
HWND urlbar; /**< url bar handle */
@@ -101,6 +101,8 @@
bool throbbing; /**< whether currently throbbing */
TBBUTTON buttons[NTOOLBUTTONS + 1]; /* 1 = url bar */
HBITMAP hbmp[NTOOLBUTTONS]; /**< tool button images */
+
+ struct browser_mouse *mouse; /**< mouse state */
HACCEL acceltable; /**< accelerators */
@@ -410,6 +412,16 @@
w->requestscrolly = 0;
w->localhistory = NULL;
+ w->mouse = malloc(sizeof(struct browser_mouse));
+ if (w->mouse == NULL) {
+ free(w);
+ return NULL;
+ }
+ w->mouse->gui = w;
+ w->mouse->state = 0;
+ w->mouse->pressed_x = 0;
+ w->mouse->pressed_y = 0;
+
if (bw != NULL)
switch(bw->browser_window_type) {
case BROWSER_WINDOW_NORMAL:
@@ -540,40 +552,42 @@
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 ((GetKeyState(VK_SHIFT) & 0x8000) == 0x8000)
+ if (shift)
SendMessage(hwnd, WM_HSCROLL,
MAKELONG(SB_LINELEFT, 0), 0);
break;
case VK_RIGHT:
i = KEY_RIGHT;
- if ((GetKeyState(VK_SHIFT) & 0x8000) == 0x8000)
+ if (shift)
SendMessage(hwnd, WM_HSCROLL,
MAKELONG(SB_LINERIGHT, 0), 0);
break;
case VK_UP:
i = KEY_UP;
- if ((GetKeyState(VK_SHIFT) & 0x8000) == 0x8000)
+ if (shift)
SendMessage(hwnd, WM_VSCROLL,
MAKELONG(SB_LINEUP, 0), 0);
break;
case VK_DOWN:
i = KEY_DOWN;
- if ((GetKeyState(VK_SHIFT) & 0x8000) == 0x8000)
+ if (shift)
SendMessage(hwnd, WM_VSCROLL,
MAKELONG(SB_LINEDOWN, 0), 0);
break;
case VK_HOME:
i = KEY_LINE_START;
- if ((GetKeyState(VK_SHIFT) & 0x8000) == 0x8000)
+ if (shift)
SendMessage(hwnd, WM_HSCROLL,
MAKELONG(SB_PAGELEFT, 0), 0);
break;
case VK_END:
i = KEY_LINE_END;
- if ((GetKeyState(VK_SHIFT) & 0x8000) == 0x8000)
+ if (shift)
SendMessage(hwnd, WM_HSCROLL,
MAKELONG(SB_PAGERIGHT, 0), 0);
break;
@@ -595,11 +609,8 @@
break;
}
if ((i >= 'A') && (i <= 'Z') &&
-/* capslock off */ ((((GetKeyState(VK_CAPITAL) & 1) == 0) &&
-/* shift up */ ((GetKeyState(VK_SHIFT) & 0x8000) == 0)) ||
-/* capslock on */ (((GetKeyState(VK_CAPITAL) & 1) == 1)
-/* shift down */ && ((GetKeyState(VK_SHIFT) & 0x8000)
- == 0x8000))))
+ (((!capslock) && (!shift)) ||
+ ((capslock) && (shift))))
i += 'a' - 'A';
if (w != NULL)
browser_window_key_press(w->bw, i);
@@ -607,13 +618,38 @@
}
case WM_MOUSEMOVE: {
int x,y;
+ bool shift = ((GetKeyState(VK_SHIFT) & 0x8000) == 0x8000);
+ bool ctrl = ((GetKeyState(VK_CONTROL) & 0x8000) == 0x8000);
x = GET_X_LPARAM(lparam);
y = GET_Y_LPARAM(lparam);
- if ((w != NULL) && (w->bw != NULL) && (y > w->voffset))
- browser_window_mouse_track(w->bw, 0,
- (x + w->scrollx) / w->bw->scale ,
- (y - w->voffset + w->scrolly) /
- w->bw->scale);
+ if ((w == NULL) || (w->mouse == NULL) || (w->bw == NULL)
+ || (y < w->voffset))
+ return DefWindowProc(hwnd, msg, wparam, lparam);
+
+ if ((w->mouse->state & BROWSER_MOUSE_PRESS_1) != 0) {
+ browser_window_mouse_click(w->bw, BROWSER_MOUSE_DRAG_1,
+ w->mouse->pressed_x,
+ w->mouse->pressed_y);
+ w->mouse->state &= ~BROWSER_MOUSE_PRESS_1;
+ w->mouse->state |= BROWSER_MOUSE_HOLDING_1 |
+ BROWSER_MOUSE_DRAG_ON;
+ }
+ else if ((w->mouse->state & BROWSER_MOUSE_PRESS_2) != 0) {
+ browser_window_mouse_click(w->bw, BROWSER_MOUSE_DRAG_2,
+ w->mouse->pressed_x,
+ w->mouse->pressed_y);
+ w->mouse->state &= ~BROWSER_MOUSE_PRESS_2;
+ w->mouse->state |= BROWSER_MOUSE_HOLDING_2 |
+ BROWSER_MOUSE_DRAG_ON;
+ }
+ if (((w->mouse->state & BROWSER_MOUSE_MOD_1) != 0) && !shift)
+ w->mouse->state &= ~BROWSER_MOUSE_MOD_1;
+ if (((w->mouse->state & BROWSER_MOUSE_MOD_2) != 0) && !ctrl)
+ w->mouse->state &= ~BROWSER_MOUSE_MOD_2;
+
+ browser_window_mouse_track(w->bw, w->mouse->state,
+ (x + w->scrollx) / w->bw->scale,
+ (y - w->voffset + w->scrolly) / w->bw->scale);
return DefWindowProc(hwnd, msg, wparam, lparam);
break;
}
@@ -621,14 +657,25 @@
int x,y;
x = GET_X_LPARAM(lparam);
y = GET_Y_LPARAM(lparam);
- if ((w != NULL) && (w->bw != NULL) && (y > w->voffset)) {
- SetFocus(hwnd);
- browser_window_mouse_click(w->bw,
- BROWSER_MOUSE_PRESS_1,
- (x + w->scrollx) / w->bw->scale ,
- (y - w->voffset + w->scrolly) /
- w->bw->scale);
- }
+ if ((w == NULL) || (w->mouse == NULL) || (w->bw == NULL)
+ || (y < w->voffset)) {
+ nsws_localhistory_close(w);
+ return DefWindowProc(hwnd, msg, wparam, lparam);
+ }
+ w->mouse->state = BROWSER_MOUSE_PRESS_1;
+ if ((GetKeyState(VK_SHIFT) & 0x8000) == 0x8000)
+ w->mouse->state |= BROWSER_MOUSE_MOD_1;
+ if ((GetKeyState(VK_CONTROL) & 0x8000) == 0x8000)
+ w->mouse->state |= BROWSER_MOUSE_MOD_2;
+ w->mouse->pressed_x = (x + w->scrollx) / w->bw->scale;
+ w->mouse->pressed_y = (y - w->voffset + w->scrolly)
+ / w->bw->scale;
+
+ SetFocus(hwnd);
+ browser_window_mouse_click(w->bw, w->mouse->state,
+ (x + w->scrollx) / w->bw->scale ,
+ (y - w->voffset + w->scrolly) /
+ w->bw->scale);
nsws_localhistory_close(w);
return DefWindowProc(hwnd, msg, wparam, lparam);
break;
@@ -637,14 +684,23 @@
int x,y;
x = GET_X_LPARAM(lparam);
y = GET_Y_LPARAM(lparam);
- if ((w != NULL) && (w->bw != NULL) && (y > w->voffset)) {
- SetFocus(hwnd);
- browser_window_mouse_click(w->bw,
- BROWSER_MOUSE_PRESS_2,
- (x + w->scrollx) / w->bw->scale ,
- (y - w->voffset + w->scrolly) /
- w->bw->scale);
- }
+ if ((w == NULL) || (w->mouse == NULL) || (w->bw == NULL) ||
+ (y < w->voffset))
+ return DefWindowProc(hwnd, msg, wparam, lparam);
+
+ w->mouse->state = BROWSER_MOUSE_PRESS_2;
+ if ((GetKeyState(VK_SHIFT) & 0x8000) == 0x8000)
+ w->mouse->state |= BROWSER_MOUSE_MOD_1;
+ if ((GetKeyState(VK_CONTROL) & 0x8000) == 0x8000)
+ w->mouse->state |= BROWSER_MOUSE_MOD_2;
+ w->mouse->pressed_x = (x + w->scrollx) / w->bw->scale;
+ w->mouse->pressed_y = (y - w->voffset + w->scrolly)
+ / w->bw->scale;
+ SetFocus(hwnd);
+ browser_window_mouse_click(w->bw, w->mouse->state,
+ (x + w->scrollx) / w->bw->scale ,
+ (y - w->voffset + w->scrolly) /
+ w->bw->scale);
return DefWindowProc(hwnd, msg, wparam, lparam);
break;
}
@@ -652,12 +708,35 @@
int x,y;
x = GET_X_LPARAM(lparam);
y = GET_Y_LPARAM(lparam);
- if ((w != NULL) && (w->bw != NULL) && (y > w->voffset))
- browser_window_mouse_click(w->bw,
- BROWSER_MOUSE_CLICK_1,
+ if ((w == NULL) || (w->mouse == NULL) || (w->bw == NULL)
+ || (y < w->voffset))
+ return DefWindowProc(hwnd, msg, wparam, lparam);
+
+ bool shift = ((GetKeyState(VK_SHIFT) & 0x8000) == 0x8000);
+ bool ctrl = ((GetKeyState(VK_CONTROL) & 0x8000) == 0x8000);
+
+ if ((w->mouse->state & BROWSER_MOUSE_PRESS_1) != 0) {
+ w->mouse->state &= ~BROWSER_MOUSE_PRESS_1;
+ w->mouse->state |= BROWSER_MOUSE_CLICK_1;
+ }
+
+ if (((w->mouse->state & BROWSER_MOUSE_MOD_1) != 0) && !shift)
+ w->mouse->state &= ~BROWSER_MOUSE_MOD_1;
+ if (((w->mouse->state & BROWSER_MOUSE_MOD_2) != 0) && !ctrl)
+ w->mouse->state &= ~BROWSER_MOUSE_MOD_2;
+
+ if ((w->mouse->state & BROWSER_MOUSE_CLICK_1) != 0)
+ browser_window_mouse_click(w->bw, w->mouse->state,
(x + w->scrollx) / w->bw->scale,
(y - w->voffset + w->scrolly) /
w->bw->scale);
+ else
+ browser_window_mouse_drag_end(w->bw, 0,
+ (x + w->scrollx) / w->bw->scale,
+ (y - w->voffset + w->scrolly) /
+ w->bw->scale);
+
+ w->mouse->state = 0;
return DefWindowProc(hwnd, msg, wparam, lparam);
break;
}
@@ -665,12 +744,34 @@
int x,y;
x = GET_X_LPARAM(lparam);
y = GET_Y_LPARAM(lparam);
- if ((w != NULL) && (w->bw != NULL) && (y > w->voffset))
- browser_window_mouse_click(w->bw,
- BROWSER_MOUSE_CLICK_2,
- (x + w->scrollx)/ w->bw->scale ,
- (y - w->voffset + w->scrolly) /
+ if ((w == NULL) || (w->mouse == NULL) || (w->bw == NULL) ||
+ (y < w->voffset))
+ return DefWindowProc(hwnd, msg, wparam, lparam);
+ bool shift = ((GetKeyState(VK_SHIFT) & 0x8000) == 0x8000);
+ bool ctrl = ((GetKeyState(VK_CONTROL) & 0x8000) == 0x8000);
+
+ if ((w->mouse->state & BROWSER_MOUSE_PRESS_2) != 0) {
+ w->mouse->state &= ~BROWSER_MOUSE_PRESS_2;
+ w->mouse->state |= BROWSER_MOUSE_CLICK_2;
+ }
+
+ if (((w->mouse->state & BROWSER_MOUSE_MOD_1) != 0) && !shift)
+ w->mouse->state &= ~BROWSER_MOUSE_MOD_1;
+ if (((w->mouse->state & BROWSER_MOUSE_MOD_2) != 0) && !ctrl)
+ w->mouse->state &= ~BROWSER_MOUSE_MOD_2;
+
+ if ((w->mouse->state & BROWSER_MOUSE_CLICK_2) != 0)
+ browser_window_mouse_click(w->bw, w->mouse->state,
+ (x + w->scrollx) / w->bw->scale,
+ (y - w->voffset + w->scrolly) /
w->bw->scale);
+ else
+ browser_window_mouse_drag_end(w->bw, 0,
+ (x + w->scrollx) / w->bw->scale,
+ (y - w->voffset + w->scrolly) /
+ w->bw->scale);
+
+ w->mouse->state = 0;
return DefWindowProc(hwnd, msg, wparam, lparam);
break;
}