summaryrefslogtreecommitdiffstats
path: root/macosx/tkMacOSXMouseEvent.c
diff options
context:
space:
mode:
authordas <das>2006-04-28 06:02:47 (GMT)
committerdas <das>2006-04-28 06:02:47 (GMT)
commit37574f162488e058bcba4d8378c94a18716b7af1 (patch)
treedbf40a74ecf59b8ccec931d28b36eb0dfdafb1a1 /macosx/tkMacOSXMouseEvent.c
parentc5df89036d559ebb962065ca285fa46f6828db56 (diff)
downloadtk-37574f162488e058bcba4d8378c94a18716b7af1.zip
tk-37574f162488e058bcba4d8378c94a18716b7af1.tar.gz
tk-37574f162488e058bcba4d8378c94a18716b7af1.tar.bz2
* macosx/tkMacOSXWm.c (TkWmMapWindow, InitialWindowBounds): fix use of
potentially stale window position in initial configure event on first map of a window. [Bug 1476443] (TkMacOSXWindowOffset): use modern GetWindowStructureWidths API. * macosx/tkMacOSXInt.h: * macosx/tkMacOSXMouseEvent.c (TkGenerateButtonEventForXPointer): new internal function to generate button events for current pointer directly, without requiring prior call to XQueryPointer(). * macosx/tkMacOSXMouseEvent.c (XQueryPointer): implement return of window-local pointer position. * macosx/tkMacOSXInt.h: use improvements above to avoid calls to * macosx/tkMacOSXKeyEvent.c: GlobalToLocal() when the current port might * macosx/tkMacOSXMenu.c: not be set correctly. May fix [Bug 1243318] * macosx/tkMacOSXMenus.c: * macosx/tkMacOSXScale.c: * macosx/tkMacOSXScrlbr.c: * tkAboutDlg.r: update copyright. * macosx/tkMacOSXDebug.h: sync #includes with core-8-4-branch. * macosx/tkMacOSXEvent.h: * macosx/tkMacOSXFont.h:
Diffstat (limited to 'macosx/tkMacOSXMouseEvent.c')
-rw-r--r--macosx/tkMacOSXMouseEvent.c113
1 files changed, 98 insertions, 15 deletions
diff --git a/macosx/tkMacOSXMouseEvent.c b/macosx/tkMacOSXMouseEvent.c
index 51b33dc..6326ec5 100644
--- a/macosx/tkMacOSXMouseEvent.c
+++ b/macosx/tkMacOSXMouseEvent.c
@@ -5,7 +5,7 @@
* on MacOS X.
*
* Copyright 2001, Apple Computer, Inc.
- * Copyright (c) 2005 Daniel A. Steffen <das@users.sourceforge.net>
+ * Copyright (c) 2005-2006 Daniel A. Steffen <das@users.sourceforge.net>
*
* See the file "license.terms" for information on usage and redistribution of
* this file, and for a DISCLAIMER OF ALL WARRANTIES.
@@ -54,7 +54,7 @@
* software in accordance with the terms specified in this
* license.
*
- * RCS: @(#) $Id: tkMacOSXMouseEvent.c,v 1.21 2006/04/11 05:42:01 das Exp $
+ * RCS: @(#) $Id: tkMacOSXMouseEvent.c,v 1.22 2006/04/28 06:02:49 das Exp $
*/
#include "tkMacOSXInt.h"
@@ -775,24 +775,69 @@ XQueryPointer(
int* win_y_return,
unsigned int* mask_return)
{
- if (root_x_return && root_y_return) {
- Point where;
- EventRef ev;
+ int getGlobal = (root_x_return && root_y_return);
+ int getLocal = (win_x_return && win_y_return);
+
+ if (getGlobal || getLocal) {
+ Point where, local;
OSStatus status;
+ int gotMouseLoc = 0;
+ EventRef ev = GetCurrentEvent();
- if ((ev = GetCurrentEvent())) {
+ if (ev && getLocal) {
status = GetEventParameter(ev,
- kEventParamMouseLocation,
+ kEventParamWindowMouseLocation,
typeQDPoint, NULL,
- sizeof(where), NULL,
- &where);
+ sizeof(Point), NULL,
+ &local);
+ gotMouseLoc = (status == noErr);
}
- if (!ev || status != noErr) {
- GetGlobalMouse(&where);
+ if (getGlobal || !gotMouseLoc) {
+ if (ev) {
+ status = GetEventParameter(ev,
+ kEventParamMouseLocation,
+ typeQDPoint, NULL,
+ sizeof(Point), NULL,
+ &where);
+ }
+ if (!ev || status != noErr) {
+ GetGlobalMouse(&where);
+ }
+ }
+ if (getLocal) {
+ WindowRef whichWin;
+ if (ev) {
+ status = GetEventParameter(ev,
+ kEventParamWindowRef,
+ typeWindowRef, NULL,
+ sizeof(WindowRef), NULL,
+ &whichWin);
+ }
+ if (!ev || status != noErr) {
+ FindWindow(where, &whichWin);
+ }
+ if (gotMouseLoc) {
+ if (whichWin) {
+ Rect widths;
+ GetWindowStructureWidths(whichWin, &widths);
+ local.h -= widths.left;
+ local.v -= widths.top;
+ }
+ } else {
+ local = where;
+ if (whichWin) {
+ QDGlobalToLocalPoint(GetWindowPort(whichWin), &local);
+ }
+ }
+ }
+ if (getGlobal) {
+ *root_x_return = where.h;
+ *root_y_return = where.v;
+ }
+ if (getLocal) {
+ *win_x_return = local.h;
+ *win_y_return = local.v;
}
-
- *root_x_return = where.h;
- *root_y_return = where.v;
}
if (mask_return) {
*mask_return = TkMacOSXButtonKeyState();
@@ -803,6 +848,44 @@ XQueryPointer(
/*
*----------------------------------------------------------------------
*
+ * TkGenerateButtonEventForXPointer --
+ *
+ * This procedure generates an X button event for the current
+ * pointer state as reported by XQueryPointer().
+ *
+ * Results:
+ * True if event(s) are generated - false otherwise.
+ *
+ * Side effects:
+ * Additional events may be place on the Tk event queue.
+ * Grab state may also change.
+ *
+ *----------------------------------------------------------------------
+ */
+
+MODULE_SCOPE int
+TkGenerateButtonEventForXPointer(
+ Window window) /* X Window containing button event. */
+{
+ MouseEventData med;
+ int global_x, global_y, local_x, local_y;
+
+ bzero(&med, sizeof(MouseEventData));
+ XQueryPointer(NULL, None, NULL, NULL, &global_x, &global_y,
+ &local_x, &local_y, &med.state);
+ med.global.h = global_x;
+ med.global.v = global_y;
+ med.local.h = local_x;
+ med.local.v = local_y;
+ med.window = window;
+ med.activeNonFloating = ActiveNonFloatingWindow();
+
+ return GenerateButtonEvent(&med);
+}
+
+/*
+ *----------------------------------------------------------------------
+ *
* TkGenerateButtonEvent --
*
* Given a global x & y position and the button key status this
@@ -859,7 +942,7 @@ TkGenerateButtonEvent(
*----------------------------------------------------------------------
*/
-static int
+static int
GenerateButtonEvent(MouseEventData * medPtr)
{
Tk_Window tkwin;