Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit d947ff4

Browse files
committed
Construct events with kwargs in macosx.
1 parent 33a0599 commit d947ff4

File tree

1 file changed

+63
-28
lines changed

1 file changed

+63
-28
lines changed

src/_macosx.m

Lines changed: 63 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -254,19 +254,30 @@ static void gil_call_method(PyObject* obj, const char* name)
254254
PyGILState_Release(gstate);
255255
}
256256

257-
#define PROCESS_EVENT(cls_name, fmt, ...) \
258-
{ \
259-
PyGILState_STATE gstate = PyGILState_Ensure(); \
260-
PyObject* module = NULL, * event = NULL, * result = NULL; \
261-
if (!(module = PyImport_ImportModule("matplotlib.backend_bases")) \
262-
|| !(event = PyObject_CallMethod(module, cls_name, fmt, __VA_ARGS__)) \
263-
|| !(result = PyObject_CallMethod(event, "_process", ""))) { \
264-
PyErr_Print(); \
265-
} \
266-
Py_XDECREF(module); \
267-
Py_XDECREF(event); \
268-
Py_XDECREF(result); \
269-
PyGILState_Release(gstate); \
257+
void process_event(char const* cls_name, char const* fmt, ...)
258+
{
259+
PyGILState_STATE gstate = PyGILState_Ensure();
260+
PyObject* module = NULL, * cls = NULL,
261+
* args = NULL, * kwargs = NULL,
262+
* event = NULL, * result = NULL;
263+
va_list argp;
264+
va_start(argp, fmt);
265+
if (!(module = PyImport_ImportModule("matplotlib.backend_bases"))
266+
|| !(cls = PyObject_GetAttrString(module, cls_name))
267+
|| !(args = PyTuple_New(0))
268+
|| !(kwargs = Py_VaBuildValue(fmt, argp))
269+
|| !(event = PyObject_Call(cls, args, kwargs))
270+
|| !(result = PyObject_CallMethod(event, "_process", ""))) {
271+
PyErr_Print();
272+
}
273+
va_end(argp);
274+
Py_XDECREF(module);
275+
Py_XDECREF(cls);
276+
Py_XDECREF(args);
277+
Py_XDECREF(kwargs);
278+
Py_XDECREF(event);
279+
Py_XDECREF(result);
280+
PyGILState_Release(gstate);
270281
}
271282

272283
static bool backend_inited = false;
@@ -1352,7 +1363,9 @@ - (void)windowDidResize: (NSNotification*)notification
13521363

13531364
- (void)windowWillClose:(NSNotification*)notification
13541365
{
1355-
PROCESS_EVENT("CloseEvent", "sO", "close_event", canvas);
1366+
process_event(
1367+
"CloseEvent", "{s:s, s:O}",
1368+
"name", "close_event", "canvas", canvas);
13561369
}
13571370

13581371
- (BOOL)windowShouldClose:(NSNotification*)notification
@@ -1383,7 +1396,9 @@ - (void)mouseEntered:(NSEvent *)event
13831396
location = [self convertPoint: location fromView: nil];
13841397
x = location.x * device_scale;
13851398
y = location.y * device_scale;
1386-
PROCESS_EVENT("LocationEvent", "sOii", "figure_enter_event", canvas, x, y);
1399+
process_event(
1400+
"LocationEvent", "{s:s, s:O, s:i, s:i}",
1401+
"name", "figure_enter_event", "canvas", canvas, "x", x, "y", y);
13871402
}
13881403

13891404
- (void)mouseExited:(NSEvent *)event
@@ -1393,7 +1408,9 @@ - (void)mouseExited:(NSEvent *)event
13931408
location = [self convertPoint: location fromView: nil];
13941409
x = location.x * device_scale;
13951410
y = location.y * device_scale;
1396-
PROCESS_EVENT("LocationEvent", "sOii", "figure_leave_event", canvas, x, y);
1411+
process_event(
1412+
"LocationEvent", "{s:s, s:O, s:i, s:i}",
1413+
"name", "figure_leave_event", "canvas", canvas, "x", x, "y", y);
13971414
}
13981415

13991416
- (void)mouseDown:(NSEvent *)event
@@ -1429,8 +1446,10 @@ - (void)mouseDown:(NSEvent *)event
14291446
if ([event clickCount] == 2) {
14301447
dblclick = 1;
14311448
}
1432-
PROCESS_EVENT("MouseEvent", "sOiiiOii", "button_press_event", canvas,
1433-
x, y, num, Py_None /* key */, 0 /* step */, dblclick);
1449+
process_event(
1450+
"MouseEvent", "{s:s, s:O, s:i, s:i, s:i, s:i}",
1451+
"name", "button_press_event", "canvas", canvas, "x", x, "y", y,
1452+
"num", num, "dblclick", dblclick);
14341453
}
14351454

