# HG changeset patch # User Juanma Barranquero # Date 1053990065 0 # Node ID a35e5665c7427a04e1550f50b499d4458101a3cb # Parent 730bcd34a440b63a02f611637b6b7de49030f634 (construct_mouse_wheel): Result is a MOUSE_CLICK_EVENT. Scrolling down/up the mouse wheel is respectively mapped to mouse button 4 and 5. (w32_read_socket): Map w32 WM_MOUSEWHEEL events to Emacs MOUSE_CLICK_EVENT events. Forward w32 MSH_MOUSEWHEEL events as WM_MOUSEWHEEL events. diff -r 730bcd34a440 -r a35e5665c742 src/w32term.c --- a/src/w32term.c Mon May 26 22:55:45 2003 +0000 +++ b/src/w32term.c Mon May 26 23:01:05 2003 +0000 @@ -495,7 +495,7 @@ struct frame *f = XFRAME (WINDOW_FRAME (w)); RECT r; HDC hdc; - + r.left = x; r.right = x + 1; r.top = y0; @@ -2911,8 +2911,8 @@ struct frame *f; { POINT p; - result->kind = MOUSE_WHEEL_EVENT; - result->code = (short) HIWORD (msg->msg.wParam); + result->kind = MOUSE_CLICK_EVENT; + result->code = (GET_WHEEL_DELTA_WPARAM (msg->msg.wParam) < 0) ? 4 : 3; result->timestamp = msg->msg.time; result->modifiers = msg->dwModifiers; p.x = LOWORD (msg->msg.lParam); @@ -3111,7 +3111,7 @@ /* x is to the right of the last glyph in the row. */ rect->left = WINDOW_TO_FRAME_PIXEL_X (w, gx); - /* Shouldn't this be a pixel value? + /* Shouldn't this be a pixel value? WINDOW_RIGHT_EDGE_X (w) seems to be the right value. ++KFS */ rect->right = WINDOW_RIGHT_EDGE_COL (w); @@ -4382,25 +4382,90 @@ break; } - case WM_MOUSEWHEEL: - if (dpyinfo->grabbed && last_mouse_frame - && FRAME_LIVE_P (last_mouse_frame)) - f = last_mouse_frame; - else - f = x_window_to_frame (dpyinfo, msg.msg.hwnd); - - if (f) - { - if ((!dpyinfo->w32_focus_frame - || f == dpyinfo->w32_focus_frame) - && (numchars >= 1)) - { - construct_mouse_wheel (bufp, &msg, f); - bufp++; - count++; - numchars--; - } - } + case WM_MOUSEWHEEL: + { + /* Convert each Windows mouse wheel event in a couple of + Emacs mouse click down/up events. Scrolling the wheel up + is associated to mouse button 4 and scrolling the wheel + down to the mouse button 5. */ + int button; + int up; + + up = msg.dwModifiers & up_modifier; + + if (dpyinfo->grabbed && last_mouse_frame + && FRAME_LIVE_P (last_mouse_frame)) + f = last_mouse_frame; + else + f = x_window_to_frame (dpyinfo, msg.msg.hwnd); + + if (f) + { + Lisp_Object window; + POINT p; + int x, y; + + p.x = LOWORD (msg.msg.lParam); + p.y = HIWORD (msg.msg.lParam); + ScreenToClient (msg.msg.hwnd, &p); + x = XFASTINT (p.x); + y = XFASTINT (p.y); + + window = window_from_coordinates (f, x, y, 0, 0, 0, 0); + + /* Ignore mouse wheel events not in a window. */ + if (!WINDOWP(window)) + break; + + if ((!dpyinfo->w32_focus_frame + || f == dpyinfo->w32_focus_frame) + && (numchars >= 1)) + { + if ( !up ) + { + /* Emit an Emacs mouse down message. */ + msg.dwModifiers |= down_modifier; + construct_mouse_wheel (bufp, &msg, f); + bufp++; + count++; + numchars--; + + /* Push a simulated WM_MOUSEWHEEL up message. */ + msg.dwModifiers &= ~down_modifier; + msg.dwModifiers |= up_modifier; + prepend_msg (&msg); + } + else + { + /* Emit an Emacs mouse up message. */ + construct_mouse_wheel (bufp, &msg, f); + bufp++; + count++; + numchars--; + } + } + } + + button = ( GET_WHEEL_DELTA_WPARAM (msg.msg.wParam) < 0 )? 4 : 3; + + if (up) + { + dpyinfo->grabbed &= ~ (1 << button); + } + else + { + dpyinfo->grabbed |= (1 << button); + last_mouse_frame = f; + /* Ignore any mouse motion that happened + before this event; any subsequent mouse-movement + Emacs events should reflect only motion after + the ButtonPress. */ + if (f != 0) + f->mouse_moved = 0; + + last_tool_bar_item = -1; + } + } break; case WM_DROPFILES: @@ -4624,12 +4689,12 @@ case WM_SETFOCUS: /* TODO: Port this change: 2002-06-28 Jan D. - * xterm.h (struct x_output): Add focus_state. - * xterm.c (x_focus_changed): New function. + * xterm.h (struct x_output): Add focus_state. + * xterm.c (x_focus_changed): New function. (x_detect_focus_change): New function. (XTread_socket): Call x_detect_focus_change for FocusIn/FocusOut EnterNotify and LeaveNotify to track X focus changes. - */ + */ f = x_any_window_to_frame (dpyinfo, msg.msg.hwnd); dpyinfo->w32_focus_event_frame = f; @@ -4791,65 +4856,65 @@ Lisp_Object tail, frame; FOR_EACH_FRAME (tail, frame) - { - FRAME_PTR f = XFRAME (frame); - /* The tooltip has been drawn already. Avoid the - SET_FRAME_GARBAGED below. */ - if (EQ (frame, tip_frame)) - continue; - - /* Check "visible" frames and mark each as obscured or not. - Note that async_visible is nonzero for unobscured and - obscured frames, but zero for hidden and iconified frames. */ - if (FRAME_W32_P (f) && f->async_visible) - { - RECT clipbox; - HDC hdc; - - enter_crit (); - /* Query clipping rectangle for the entire window area - (GetWindowDC), not just the client portion (GetDC). - Otherwise, the scrollbars and menubar aren't counted as - part of the visible area of the frame, and we may think - the frame is obscured when really a scrollbar is still - visible and gets WM_PAINT messages above. */ - hdc = GetWindowDC (FRAME_W32_WINDOW (f)); - GetClipBox (hdc, &clipbox); - ReleaseDC (FRAME_W32_WINDOW (f), hdc); - leave_crit (); - - if (clipbox.right == clipbox.left - || clipbox.bottom == clipbox.top) - { - /* Frame has become completely obscured so mark as - such (we do this by setting async_visible to 2 so - that FRAME_VISIBLE_P is still true, but redisplay - will skip it). */ - f->async_visible = 2; - - if (!FRAME_OBSCURED_P (f)) - { - DebPrint (("frame %p (%s) obscured\n", f, - SDATA (f->name))); - } - } - else - { - /* Frame is not obscured, so mark it as such. */ - f->async_visible = 1; - - if (FRAME_OBSCURED_P (f)) - { - SET_FRAME_GARBAGED (f); - DebPrint (("obscured frame %p (%s) found to be visible\n", f, - SDATA (f->name))); - - /* Force a redisplay sooner or later. */ - record_asynch_buffer_change (); - } - } - } - } + { + FRAME_PTR f = XFRAME (frame); + /* The tooltip has been drawn already. Avoid the + SET_FRAME_GARBAGED below. */ + if (EQ (frame, tip_frame)) + continue; + + /* Check "visible" frames and mark each as obscured or not. + Note that async_visible is nonzero for unobscured and + obscured frames, but zero for hidden and iconified frames. */ + if (FRAME_W32_P (f) && f->async_visible) + { + RECT clipbox; + HDC hdc; + + enter_crit (); + /* Query clipping rectangle for the entire window area + (GetWindowDC), not just the client portion (GetDC). + Otherwise, the scrollbars and menubar aren't counted as + part of the visible area of the frame, and we may think + the frame is obscured when really a scrollbar is still + visible and gets WM_PAINT messages above. */ + hdc = GetWindowDC (FRAME_W32_WINDOW (f)); + GetClipBox (hdc, &clipbox); + ReleaseDC (FRAME_W32_WINDOW (f), hdc); + leave_crit (); + + if (clipbox.right == clipbox.left + || clipbox.bottom == clipbox.top) + { + /* Frame has become completely obscured so mark as + such (we do this by setting async_visible to 2 so + that FRAME_VISIBLE_P is still true, but redisplay + will skip it). */ + f->async_visible = 2; + + if (!FRAME_OBSCURED_P (f)) + { + DebPrint (("frame %p (%s) obscured\n", f, + SDATA (f->name))); + } + } + else + { + /* Frame is not obscured, so mark it as such. */ + f->async_visible = 1; + + if (FRAME_OBSCURED_P (f)) + { + SET_FRAME_GARBAGED (f); + DebPrint (("obscured frame %p (%s) found to be visible\n", f, + SDATA (f->name))); + + /* Force a redisplay sooner or later. */ + record_asynch_buffer_change (); + } + } + } + } } UNBLOCK_INPUT; @@ -6223,12 +6288,12 @@ unsigned char *bits = fringe_bitmaps[i].bits; for (j = 0; j < h; j++) { - static unsigned char swap_nibble[16] + static unsigned char swap_nibble[16] = { 0x0, 0x8, 0x4, 0xc, /* 0000 1000 0100 1100 */ 0x2, 0xa, 0x6, 0xe, /* 0010 1010 0110 1110 */ 0x1, 0x9, 0x5, 0xd, /* 0001 1001 0101 1101 */ 0x3, 0xb, 0x7, 0xf }; /* 0011 1011 0111 1111 */ - + unsigned char b = *bits++; *wb++ = (unsigned short)((swap_nibble[b & 0xf]<<4) | (swap_nibble[(b>>4) & 0xf]));