diff --git a/Apps/Explorer/desk_server.vp b/Apps/Explorer/desk_server.vp index dee693e..500ad33 100644 --- a/Apps/Explorer/desk_server.vp +++ b/Apps/Explorer/desk_server.vp @@ -1827,6 +1827,11 @@ class DeskServer: viperlib.snprintf(&_mb, 128, "[explorer] mouse pkt n=%d btn=%d\n", mn, int(mp[0])) devfs.serial_puts(&_mb) moved: int = 0 + wheel: int = 0 + if mn >= 10: + wv: int = int(mp[9]) + if wv >= 128: wv = wv - 256 + wheel = wheel + wv if mn >= 9: moved = self._move_cursor(int(*(int32*(uint64(&mp) + uint64(1)))), int(*(int32*(uint64(&mp) + uint64(5))))) @@ -1848,7 +1853,19 @@ class DeskServer: bi: int = int(mp[0]) & 1 if bi != 0 and cur == 0: saw_press = 1 cur = bi + if mn >= 10: + wv2: int = int(mp[9]) + if wv2 >= 128: wv2 = wv2 - 256 + wheel = wheel + wv2 mn = fs.read(self.mfd, &mp, uint32(16)) + if wheel != 0: + # 滚轮:投给光标下那个窗口(窗口内坐标),由控件决定滚动行为。 + hw: int = self.hit_test(self.cx, self.cy) + if hw >= 0: + hs: desk.WinSlot* = self.slot(hw) + self.push_event(hw, uint32(desk.DESK_EVT_MOUSE), + desk.DESK_MOUSE_WHEEL, + self.cx - hs.ux, self.cy - hs.uy - TITLE_H - TITLE_GAP, wheel) if moved != 0: self._mark_cursor_at(self.pcy) self._mark_cursor_at(self.cy) diff --git a/vpsdk/desk.vp b/vpsdk/desk.vp index c69e1df..959c757 100644 --- a/vpsdk/desk.vp +++ b/vpsdk/desk.vp @@ -65,6 +65,7 @@ define DESK_EVT_RESIZE = 105 # a=w b=h define DESK_MOUSE_PRESS = 1 define DESK_MOUSE_RELEASE = 2 define DESK_MOUSE_HOVER = 3 +define DESK_MOUSE_WHEEL = 4 # d = 滚轮增量(有符号) @__attribute__(packed) diff --git a/vpsdk/vpui.vp b/vpsdk/vpui.vp index e3d48c6..11884ca 100644 --- a/vpsdk/vpui.vp +++ b/vpsdk/vpui.vp @@ -1294,6 +1294,19 @@ virtual class Text(Widget): tk2: Tk* = self.tk tk2.focused_widget = None return 1 + elif etype == window.EVENT_TYPE_WHEEL: + if self.contains(ex, ey): + w: int = int(evt.button) + if w >= 128: w = w - 256 + vis: int = self._visible_lines() + self.scroll_offset = self.scroll_offset - w * 3 + max_off: int = self.line_count + 1 - vis + if max_off < 0: max_off = 0 + if self.scroll_offset < 0: self.scroll_offset = 0 + if self.scroll_offset > max_off: self.scroll_offset = max_off + self._update_scrollbar() + return 1 + return 0 elif etype == window.EVENT_TYPE_KEY: if self.focused: ebtn2: uint8 = evt.button diff --git a/vpsdk/window.vp b/vpsdk/window.vp index 057acff..d83c857 100644 --- a/vpsdk/window.vp +++ b/vpsdk/window.vp @@ -20,6 +20,7 @@ define EVENT_TYPE_KEY = 5 define EVENT_TYPE_KEY_RELEASE = 6 define EVENT_TYPE_PING = 7 define EVENT_TYPE_RESIZE = 8 +define EVENT_TYPE_WHEEL = 9 define KEY_STATE_PRESS = 1 define KEY_STATE_RELEASE = 2 @@ -229,6 +230,8 @@ def poll_event(evt: InputEvent*) -> int: evt.type = uint32(EVENT_TYPE_CLICK) elif kind == desk.DESK_MOUSE_RELEASE: evt.type = uint32(EVENT_TYPE_RELEASE) + elif kind == desk.DESK_MOUSE_WHEEL: + evt.type = uint32(EVENT_TYPE_WHEEL) else: evt.type = uint32(EVENT_TYPE_HOVER) evt.x = _evt.b # 窗口内坐标