14361455
- (void)mouseUp:(NSEvent *)event
@@ -1451,8 +1470,10 @@ - (void)mouseUp:(NSEvent *)event
14511470
case NSEventTypeRightMouseUp: num = 3; break;
14521471
default: return; /* Unknown mouse event */
14531472
}
1454-
PROCESS_EVENT("MouseEvent", "sOiii", "button_release_event", canvas,
1455-
x, y, num);
1473+
process_event(
1474+
"MouseEvent", "{s:s, s:O, s:i, s:i, s:i}",
1475+
"name", "button_release_event", "canvas", canvas, "x", x, "y", y,
1476+
"num", num);
14561477
}
14571478

14581479
- (void)mouseMoved:(NSEvent *)event
@@ -1462,7 +1483,9 @@ - (void)mouseMoved:(NSEvent *)event
14621483
location = [self convertPoint: location fromView: nil];
14631484
x = location.x * device_scale;
14641485
y = location.y * device_scale;
1465-
PROCESS_EVENT("MouseEvent", "sOii", "motion_notify_event", canvas, x, y);
1486+
process_event(
1487+
"MouseEvent", "{s:s, s:O, s:i, s:i}",
1488+
"name", "motion_notify_event", "canvas", canvas, "x", x, "y", y);
14661489
}
14671490

14681491
- (void)mouseDragged:(NSEvent *)event
@@ -1472,7 +1495,9 @@ - (void)mouseDragged:(NSEvent *)event
14721495
location = [self convertPoint: location fromView: nil];
14731496
x = location.x * device_scale;
14741497
y = location.y * device_scale;
1475-
PROCESS_EVENT("MouseEvent", "sOii", "motion_notify_event", canvas, x, y);
1498+
process_event(
1499+
"MouseEvent", "{s:s, s:O, s:i, s:i}",
1500+
"name", "motion_notify_event", "canvas", canvas, "x", x, "y", y);
14761501
}
14771502

14781503
- (void)rightMouseDown:(NSEvent *)event { [self mouseDown: event]; }
@@ -1589,9 +1614,13 @@ - (void)keyDown:(NSEvent*)event
15891614
int x = location.x * device_scale,
15901615
y = location.y * device_scale;
15911616
if (s) {
1592-
PROCESS_EVENT("KeyEvent", "sOsii", "key_press_event", canvas, s, x, y);
1617+
process_event(
1618+
"KeyEvent", "{s:s, s:O, s:s, s:i, s:i}",
1619+
"name", "key_press_event", "canvas", canvas, "key", s, "x", x, "y", y);
15931620
} else {
1594-
PROCESS_EVENT("KeyEvent", "sOOii", "key_press_event", canvas, Py_None, x, y);
1621+
process_event(
1622+
"KeyEvent", "{s:s, s:O, s:O, s:i, s:i}",
1623+
"name", "key_press_event", "canvas", canvas, "key", Py_None, "x", x, "y", y);
15951624
}
15961625
}
15971626

@@ -1603,9 +1632,13 @@ - (void)keyUp:(NSEvent*)event
16031632
int x = location.x * device_scale,
16041633
y = location.y * device_scale;
16051634
if (s) {
1606-
PROCESS_EVENT("KeyEvent", "sOsii", "key_release_event", canvas, s, x, y);
1635+
process_event(
1636+
"KeyEvent", "{s:s, s:O, s:s, s:i, s:i}",
1637+
"name", "key_release_event", "canvas", canvas, "key", s, "x", x, "y", y);
16071638
} else {
1608-
PROCESS_EVENT("KeyEvent", "sOOii", "key_release_event", canvas, Py_None, x, y);
1639+
process_event(
1640+
"KeyEvent", "{s:s, s:O, s:O, s:i, s:i}",
1641+
"name", "key_release_event", "canvas", canvas, "key", Py_None, "x", x, "y", y);
16091642
}
16101643
}
16111644

@@ -1620,8 +1653,10 @@ - (void)scrollWheel:(NSEvent*)event
16201653
NSPoint point = [self convertPoint: location fromView: nil];
16211654
int x = (int)round(point.x * device_scale);
16221655
int y = (int)round(point.y * device_scale - 1);
1623-
PROCESS_EVENT("MouseEvent", "sOiiOOi", "scroll_event", canvas,
1624-
x, y, Py_None /* button */, Py_None /* key */, step);
1656+
process_event(
1657+
"MouseEvent", "{s:s, s:O, s:i, s:i, s:i}",
1658+
"name", "scroll_event", "canvas", canvas,
1659+
"x", x, "y", y, "step", step);
16251660
}
16261661

16271662
- (BOOL)acceptsFirstResponder

0 commit comments

Comments
 (0)