From c97f485feb8a8de6050fa13f72a5a808cc6f05d0 Mon Sep 17 00:00:00 2001 From: das Date: Tue, 13 Dec 2005 03:44:41 +0000 Subject: * library/demos/cscroll.tcl: add MouseWheel bindings for aqua. * macosx/tkMacOSXCarbonEvents.c (TkMacOSXInitCarbonEvents): * macosx/tkMacOSXMouseEvent.c (TkMacOSXProcessMouseEvent, GenerateMouseWheelEvent): add support for kEventMouseScroll events (smooth mouse wheel scrolling from mighty mouse or scrolling trackpad) by handling kEventMouseWheelMoved on application target as well as on dispatcher, in order to pick up synthesized MouseWheel events from HIObject handler (c.f. QA1453); add support for horizontal scrolling events by generating MouseWheel XEvent with Shift modifier. --- ChangeLog | 15 ++++++++++++++- library/demos/cscroll.tcl | 16 +++++++++++++++- macosx/tkMacOSXCarbonEvents.c | 4 +++- macosx/tkMacOSXMouseEvent.c | 42 +++++++++++++++++++++++++++--------------- 4 files changed, 59 insertions(+), 18 deletions(-) diff --git a/ChangeLog b/ChangeLog index 674a860..f181a42 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,16 @@ +2005-12-13 Daniel Steffen + + * library/demos/cscroll.tcl: add MouseWheel bindings for aqua. + + * macosx/tkMacOSXCarbonEvents.c (TkMacOSXInitCarbonEvents): + * macosx/tkMacOSXMouseEvent.c (TkMacOSXProcessMouseEvent, + GenerateMouseWheelEvent): add support for kEventMouseScroll events + (smooth mouse wheel scrolling from mighty mouse or scrolling trackpad) + by handling kEventMouseWheelMoved on application target as well as on + dispatcher, in order to pick up synthesized MouseWheel events from + HIObject handler (c.f. QA1453); add support for horizontal scrolling + events by generating MouseWheel XEvent with Shift modifier. + 2005-12-12 Jeff Hobbs * unix/tcl.m4, unix/configure: Fix sh quoting error reported in @@ -10,7 +23,7 @@ * macosx/tkMacOSXInit.c: only remaining tcl internals in TkAqua are * macosx/tkMacOSXNotify.c: TclServiceIdle() in tkMacOSXScrlbr.c and * macosx/tkMacOSXScrlbr.c: Tcl_Get/SetStartupScript() in tkMacOSXInit.c - [Bug 1336531]. + [RFE 1336531]. * macosx/tkMacOSXInt.h: * macosx/tkMacOSXWindowEvent.c: * macosx/tkMacOSXXStubs.c: sync comments/whitespace with HEAD. diff --git a/library/demos/cscroll.tcl b/library/demos/cscroll.tcl index 8aad050..1a01417 100644 --- a/library/demos/cscroll.tcl +++ b/library/demos/cscroll.tcl @@ -3,7 +3,7 @@ # This demonstration script creates a simple canvas that can be # scrolled in two dimensions. # -# RCS: @(#) $Id: cscroll.tcl,v 1.3 2001/06/14 10:56:58 dkf Exp $ +# RCS: @(#) $Id: cscroll.tcl,v 1.3.4.1 2005/12/13 03:44:42 das Exp $ if {![info exists widgetDemo]} { error "This script should be run from the \"widget\" demo." @@ -60,6 +60,20 @@ $c bind all "scrollLeave $c" $c bind all <1> "scrollButton $c" bind $c <2> "$c scan mark %x %y" bind $c "$c scan dragto %x %y" +if {[tk windowingsystem] eq "aqua"} { + bind $c { + %W yview scroll [expr {- (%D)}] units + } + bind $c { + %W yview scroll [expr {-10 * (%D)}] units + } + bind $c { + %W xview scroll [expr {- (%D)}] units + } + bind $c { + %W xview scroll [expr {-10 * (%D)}] units + } +} proc scrollEnter canvas { global oldFill diff --git a/macosx/tkMacOSXCarbonEvents.c b/macosx/tkMacOSXCarbonEvents.c index fbab4a8..45be898 100644 --- a/macosx/tkMacOSXCarbonEvents.c +++ b/macosx/tkMacOSXCarbonEvents.c @@ -60,7 +60,7 @@ * software in accordance with the terms specified in this * license. * - * RCS: @(#) $Id: tkMacOSXCarbonEvents.c,v 1.3.2.7 2005/12/01 02:15:46 das Exp $ + * RCS: @(#) $Id: tkMacOSXCarbonEvents.c,v 1.3.2.8 2005/12/13 03:44:42 das Exp $ */ #include "tkInt.h" @@ -193,6 +193,7 @@ TkMacOSXInitCarbonEvents ( {kEventClassMenu, kEventMenuBeginTracking}, {kEventClassMenu, kEventMenuEndTracking}, {kEventClassCommand, kEventCommandProcess}, + {kEventClassMouse, kEventMouseWheelMoved}, {kEventClassWindow, kEventWindowExpanded}, {kEventClassApplication, kEventAppHidden}, {kEventClassApplication, kEventAppShown}, @@ -231,6 +232,7 @@ TkMacOSXInitCarbonEvents ( _TraceEventByName(CFSTR("kEventMouseDown")); _TraceEventByName(CFSTR("kEventMouseUp")); _TraceEventByName(CFSTR("kEventMouseWheelMoved")); + _TraceEventByName(CFSTR("kEventMouseScroll")); _TraceEventByName(CFSTR("kEventWindowUpdate")); _TraceEventByName(CFSTR("kEventWindowActivated")); _TraceEventByName(CFSTR("kEventWindowDeactivated")); diff --git a/macosx/tkMacOSXMouseEvent.c b/macosx/tkMacOSXMouseEvent.c index ef1f9be..9375118 100644 --- a/macosx/tkMacOSXMouseEvent.c +++ b/macosx/tkMacOSXMouseEvent.c @@ -54,7 +54,7 @@ * software in accordance with the terms specified in this * license. * - * RCS: @(#) $Id: tkMacOSXMouseEvent.c,v 1.6.2.9 2005/11/27 02:36:46 das Exp $ + * RCS: @(#) $Id: tkMacOSXMouseEvent.c,v 1.6.2.10 2005/12/13 03:44:42 das Exp $ */ #include "tkInt.h" @@ -128,7 +128,7 @@ TkMacOSXProcessMouseEvent(TkMacOSXEvent *eventPtr, MacEventStatus * statusPtr) Point where, where2; int xOffset, yOffset, result; TkDisplay * dispPtr; - OSStatus status; + OSStatus status; MouseEventData mouseEventData, * medPtr = &mouseEventData; switch (eventPtr->eKind) { @@ -208,17 +208,24 @@ TkMacOSXProcessMouseEvent(TkMacOSXEvent *eventPtr, MacEventStatus * statusPtr) } if (eventPtr->eKind == kEventMouseWheelMoved) { status = GetEventParameter(eventPtr->eventRef, - kEventParamMouseWheelDelta, - typeLongInteger, NULL, + kEventParamMouseWheelDelta, typeLongInteger, NULL, sizeof(long), NULL, &medPtr->delta); if (status != noErr ) { #ifdef TK_MAC_DEBUG - fprintf (stderr, - "Failed to retrieve mouse wheel delta, %d\n", (int) status); + fprintf (stderr, + "Failed to retrieve mouse wheel delta, %d\n", (int) status); #endif - statusPtr->err = 1; - return false; - } + statusPtr->err = 1; + return false; + } else { + EventMouseWheelAxis axis; + status = GetEventParameter(eventPtr->eventRef, + kEventParamMouseWheelAxis, typeMouseWheelAxis, NULL, + sizeof(EventMouseWheelAxis), NULL, &axis); + if (status == noErr && axis == kEventMouseWheelAxisX) { + medPtr->state |= ShiftMask; + } + } } dispPtr = TkGetDisplayList(); @@ -226,11 +233,15 @@ TkMacOSXProcessMouseEvent(TkMacOSXEvent *eventPtr, MacEventStatus * statusPtr) if (eventPtr->eKind != kEventMouseDown) { /* - * MouseMoved, MouseDragged or kEventMouseWheelMoved + * MouseMoved, MouseDragged or MouseWheelMoved */ if (eventPtr->eKind == kEventMouseWheelMoved) { - return GenerateMouseWheelEvent(medPtr); + int res = GenerateMouseWheelEvent(medPtr); + if (res) { + statusPtr->stopProcessing = 1; + } + return res; } else { return GeneratePollingEvents(medPtr); } @@ -534,7 +545,6 @@ static int GenerateMouseWheelEvent(MouseEventData * medPtr) { Tk_Window tkwin, rootwin, grabWin; - int local_x, local_y; TkDisplay *dispPtr; TkWindow *winPtr; XEvent xEvent; @@ -550,7 +560,7 @@ GenerateMouseWheelEvent(MouseEventData * medPtr) } else { tkwin = Tk_TopCoordsToWindow(rootwin, medPtr->local.h, medPtr->local.v, - &local_x, &local_y); + &xEvent.xbutton.x, &xEvent.xbutton.y); } } @@ -565,12 +575,14 @@ GenerateMouseWheelEvent(MouseEventData * medPtr) tkwin = grabWin; } if (!tkwin) { - return true; + return false; } winPtr = (TkWindow *) tkwin; xEvent.type = MouseWheelEvent; xEvent.xkey.keycode = medPtr->delta; - xEvent.xbutton.state = TkMacOSXButtonKeyState(); + xEvent.xbutton.x_root = medPtr->global.h; + xEvent.xbutton.y_root = medPtr->global.v; + xEvent.xbutton.state = medPtr->state; xEvent.xany.serial = LastKnownRequestProcessed(winPtr->display); xEvent.xany.send_event = false; xEvent.xany.display = winPtr->display; -- cgit v0.12