Files
cpython-source-deps/macosx/tkMacOSXTest.c
2020-09-24 22:55:34 +01:00

231 lines
5.5 KiB
C
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*
* tkMacOSXTest.c --
*
* Contains commands for platform specific tests for
* the Macintosh platform.
*
* Copyright (c) 1996 Sun Microsystems, Inc.
* Copyright 2001-2009, Apple Inc.
* Copyright (c) 2005-2009 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.
*/
#include "tkMacOSXPrivate.h"
#include "tkMacOSXConstants.h"
/*
* Forward declarations of procedures defined later in this file:
*/
#if MAC_OS_X_VERSION_MAX_ALLOWED < 1080
static int DebuggerObjCmd (ClientData dummy, Tcl_Interp *interp,
int objc, Tcl_Obj *const objv[]);
#endif
static int PressButtonObjCmd (ClientData dummy, Tcl_Interp *interp,
int objc, Tcl_Obj *const objv[]);
/*
*----------------------------------------------------------------------
*
* TkplatformtestInit --
*
* Defines commands that test platform specific functionality for
* Unix platforms.
*
* Results:
* A standard Tcl result.
*
* Side effects:
* Defines new commands.
*
*----------------------------------------------------------------------
*/
int
TkplatformtestInit(
Tcl_Interp *interp) /* Interpreter to add commands to. */
{
/*
* Add commands for platform specific tests on MacOS here.
*/
#if MAC_OS_X_VERSION_MAX_ALLOWED < 1080
Tcl_CreateObjCommand(interp, "debugger", DebuggerObjCmd, NULL, NULL);
#endif
Tcl_CreateObjCommand(interp, "pressbutton", PressButtonObjCmd, NULL, NULL);
return TCL_OK;
}
/*
*----------------------------------------------------------------------
*
* DebuggerObjCmd --
*
* This procedure simply calls the low level debugger, which was
* deprecated in OSX 10.8.
*
* Results:
* A standard Tcl result.
*
* Side effects:
* None.
*
*----------------------------------------------------------------------
*/
#if MAC_OS_X_VERSION_MAX_ALLOWED < 1080
static int
DebuggerObjCmd(
ClientData clientData, /* Not used. */
Tcl_Interp *interp, /* Not used. */
int objc, /* Not used. */
Tcl_Obj *const objv[]) /* Not used. */
{
Debugger();
return TCL_OK;
}
#endif
/*
*----------------------------------------------------------------------
*
* TkTestLogDisplay --
*
* The test image display procedure calls this to determine whether it
* should write a log message recording that it has being run. On OSX
* 10.14 and later, only calls to the display procedure which occur inside
* of the drawRect method should be logged, since those are the only ones
* which actually draw anything. On earlier systems the opposite is true.
* The calls from within the drawRect method are redundant, since the
* first time the display procedure is run it will do the drawing and that
* first call will usually not occur inside of drawRect.
*
* Results:
* On OSX 10.14 and later, returns true if and only if called from
* within [NSView drawRect]. On earlier systems returns false if
* and only if called from with [NSView drawRect].
*
* Side effects:
* None
*
*----------------------------------------------------------------------
*/
MODULE_SCOPE Bool
TkTestLogDisplay(void) {
if ([NSApp macMinorVersion] >= 14) {
return [NSApp isDrawing];
} else {
return ![NSApp isDrawing];
}
}
/*
*----------------------------------------------------------------------
*
* PressButtonObjCmd --
*
* This Tcl command simulates a button press at a specific screen
* location. It injects NSEvents into the NSApplication event queue,
* as opposed to adding events to the Tcl queue as event generate
* would do. One application is for testing the grab command.
*
* Results:
* A standard Tcl result.
*
* Side effects:
* None.
*
*----------------------------------------------------------------------
*/
/* ARGSUSED */
static int
PressButtonObjCmd(
ClientData clientData,
Tcl_Interp *interp,
int objc,
Tcl_Obj *const objv[])
{
int x, y, i, value, wNum;
CGPoint pt;
NSPoint loc;
NSEvent *motion, *press, *release;
NSArray *screens = [NSScreen screens];
CGFloat ScreenHeight = 0;
enum {X=1, Y};
if (screens && [screens count]) {
ScreenHeight = [[screens objectAtIndex:0] frame].size.height;
}
if (objc != 3) {
Tcl_WrongNumArgs(interp, 1, objv, "x y");
return TCL_ERROR;
}
for (i = 1; i < objc; i++) {
if (Tcl_GetIntFromObj(interp,objv[i],&value) != TCL_OK) {
return TCL_ERROR;
}
switch (i) {
case X:
x = value;
break;
case Y:
y = value;
break;
default:
break;
}
}
pt.x = loc.x = x;
pt.y = y;
loc.y = ScreenHeight - y;
wNum = 0;
CGWarpMouseCursorPosition(pt);
motion = [NSEvent mouseEventWithType:NSMouseMoved
location:loc
modifierFlags:0
timestamp:GetCurrentEventTime()
windowNumber:wNum
context:nil
eventNumber:0
clickCount:1
pressure:0.0];
[NSApp postEvent:motion atStart:NO];
press = [NSEvent mouseEventWithType:NSLeftMouseDown
location:loc
modifierFlags:0
timestamp:GetCurrentEventTime()
windowNumber:wNum
context:nil
eventNumber:1
clickCount:1
pressure:0.0];
[NSApp postEvent:press atStart:NO];
release = [NSEvent mouseEventWithType:NSLeftMouseUp
location:loc
modifierFlags:0
timestamp:GetCurrentEventTime()
windowNumber:wNum
context:nil
eventNumber:2
clickCount:1
pressure:0.0];
[NSApp postEvent:release atStart:NO];
return TCL_OK;
}
/*
* Local Variables:
* mode: objc
* c-basic-offset: 4
* fill-column: 79
* coding: utf-8
* End:
*/