X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=src%2Fscrollbar-msw.c;h=832fcbdbab02590c7d750eeff3f4ec23adb1b103;hb=98f1518a09e923a4f8b14b6a637cc283f02719bd;hp=20eeb9c7901aaf31cbd5bd72e2e05e9285264970;hpb=77dcef404dc78635f6ffa8f71a803d2bc7cc8921;p=chise%2Fxemacs-chise.git- diff --git a/src/scrollbar-msw.c b/src/scrollbar-msw.c index 20eeb9c..832fcbd 100644 --- a/src/scrollbar-msw.c +++ b/src/scrollbar-msw.c @@ -47,14 +47,14 @@ mswindows_create_scrollbar_instance (struct frame *f, int vertical, struct scrollbar_instance *sb) { int orientation; - + sb->scrollbar_data = xnew_and_zero (struct mswindows_scrollbar_data); - + if (vertical) orientation = SBS_VERT; else orientation = SBS_HORZ; - + SCROLLBAR_MSW_HANDLE (sb) = CreateWindowEx(0, "SCROLLBAR", 0, orientation|WS_CHILD, CW_USEDEFAULT, CW_USEDEFAULT, @@ -83,7 +83,7 @@ static void mswindows_free_scrollbar_instance (struct scrollbar_instance *sb) { DestroyWindow (SCROLLBAR_MSW_HANDLE (sb)); - if (sb->scrollbar_data) + if (sb->scrollbar_data) xfree (sb->scrollbar_data); } @@ -146,7 +146,7 @@ mswindows_update_scrollbar_instance_values (struct window *w, UPDATE_POS_FIELD (scrollbar_width); UPDATE_POS_FIELD (scrollbar_height); - if (pos_changed) + if (pos_changed) { MoveWindow(SCROLLBAR_MSW_HANDLE (sb), new_scrollbar_x, new_scrollbar_y, @@ -186,7 +186,7 @@ mswindows_handle_scrollbar_event (HWND hwnd, int code, int pos) f = XFRAME (frame); /* SB_LINEDOWN == SB_CHARLEFT etc. This is the way they will - always be - any Windows is binary compatible backward with + always be - any Windows is binary compatible backward with old programs */ switch (code) @@ -195,12 +195,12 @@ mswindows_handle_scrollbar_event (HWND hwnd, int code, int pos) mswindows_enqueue_misc_user_event (frame, vert ? Qscrollbar_line_down : Qscrollbar_char_right, win); break; - + case SB_LINEUP: mswindows_enqueue_misc_user_event (frame, vert ? Qscrollbar_line_up : Qscrollbar_char_left, win); break; - + case SB_PAGEDOWN: mswindows_enqueue_misc_user_event (win, vert ? Qscrollbar_page_down : Qscrollbar_page_right, @@ -213,7 +213,7 @@ mswindows_handle_scrollbar_event (HWND hwnd, int code, int pos) vert ? Qscrollbar_page_up : Qscrollbar_page_left, vert ? Fcons (win, Qnil) : win); break; - + case SB_BOTTOM: mswindows_enqueue_misc_user_event (frame, vert ? Qscrollbar_to_bottom : Qscrollbar_to_right, win); @@ -265,6 +265,69 @@ mswindows_handle_scrollbar_event (HWND hwnd, int code, int pos) } } +static int +can_scroll(struct scrollbar_instance* scrollbar) +{ + return scrollbar != NULL + && IsWindowVisible (SCROLLBAR_MSW_HANDLE (scrollbar)) + && IsWindowEnabled (SCROLLBAR_MSW_HANDLE (scrollbar)); +} + +int +mswindows_handle_mousewheel_event (Lisp_Object frame, int keys, int delta) +{ + int hasVertBar, hasHorzBar; /* Indicates presence of scroll bars */ + unsigned wheelScrollLines = 0; /* Number of lines per wheel notch */ + + /* Find the currently selected window */ + Lisp_Object win = FRAME_SELECTED_WINDOW (XFRAME (frame)); + struct window* w = XWINDOW (win); + struct window_mirror* mirror = find_window_mirror (w); + + /* Check that there is something to scroll */ + hasVertBar = can_scroll (mirror->scrollbar_vertical_instance); + hasHorzBar = can_scroll (mirror->scrollbar_horizontal_instance); + if (!hasVertBar && !hasHorzBar) + return FALSE; + + /* No support for panning and zooming, so ignore */ + if (keys & (MK_SHIFT | MK_CONTROL)) + return FALSE; + + /* Get the number of lines per wheel delta */ + SystemParametersInfo (SPI_GETWHEELSCROLLLINES, 0, &wheelScrollLines, 0); + + /* Calculate the amount to scroll */ + if (wheelScrollLines == WHEEL_PAGESCROLL) + { + /* Scroll by a page */ + Lisp_Object function; + if (hasVertBar) + function = delta > 0 ? Qscrollbar_page_up : Qscrollbar_page_down; + else + function = delta > 0 ? Qscrollbar_page_left : Qscrollbar_page_right; + mswindows_enqueue_misc_user_event (frame, function, Fcons (win, Qnil)); + } + else /* Scroll by a number of lines */ + { + /* Calc the number of lines to scroll */ + int toScroll = MulDiv (delta, wheelScrollLines, WHEEL_DELTA); + + /* Do the scroll */ + Lisp_Object function; + if (hasVertBar) + function = delta > 0 ? Qscrollbar_line_up : Qscrollbar_line_down; + else + function = delta > 0 ? Qscrollbar_char_left : Qscrollbar_char_right; + if (toScroll < 0) + toScroll = -toScroll; + while (toScroll--) + mswindows_enqueue_misc_user_event (frame, function, win); + } + + return TRUE; +} + #ifdef MEMORY_USAGE_STATS static int