1 2 /* ========================== Module _Drag ========================== */ 3 4 #include "Python.h" 5 #include "pymactoolbox.h" 6 7 #if APPLE_SUPPORTS_QUICKTIME 8 9 /* Macro to test whether a weak-loaded CFM function exists */ 10 #define PyMac_PRECHECK(rtn) do { if ( &rtn == NULL ) {\ 11 PyErr_SetString(PyExc_NotImplementedError, \ 12 "Not available in this shared library/OS version"); \ 13 return NULL; \ 14 }} while(0) 15 16 17 #include <Carbon/Carbon.h> 18 19 /* Callback glue routines */ 20 DragTrackingHandlerUPP dragglue_TrackingHandlerUPP; 21 DragReceiveHandlerUPP dragglue_ReceiveHandlerUPP; 22 DragSendDataUPP dragglue_SendDataUPP; 23 #if 0 24 DragInputUPP dragglue_InputUPP; 25 DragDrawingUPP dragglue_DrawingUPP; 26 #endif 27 28 #ifdef USE_TOOLBOX_OBJECT_GLUE 29 extern PyObject *_DragObj_New(DragRef); 30 extern int _DragObj_Convert(PyObject *, DragRef *); 31 32 #define DragObj_New _DragObj_New 33 #define DragObj_Convert _DragObj_Convert 34 #endif 35 36 static PyObject *Drag_Error; 37 38 /* ---------------------- Object type DragObj ----------------------- */ 39 40 PyTypeObject DragObj_Type; 41 42 #define DragObj_Check(x) ((x)->ob_type == &DragObj_Type || PyObject_TypeCheck((x), &DragObj_Type)) 43 44 typedef struct DragObjObject { 45 PyObject_HEAD 46 DragRef ob_itself; 47 PyObject *sendproc; 48 } DragObjObject; 49 50 PyObject *DragObj_New(DragRef itself) 51 { 52 DragObjObject *it; 53 if (itself == NULL) { 54 PyErr_SetString(Drag_Error,"Cannot create null Drag"); 55 return NULL; 56 } 57 it = PyObject_NEW(DragObjObject, &DragObj_Type); 58 if (it == NULL) return NULL; 59 it->ob_itself = itself; 60 it->sendproc = NULL; 61 return (PyObject *)it; 62 } 63 64 int DragObj_Convert(PyObject *v, DragRef *p_itself) 65 { 66 if (!DragObj_Check(v)) 67 { 68 PyErr_SetString(PyExc_TypeError, "DragObj required"); 69 return 0; 70 } 71 *p_itself = ((DragObjObject *)v)->ob_itself; 72 return 1; 73 } 74 75 static void DragObj_dealloc(DragObjObject *self) 76 { 77 Py_XDECREF(self->sendproc); 78 self->ob_type->tp_free((PyObject *)self); 79 } 80 81 static PyObject *DragObj_DisposeDrag(DragObjObject *_self, PyObject *_args) 82 { 83 PyObject *_res = NULL; 84 OSErr _err; 85 #ifndef DisposeDrag 86 PyMac_PRECHECK(DisposeDrag); 87 #endif 88 if (!PyArg_ParseTuple(_args, "")) 89 return NULL; 90 _err = DisposeDrag(_self->ob_itself); 91 if (_err != noErr) return PyMac_Error(_err); 92 Py_INCREF(Py_None); 93 _res = Py_None; 94 return _res; 95 } 96 97 static PyObject *DragObj_AddDragItemFlavor(DragObjObject *_self, PyObject *_args) 98 { 99 PyObject *_res = NULL; 100 OSErr _err; 101 ItemReference theItemRef; 102 FlavorType theType; 103 char *dataPtr__in__; 104 long dataPtr__len__; 105 int dataPtr__in_len__; 106 FlavorFlags theFlags; 107 #ifndef AddDragItemFlavor 108 PyMac_PRECHECK(AddDragItemFlavor); 109 #endif 110 if (!PyArg_ParseTuple(_args, "lO&z#l", 111 &theItemRef, 112 PyMac_GetOSType, &theType, 113 &dataPtr__in__, &dataPtr__in_len__, 114 &theFlags)) 115 return NULL; 116 dataPtr__len__ = dataPtr__in_len__; 117 _err = AddDragItemFlavor(_self->ob_itself, 118 theItemRef, 119 theType, 120 dataPtr__in__, dataPtr__len__, 121 theFlags); 122 if (_err != noErr) return PyMac_Error(_err); 123 Py_INCREF(Py_None); 124 _res = Py_None; 125 return _res; 126 } 127 128 static PyObject *DragObj_SetDragItemFlavorData(DragObjObject *_self, PyObject *_args) 129 { 130 PyObject *_res = NULL; 131 OSErr _err; 132 ItemReference theItemRef; 133 FlavorType theType; 134 char *dataPtr__in__; 135 long dataPtr__len__; 136 int dataPtr__in_len__; 137 UInt32 dataOffset; 138 #ifndef SetDragItemFlavorData 139 PyMac_PRECHECK(SetDragItemFlavorData); 140 #endif 141 if (!PyArg_ParseTuple(_args, "lO&z#l", 142 &theItemRef, 143 PyMac_GetOSType, &theType, 144 &dataPtr__in__, &dataPtr__in_len__, 145 &dataOffset)) 146 return NULL; 147 dataPtr__len__ = dataPtr__in_len__; 148 _err = SetDragItemFlavorData(_self->ob_itself, 149 theItemRef, 150 theType, 151 dataPtr__in__, dataPtr__len__, 152 dataOffset); 153 if (_err != noErr) return PyMac_Error(_err); 154 Py_INCREF(Py_None); 155 _res = Py_None; 156 return _res; 157 } 158 159 static PyObject *DragObj_SetDragImage(DragObjObject *_self, PyObject *_args) 160 { 161 PyObject *_res = NULL; 162 OSErr _err; 163 PixMapHandle imagePixMap; 164 RgnHandle imageRgn; 165 Point imageOffsetPt; 166 DragImageFlags theImageFlags; 167 #ifndef SetDragImage 168 PyMac_PRECHECK(SetDragImage); 169 #endif 170 if (!PyArg_ParseTuple(_args, "O&O&O&l", 171 ResObj_Convert, &imagePixMap, 172 ResObj_Convert, &imageRgn, 173 PyMac_GetPoint, &imageOffsetPt, 174 &theImageFlags)) 175 return NULL; 176 _err = SetDragImage(_self->ob_itself, 177 imagePixMap, 178 imageRgn, 179 imageOffsetPt, 180 theImageFlags); 181 if (_err != noErr) return PyMac_Error(_err); 182 Py_INCREF(Py_None); 183 _res = Py_None; 184 return _res; 185 } 186 187 static PyObject *DragObj_ChangeDragBehaviors(DragObjObject *_self, PyObject *_args) 188 { 189 PyObject *_res = NULL; 190 OSErr _err; 191 DragBehaviors inBehaviorsToSet; 192 DragBehaviors inBehaviorsToClear; 193 #ifndef ChangeDragBehaviors 194 PyMac_PRECHECK(ChangeDragBehaviors); 195 #endif 196 if (!PyArg_ParseTuple(_args, "ll", 197 &inBehaviorsToSet, 198 &inBehaviorsToClear)) 199 return NULL; 200 _err = ChangeDragBehaviors(_self->ob_itself, 201 inBehaviorsToSet, 202 inBehaviorsToClear); 203 if (_err != noErr) return PyMac_Error(_err); 204 Py_INCREF(Py_None); 205 _res = Py_None; 206 return _res; 207 } 208 209 static PyObject *DragObj_TrackDrag(DragObjObject *_self, PyObject *_args) 210 { 211 PyObject *_res = NULL; 212 OSErr _err; 213 EventRecord theEvent; 214 RgnHandle theRegion; 215 #ifndef TrackDrag 216 PyMac_PRECHECK(TrackDrag); 217 #endif 218 if (!PyArg_ParseTuple(_args, "O&O&", 219 PyMac_GetEventRecord, &theEvent, 220 ResObj_Convert, &theRegion)) 221 return NULL; 222 _err = TrackDrag(_self->ob_itself, 223 &theEvent, 224 theRegion); 225 if (_err != noErr) return PyMac_Error(_err); 226 Py_INCREF(Py_None); 227 _res = Py_None; 228 return _res; 229 } 230 231 static PyObject *DragObj_CountDragItems(DragObjObject *_self, PyObject *_args) 232 { 233 PyObject *_res = NULL; 234 OSErr _err; 235 UInt16 numItems; 236 #ifndef CountDragItems 237 PyMac_PRECHECK(CountDragItems); 238 #endif 239 if (!PyArg_ParseTuple(_args, "")) 240 return NULL; 241 _err = CountDragItems(_self->ob_itself, 242 &numItems); 243 if (_err != noErr) return PyMac_Error(_err); 244 _res = Py_BuildValue("H", 245 numItems); 246 return _res; 247 } 248 249 static PyObject *DragObj_GetDragItemReferenceNumber(DragObjObject *_self, PyObject *_args) 250 { 251 PyObject *_res = NULL; 252 OSErr _err; 253 UInt16 index; 254 ItemReference theItemRef; 255 #ifndef GetDragItemReferenceNumber 256 PyMac_PRECHECK(GetDragItemReferenceNumber); 257 #endif 258 if (!PyArg_ParseTuple(_args, "H", 259 &index)) 260 return NULL; 261 _err = GetDragItemReferenceNumber(_self->ob_itself, 262 index, 263 &theItemRef); 264 if (_err != noErr) return PyMac_Error(_err); 265 _res = Py_BuildValue("l", 266 theItemRef); 267 return _res; 268 } 269 270 static PyObject *DragObj_CountDragItemFlavors(DragObjObject *_self, PyObject *_args) 271 { 272 PyObject *_res = NULL; 273 OSErr _err; 274 ItemReference theItemRef; 275 UInt16 numFlavors; 276 #ifndef CountDragItemFlavors 277 PyMac_PRECHECK(CountDragItemFlavors); 278 #endif 279 if (!PyArg_ParseTuple(_args, "l", 280 &theItemRef)) 281 return NULL; 282 _err = CountDragItemFlavors(_self->ob_itself, 283 theItemRef, 284 &numFlavors); 285 if (_err != noErr) return PyMac_Error(_err); 286 _res = Py_BuildValue("H", 287 numFlavors); 288 return _res; 289 } 290 291 static PyObject *DragObj_GetFlavorType(DragObjObject *_self, PyObject *_args) 292 { 293 PyObject *_res = NULL; 294 OSErr _err; 295 ItemReference theItemRef; 296 UInt16 index; 297 FlavorType theType; 298 #ifndef GetFlavorType 299 PyMac_PRECHECK(GetFlavorType); 300 #endif 301 if (!PyArg_ParseTuple(_args, "lH", 302 &theItemRef, 303 &index)) 304 return NULL; 305 _err = GetFlavorType(_self->ob_itself, 306 theItemRef, 307 index, 308 &theType); 309 if (_err != noErr) return PyMac_Error(_err); 310 _res = Py_BuildValue("O&", 311 PyMac_BuildOSType, theType); 312 return _res; 313 } 314 315 static PyObject *DragObj_GetFlavorFlags(DragObjObject *_self, PyObject *_args) 316 { 317 PyObject *_res = NULL; 318 OSErr _err; 319 ItemReference theItemRef; 320 FlavorType theType; 321 FlavorFlags theFlags; 322 #ifndef GetFlavorFlags 323 PyMac_PRECHECK(GetFlavorFlags); 324 #endif 325 if (!PyArg_ParseTuple(_args, "lO&", 326 &theItemRef, 327 PyMac_GetOSType, &theType)) 328 return NULL; 329 _err = GetFlavorFlags(_self->ob_itself, 330 theItemRef, 331 theType, 332 &theFlags); 333 if (_err != noErr) return PyMac_Error(_err); 334 _res = Py_BuildValue("l", 335 theFlags); 336 return _res; 337 } 338 339 static PyObject *DragObj_GetFlavorDataSize(DragObjObject *_self, PyObject *_args) 340 { 341 PyObject *_res = NULL; 342 OSErr _err; 343 ItemReference theItemRef; 344 FlavorType theType; 345 Size dataSize; 346 #ifndef GetFlavorDataSize 347 PyMac_PRECHECK(GetFlavorDataSize); 348 #endif 349 if (!PyArg_ParseTuple(_args, "lO&", 350 &theItemRef, 351 PyMac_GetOSType, &theType)) 352 return NULL; 353 _err = GetFlavorDataSize(_self->ob_itself, 354 theItemRef, 355 theType, 356 &dataSize); 357 if (_err != noErr) return PyMac_Error(_err); 358 _res = Py_BuildValue("l", 359 dataSize); 360 return _res; 361 } 362 363 static PyObject *DragObj_GetFlavorData(DragObjObject *_self, PyObject *_args) 364 { 365 PyObject *_res = NULL; 366 OSErr _err; 367 ItemReference theItemRef; 368 FlavorType theType; 369 char *dataPtr__out__; 370 long dataPtr__len__; 371 int dataPtr__in_len__; 372 UInt32 dataOffset; 373 #ifndef GetFlavorData 374 PyMac_PRECHECK(GetFlavorData); 375 #endif 376 if (!PyArg_ParseTuple(_args, "lO&il", 377 &theItemRef, 378 PyMac_GetOSType, &theType, 379 &dataPtr__in_len__, 380 &dataOffset)) 381 return NULL; 382 if ((dataPtr__out__ = malloc(dataPtr__in_len__)) == NULL) 383 { 384 PyErr_NoMemory(); 385 goto dataPtr__error__; 386 } 387 dataPtr__len__ = dataPtr__in_len__; 388 _err = GetFlavorData(_self->ob_itself, 389 theItemRef, 390 theType, 391 dataPtr__out__, &dataPtr__len__, 392 dataOffset); 393 if (_err != noErr) return PyMac_Error(_err); 394 _res = Py_BuildValue("s#", 395 dataPtr__out__, (int)dataPtr__len__); 396 free(dataPtr__out__); 397 dataPtr__error__: ; 398 return _res; 399 } 400 401 static PyObject *DragObj_GetDragItemBounds(DragObjObject *_self, PyObject *_args) 402 { 403 PyObject *_res = NULL; 404 OSErr _err; 405 ItemReference theItemRef; 406 Rect itemBounds; 407 #ifndef GetDragItemBounds 408 PyMac_PRECHECK(GetDragItemBounds); 409 #endif 410 if (!PyArg_ParseTuple(_args, "l", 411 &theItemRef)) 412 return NULL; 413 _err = GetDragItemBounds(_self->ob_itself, 414 theItemRef, 415 &itemBounds); 416 if (_err != noErr) return PyMac_Error(_err); 417 _res = Py_BuildValue("O&", 418 PyMac_BuildRect, &itemBounds); 419 return _res; 420 } 421 422 static PyObject *DragObj_SetDragItemBounds(DragObjObject *_self, PyObject *_args) 423 { 424 PyObject *_res = NULL; 425 OSErr _err; 426 ItemReference theItemRef; 427 Rect itemBounds; 428 #ifndef SetDragItemBounds 429 PyMac_PRECHECK(SetDragItemBounds); 430 #endif 431 if (!PyArg_ParseTuple(_args, "lO&", 432 &theItemRef, 433 PyMac_GetRect, &itemBounds)) 434 return NULL; 435 _err = SetDragItemBounds(_self->ob_itself, 436 theItemRef, 437 &itemBounds); 438 if (_err != noErr) return PyMac_Error(_err); 439 Py_INCREF(Py_None); 440 _res = Py_None; 441 return _res; 442 } 443 444 static PyObject *DragObj_GetDropLocation(DragObjObject *_self, PyObject *_args) 445 { 446 PyObject *_res = NULL; 447 OSErr _err; 448 AEDesc dropLocation; 449 #ifndef GetDropLocation 450 PyMac_PRECHECK(GetDropLocation); 451 #endif 452 if (!PyArg_ParseTuple(_args, "")) 453 return NULL; 454 _err = GetDropLocation(_self->ob_itself, 455 &dropLocation); 456 if (_err != noErr) return PyMac_Error(_err); 457 _res = Py_BuildValue("O&", 458 AEDesc_New, &dropLocation); 459 return _res; 460 } 461 462 static PyObject *DragObj_SetDropLocation(DragObjObject *_self, PyObject *_args) 463 { 464 PyObject *_res = NULL; 465 OSErr _err; 466 AEDesc dropLocation; 467 #ifndef SetDropLocation 468 PyMac_PRECHECK(SetDropLocation); 469 #endif 470 if (!PyArg_ParseTuple(_args, "O&", 471 AEDesc_Convert, &dropLocation)) 472 return NULL; 473 _err = SetDropLocation(_self->ob_itself, 474 &dropLocation); 475 if (_err != noErr) return PyMac_Error(_err); 476 Py_INCREF(Py_None); 477 _res = Py_None; 478 return _res; 479 } 480 481 static PyObject *DragObj_GetDragAttributes(DragObjObject *_self, PyObject *_args) 482 { 483 PyObject *_res = NULL; 484 OSErr _err; 485 DragAttributes flags; 486 #ifndef GetDragAttributes 487 PyMac_PRECHECK(GetDragAttributes); 488 #endif 489 if (!PyArg_ParseTuple(_args, "")) 490 return NULL; 491 _err = GetDragAttributes(_self->ob_itself, 492 &flags); 493 if (_err != noErr) return PyMac_Error(_err); 494 _res = Py_BuildValue("l", 495 flags); 496 return _res; 497 } 498 499 static PyObject *DragObj_GetDragMouse(DragObjObject *_self, PyObject *_args) 500 { 501 PyObject *_res = NULL; 502 OSErr _err; 503 Point mouse; 504 Point globalPinnedMouse; 505 #ifndef GetDragMouse 506 PyMac_PRECHECK(GetDragMouse); 507 #endif 508 if (!PyArg_ParseTuple(_args, "")) 509 return NULL; 510 _err = GetDragMouse(_self->ob_itself, 511 &mouse, 512 &globalPinnedMouse); 513 if (_err != noErr) return PyMac_Error(_err); 514 _res = Py_BuildValue("O&O&", 515 PyMac_BuildPoint, mouse, 516 PyMac_BuildPoint, globalPinnedMouse); 517 return _res; 518 } 519 520 static PyObject *DragObj_SetDragMouse(DragObjObject *_self, PyObject *_args) 521 { 522 PyObject *_res = NULL; 523 OSErr _err; 524 Point globalPinnedMouse; 525 #ifndef SetDragMouse 526 PyMac_PRECHECK(SetDragMouse); 527 #endif 528 if (!PyArg_ParseTuple(_args, "O&", 529 PyMac_GetPoint, &globalPinnedMouse)) 530 return NULL; 531 _err = SetDragMouse(_self->ob_itself, 532 globalPinnedMouse); 533 if (_err != noErr) return PyMac_Error(_err); 534 Py_INCREF(Py_None); 535 _res = Py_None; 536 return _res; 537 } 538 539 static PyObject *DragObj_GetDragOrigin(DragObjObject *_self, PyObject *_args) 540 { 541 PyObject *_res = NULL; 542 OSErr _err; 543 Point globalInitialMouse; 544 #ifndef GetDragOrigin 545 PyMac_PRECHECK(GetDragOrigin); 546 #endif 547 if (!PyArg_ParseTuple(_args, "")) 548 return NULL; 549 _err = GetDragOrigin(_self->ob_itself, 550 &globalInitialMouse); 551 if (_err != noErr) return PyMac_Error(_err); 552 _res = Py_BuildValue("O&", 553 PyMac_BuildPoint, globalInitialMouse); 554 return _res; 555 } 556 557 static PyObject *DragObj_GetDragModifiers(DragObjObject *_self, PyObject *_args) 558 { 559 PyObject *_res = NULL; 560 OSErr _err; 561 SInt16 modifiers; 562 SInt16 mouseDownModifiers; 563 SInt16 mouseUpModifiers; 564 #ifndef GetDragModifiers 565 PyMac_PRECHECK(GetDragModifiers); 566 #endif 567 if (!PyArg_ParseTuple(_args, "")) 568 return NULL; 569 _err = GetDragModifiers(_self->ob_itself, 570 &modifiers, 571 &mouseDownModifiers, 572 &mouseUpModifiers); 573 if (_err != noErr) return PyMac_Error(_err); 574 _res = Py_BuildValue("hhh", 575 modifiers, 576 mouseDownModifiers, 577 mouseUpModifiers); 578 return _res; 579 } 580 581 static PyObject *DragObj_ShowDragHilite(DragObjObject *_self, PyObject *_args) 582 { 583 PyObject *_res = NULL; 584 OSErr _err; 585 RgnHandle hiliteFrame; 586 Boolean inside; 587 #ifndef ShowDragHilite 588 PyMac_PRECHECK(ShowDragHilite); 589 #endif 590 if (!PyArg_ParseTuple(_args, "O&b", 591 ResObj_Convert, &hiliteFrame, 592 &inside)) 593 return NULL; 594 _err = ShowDragHilite(_self->ob_itself, 595 hiliteFrame, 596 inside); 597 if (_err != noErr) return PyMac_Error(_err); 598 Py_INCREF(Py_None); 599 _res = Py_None; 600 return _res; 601 } 602 603 static PyObject *DragObj_HideDragHilite(DragObjObject *_self, PyObject *_args) 604 { 605 PyObject *_res = NULL; 606 OSErr _err; 607 #ifndef HideDragHilite 608 PyMac_PRECHECK(HideDragHilite); 609 #endif 610 if (!PyArg_ParseTuple(_args, "")) 611 return NULL; 612 _err = HideDragHilite(_self->ob_itself); 613 if (_err != noErr) return PyMac_Error(_err); 614 Py_INCREF(Py_None); 615 _res = Py_None; 616 return _res; 617 } 618 619 static PyObject *DragObj_DragPreScroll(DragObjObject *_self, PyObject *_args) 620 { 621 PyObject *_res = NULL; 622 OSErr _err; 623 SInt16 dH; 624 SInt16 dV; 625 #ifndef DragPreScroll 626 PyMac_PRECHECK(DragPreScroll); 627 #endif 628 if (!PyArg_ParseTuple(_args, "hh", 629 &dH, 630 &dV)) 631 return NULL; 632 _err = DragPreScroll(_self->ob_itself, 633 dH, 634 dV); 635 if (_err != noErr) return PyMac_Error(_err); 636 Py_INCREF(Py_None); 637 _res = Py_None; 638 return _res; 639 } 640 641 static PyObject *DragObj_DragPostScroll(DragObjObject *_self, PyObject *_args) 642 { 643 PyObject *_res = NULL; 644 OSErr _err; 645 #ifndef DragPostScroll 646 PyMac_PRECHECK(DragPostScroll); 647 #endif 648 if (!PyArg_ParseTuple(_args, "")) 649 return NULL; 650 _err = DragPostScroll(_self->ob_itself); 651 if (_err != noErr) return PyMac_Error(_err); 652 Py_INCREF(Py_None); 653 _res = Py_None; 654 return _res; 655 } 656 657 static PyObject *DragObj_UpdateDragHilite(DragObjObject *_self, PyObject *_args) 658 { 659 PyObject *_res = NULL; 660 OSErr _err; 661 RgnHandle updateRgn; 662 #ifndef UpdateDragHilite 663 PyMac_PRECHECK(UpdateDragHilite); 664 #endif 665 if (!PyArg_ParseTuple(_args, "O&", 666 ResObj_Convert, &updateRgn)) 667 return NULL; 668 _err = UpdateDragHilite(_self->ob_itself, 669 updateRgn); 670 if (_err != noErr) return PyMac_Error(_err); 671 Py_INCREF(Py_None); 672 _res = Py_None; 673 return _res; 674 } 675 676 static PyMethodDef DragObj_methods[] = { 677 {"DisposeDrag", (PyCFunction)DragObj_DisposeDrag, 1, 678 PyDoc_STR("() -> None")}, 679 {"AddDragItemFlavor", (PyCFunction)DragObj_AddDragItemFlavor, 1, 680 PyDoc_STR("(ItemReference theItemRef, FlavorType theType, Buffer dataPtr, FlavorFlags theFlags) -> None")}, 681 {"SetDragItemFlavorData", (PyCFunction)DragObj_SetDragItemFlavorData, 1, 682 PyDoc_STR("(ItemReference theItemRef, FlavorType theType, Buffer dataPtr, UInt32 dataOffset) -> None")}, 683 {"SetDragImage", (PyCFunction)DragObj_SetDragImage, 1, 684 PyDoc_STR("(PixMapHandle imagePixMap, RgnHandle imageRgn, Point imageOffsetPt, DragImageFlags theImageFlags) -> None")}, 685 {"ChangeDragBehaviors", (PyCFunction)DragObj_ChangeDragBehaviors, 1, 686 PyDoc_STR("(DragBehaviors inBehaviorsToSet, DragBehaviors inBehaviorsToClear) -> None")}, 687 {"TrackDrag", (PyCFunction)DragObj_TrackDrag, 1, 688 PyDoc_STR("(EventRecord theEvent, RgnHandle theRegion) -> None")}, 689 {"CountDragItems", (PyCFunction)DragObj_CountDragItems, 1, 690 PyDoc_STR("() -> (UInt16 numItems)")}, 691 {"GetDragItemReferenceNumber", (PyCFunction)DragObj_GetDragItemReferenceNumber, 1, 692 PyDoc_STR("(UInt16 index) -> (ItemReference theItemRef)")}, 693 {"CountDragItemFlavors", (PyCFunction)DragObj_CountDragItemFlavors, 1, 694 PyDoc_STR("(ItemReference theItemRef) -> (UInt16 numFlavors)")}, 695 {"GetFlavorType", (PyCFunction)DragObj_GetFlavorType, 1, 696 PyDoc_STR("(ItemReference theItemRef, UInt16 index) -> (FlavorType theType)")}, 697 {"GetFlavorFlags", (PyCFunction)DragObj_GetFlavorFlags, 1, 698 PyDoc_STR("(ItemReference theItemRef, FlavorType theType) -> (FlavorFlags theFlags)")}, 699 {"GetFlavorDataSize", (PyCFunction)DragObj_GetFlavorDataSize, 1, 700 PyDoc_STR("(ItemReference theItemRef, FlavorType theType) -> (Size dataSize)")}, 701 {"GetFlavorData", (PyCFunction)DragObj_GetFlavorData, 1, 702 PyDoc_STR("(ItemReference theItemRef, FlavorType theType, Buffer dataPtr, UInt32 dataOffset) -> (Buffer dataPtr)")}, 703 {"GetDragItemBounds", (PyCFunction)DragObj_GetDragItemBounds, 1, 704 PyDoc_STR("(ItemReference theItemRef) -> (Rect itemBounds)")}, 705 {"SetDragItemBounds", (PyCFunction)DragObj_SetDragItemBounds, 1, 706 PyDoc_STR("(ItemReference theItemRef, Rect itemBounds) -> None")}, 707 {"GetDropLocation", (PyCFunction)DragObj_GetDropLocation, 1, 708 PyDoc_STR("() -> (AEDesc dropLocation)")}, 709 {"SetDropLocation", (PyCFunction)DragObj_SetDropLocation, 1, 710 PyDoc_STR("(AEDesc dropLocation) -> None")}, 711 {"GetDragAttributes", (PyCFunction)DragObj_GetDragAttributes, 1, 712 PyDoc_STR("() -> (DragAttributes flags)")}, 713 {"GetDragMouse", (PyCFunction)DragObj_GetDragMouse, 1, 714 PyDoc_STR("() -> (Point mouse, Point globalPinnedMouse)")}, 715 {"SetDragMouse", (PyCFunction)DragObj_SetDragMouse, 1, 716 PyDoc_STR("(Point globalPinnedMouse) -> None")}, 717 {"GetDragOrigin", (PyCFunction)DragObj_GetDragOrigin, 1, 718 PyDoc_STR("() -> (Point globalInitialMouse)")}, 719 {"GetDragModifiers", (PyCFunction)DragObj_GetDragModifiers, 1, 720 PyDoc_STR("() -> (SInt16 modifiers, SInt16 mouseDownModifiers, SInt16 mouseUpModifiers)")}, 721 {"ShowDragHilite", (PyCFunction)DragObj_ShowDragHilite, 1, 722 PyDoc_STR("(RgnHandle hiliteFrame, Boolean inside) -> None")}, 723 {"HideDragHilite", (PyCFunction)DragObj_HideDragHilite, 1, 724 PyDoc_STR("() -> None")}, 725 {"DragPreScroll", (PyCFunction)DragObj_DragPreScroll, 1, 726 PyDoc_STR("(SInt16 dH, SInt16 dV) -> None")}, 727 {"DragPostScroll", (PyCFunction)DragObj_DragPostScroll, 1, 728 PyDoc_STR("() -> None")}, 729 {"UpdateDragHilite", (PyCFunction)DragObj_UpdateDragHilite, 1, 730 PyDoc_STR("(RgnHandle updateRgn) -> None")}, 731 {NULL, NULL, 0} 732 }; 733 734 #define DragObj_getsetlist NULL 735 736 737 #define DragObj_compare NULL 738 739 #define DragObj_repr NULL 740 741 #define DragObj_hash NULL 742 #define DragObj_tp_init 0 743 744 #define DragObj_tp_alloc PyType_GenericAlloc 745 746 static PyObject *DragObj_tp_new(PyTypeObject *type, PyObject *_args, PyObject *_kwds) 747 { 748 PyObject *_self; 749 DragRef itself; 750 char *kw[] = {"itself", 0}; 751 752 if (!PyArg_ParseTupleAndKeywords(_args, _kwds, "O&", kw, DragObj_Convert, &itself)) return NULL; 753 if ((_self = type->tp_alloc(type, 0)) == NULL) return NULL; 754 ((DragObjObject *)_self)->ob_itself = itself; 755 return _self; 756 } 757 758 #define DragObj_tp_free PyObject_Del 759 760 761 PyTypeObject DragObj_Type = { 762 PyObject_HEAD_INIT(NULL) 763 0, /*ob_size*/ 764 "_Drag.DragObj", /*tp_name*/ 765 sizeof(DragObjObject), /*tp_basicsize*/ 766 0, /*tp_itemsize*/ 767 /* methods */ 768 (destructor) DragObj_dealloc, /*tp_dealloc*/ 769 0, /*tp_print*/ 770 (getattrfunc)0, /*tp_getattr*/ 771 (setattrfunc)0, /*tp_setattr*/ 772 (cmpfunc) DragObj_compare, /*tp_compare*/ 773 (reprfunc) DragObj_repr, /*tp_repr*/ 774 (PyNumberMethods *)0, /* tp_as_number */ 775 (PySequenceMethods *)0, /* tp_as_sequence */ 776 (PyMappingMethods *)0, /* tp_as_mapping */ 777 (hashfunc) DragObj_hash, /*tp_hash*/ 778 0, /*tp_call*/ 779 0, /*tp_str*/ 780 PyObject_GenericGetAttr, /*tp_getattro*/ 781 PyObject_GenericSetAttr, /*tp_setattro */ 782 0, /*tp_as_buffer*/ 783 Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /* tp_flags */ 784 0, /*tp_doc*/ 785 0, /*tp_traverse*/ 786 0, /*tp_clear*/ 787 0, /*tp_richcompare*/ 788 0, /*tp_weaklistoffset*/ 789 0, /*tp_iter*/ 790 0, /*tp_iternext*/ 791 DragObj_methods, /* tp_methods */ 792 0, /*tp_members*/ 793 DragObj_getsetlist, /*tp_getset*/ 794 0, /*tp_base*/ 795 0, /*tp_dict*/ 796 0, /*tp_descr_get*/ 797 0, /*tp_descr_set*/ 798 0, /*tp_dictoffset*/ 799 DragObj_tp_init, /* tp_init */ 800 DragObj_tp_alloc, /* tp_alloc */ 801 DragObj_tp_new, /* tp_new */ 802 DragObj_tp_free, /* tp_free */ 803 }; 804 805 /* -------------------- End object type DragObj --------------------- */ 806 807 808 static PyObject *Drag_NewDrag(PyObject *_self, PyObject *_args) 809 { 810 PyObject *_res = NULL; 811 OSErr _err; 812 DragRef theDrag; 813 #ifndef NewDrag 814 PyMac_PRECHECK(NewDrag); 815 #endif 816 if (!PyArg_ParseTuple(_args, "")) 817 return NULL; 818 _err = NewDrag(&theDrag); 819 if (_err != noErr) return PyMac_Error(_err); 820 _res = Py_BuildValue("O&", 821 DragObj_New, theDrag); 822 return _res; 823 } 824 825 static PyObject *Drag_GetDragHiliteColor(PyObject *_self, PyObject *_args) 826 { 827 PyObject *_res = NULL; 828 OSErr _err; 829 WindowPtr window; 830 RGBColor color; 831 #ifndef GetDragHiliteColor 832 PyMac_PRECHECK(GetDragHiliteColor); 833 #endif 834 if (!PyArg_ParseTuple(_args, "O&", 835 WinObj_Convert, &window)) 836 return NULL; 837 _err = GetDragHiliteColor(window, 838 &color); 839 if (_err != noErr) return PyMac_Error(_err); 840 _res = Py_BuildValue("O&", 841 QdRGB_New, &color); 842 return _res; 843 } 844 845 static PyObject *Drag_WaitMouseMoved(PyObject *_self, PyObject *_args) 846 { 847 PyObject *_res = NULL; 848 Boolean _rv; 849 Point initialMouse; 850 #ifndef WaitMouseMoved 851 PyMac_PRECHECK(WaitMouseMoved); 852 #endif 853 if (!PyArg_ParseTuple(_args, "O&", 854 PyMac_GetPoint, &initialMouse)) 855 return NULL; 856 _rv = WaitMouseMoved(initialMouse); 857 _res = Py_BuildValue("b", 858 _rv); 859 return _res; 860 } 861 862 static PyObject *Drag_ZoomRects(PyObject *_self, PyObject *_args) 863 { 864 PyObject *_res = NULL; 865 OSErr _err; 866 Rect fromRect; 867 Rect toRect; 868 SInt16 zoomSteps; 869 ZoomAcceleration acceleration; 870 #ifndef ZoomRects 871 PyMac_PRECHECK(ZoomRects); 872 #endif 873 if (!PyArg_ParseTuple(_args, "O&O&hh", 874 PyMac_GetRect, &fromRect, 875 PyMac_GetRect, &toRect, 876 &zoomSteps, 877 &acceleration)) 878 return NULL; 879 _err = ZoomRects(&fromRect, 880 &toRect, 881 zoomSteps, 882 acceleration); 883 if (_err != noErr) return PyMac_Error(_err); 884 Py_INCREF(Py_None); 885 _res = Py_None; 886 return _res; 887 } 888 889 static PyObject *Drag_ZoomRegion(PyObject *_self, PyObject *_args) 890 { 891 PyObject *_res = NULL; 892 OSErr _err; 893 RgnHandle region; 894 Point zoomDistance; 895 SInt16 zoomSteps; 896 ZoomAcceleration acceleration; 897 #ifndef ZoomRegion 898 PyMac_PRECHECK(ZoomRegion); 899 #endif 900 if (!PyArg_ParseTuple(_args, "O&O&hh", 901 ResObj_Convert, ®ion, 902 PyMac_GetPoint, &zoomDistance, 903 &zoomSteps, 904 &acceleration)) 905 return NULL; 906 _err = ZoomRegion(region, 907 zoomDistance, 908 zoomSteps, 909 acceleration); 910 if (_err != noErr) return PyMac_Error(_err); 911 Py_INCREF(Py_None); 912 _res = Py_None; 913 return _res; 914 } 915 916 static PyObject *Drag_InstallTrackingHandler(PyObject *_self, PyObject *_args) 917 { 918 PyObject *_res = NULL; 919 920 PyObject *callback; 921 WindowPtr theWindow = NULL; 922 OSErr _err; 923 924 if ( !PyArg_ParseTuple(_args, "O|O&", &callback, WinObj_Convert, &theWindow) ) 925 return NULL; 926 Py_INCREF(callback); /* Cannot decref later, too bad */ 927 _err = InstallTrackingHandler(dragglue_TrackingHandlerUPP, theWindow, (void *)callback); 928 if (_err != noErr) return PyMac_Error(_err); 929 Py_INCREF(Py_None); 930 _res = Py_None; 931 return _res; 932 933 } 934 935 static PyObject *Drag_InstallReceiveHandler(PyObject *_self, PyObject *_args) 936 { 937 PyObject *_res = NULL; 938 939 PyObject *callback; 940 WindowPtr theWindow = NULL; 941 OSErr _err; 942 943 if ( !PyArg_ParseTuple(_args, "O|O&", &callback, WinObj_Convert, &theWindow) ) 944 return NULL; 945 Py_INCREF(callback); /* Cannot decref later, too bad */ 946 _err = InstallReceiveHandler(dragglue_ReceiveHandlerUPP, theWindow, (void *)callback); 947 if (_err != noErr) return PyMac_Error(_err); 948 Py_INCREF(Py_None); 949 _res = Py_None; 950 return _res; 951 952 } 953 954 static PyObject *Drag_RemoveTrackingHandler(PyObject *_self, PyObject *_args) 955 { 956 PyObject *_res = NULL; 957 958 WindowPtr theWindow = NULL; 959 OSErr _err; 960 961 if ( !PyArg_ParseTuple(_args, "|O&", WinObj_Convert, &theWindow) ) 962 return NULL; 963 _err = RemoveTrackingHandler(dragglue_TrackingHandlerUPP, theWindow); 964 if (_err != noErr) return PyMac_Error(_err); 965 Py_INCREF(Py_None); 966 _res = Py_None; 967 return _res; 968 969 } 970 971 static PyObject *Drag_RemoveReceiveHandler(PyObject *_self, PyObject *_args) 972 { 973 PyObject *_res = NULL; 974 975 WindowPtr theWindow = NULL; 976 OSErr _err; 977 978 if ( !PyArg_ParseTuple(_args, "|O&", WinObj_Convert, &theWindow) ) 979 return NULL; 980 _err = RemoveReceiveHandler(dragglue_ReceiveHandlerUPP, theWindow); 981 if (_err != noErr) return PyMac_Error(_err); 982 Py_INCREF(Py_None); 983 _res = Py_None; 984 return _res; 985 986 } 987 988 static PyMethodDef Drag_methods[] = { 989 {"NewDrag", (PyCFunction)Drag_NewDrag, 1, 990 PyDoc_STR("() -> (DragRef theDrag)")}, 991 {"GetDragHiliteColor", (PyCFunction)Drag_GetDragHiliteColor, 1, 992 PyDoc_STR("(WindowPtr window) -> (RGBColor color)")}, 993 {"WaitMouseMoved", (PyCFunction)Drag_WaitMouseMoved, 1, 994 PyDoc_STR("(Point initialMouse) -> (Boolean _rv)")}, 995 {"ZoomRects", (PyCFunction)Drag_ZoomRects, 1, 996 PyDoc_STR("(Rect fromRect, Rect toRect, SInt16 zoomSteps, ZoomAcceleration acceleration) -> None")}, 997 {"ZoomRegion", (PyCFunction)Drag_ZoomRegion, 1, 998 PyDoc_STR("(RgnHandle region, Point zoomDistance, SInt16 zoomSteps, ZoomAcceleration acceleration) -> None")}, 999 {"InstallTrackingHandler", (PyCFunction)Drag_InstallTrackingHandler, 1, 1000 PyDoc_STR(NULL)}, 1001 {"InstallReceiveHandler", (PyCFunction)Drag_InstallReceiveHandler, 1, 1002 PyDoc_STR(NULL)}, 1003 {"RemoveTrackingHandler", (PyCFunction)Drag_RemoveTrackingHandler, 1, 1004 PyDoc_STR(NULL)}, 1005 {"RemoveReceiveHandler", (PyCFunction)Drag_RemoveReceiveHandler, 1, 1006 PyDoc_STR(NULL)}, 1007 {NULL, NULL, 0} 1008 }; 1009 1010 1011 1012 static pascal OSErr 1013 dragglue_TrackingHandler(DragTrackingMessage theMessage, WindowPtr theWindow, 1014 void *handlerRefCon, DragReference theDrag) 1015 { 1016 PyObject *args, *rv; 1017 int i; 1018 1019 args = Py_BuildValue("hO&O&", theMessage, DragObj_New, theDrag, WinObj_WhichWindow, theWindow); 1020 if ( args == NULL ) 1021 return -1; 1022 rv = PyEval_CallObject((PyObject *)handlerRefCon, args); 1023 Py_DECREF(args); 1024 if ( rv == NULL ) { 1025 PySys_WriteStderr("Drag: Exception in TrackingHandler\n"); 1026 PyErr_Print(); 1027 return -1; 1028 } 1029 i = -1; 1030 if ( rv == Py_None ) 1031 i = 0; 1032 else 1033 PyArg_Parse(rv, "l", &i); 1034 Py_DECREF(rv); 1035 return i; 1036 } 1037 1038 static pascal OSErr 1039 dragglue_ReceiveHandler(WindowPtr theWindow, void *handlerRefCon, 1040 DragReference theDrag) 1041 { 1042 PyObject *args, *rv; 1043 int i; 1044 1045 args = Py_BuildValue("O&O&", DragObj_New, theDrag, WinObj_WhichWindow, theWindow); 1046 if ( args == NULL ) 1047 return -1; 1048 rv = PyEval_CallObject((PyObject *)handlerRefCon, args); 1049 Py_DECREF(args); 1050 if ( rv == NULL ) { 1051 PySys_WriteStderr("Drag: Exception in ReceiveHandler\n"); 1052 PyErr_Print(); 1053 return -1; 1054 } 1055 i = -1; 1056 if ( rv == Py_None ) 1057 i = 0; 1058 else 1059 PyArg_Parse(rv, "l", &i); 1060 Py_DECREF(rv); 1061 return i; 1062 } 1063 1064 static pascal OSErr 1065 dragglue_SendData(FlavorType theType, void *dragSendRefCon, 1066 ItemReference theItem, DragReference theDrag) 1067 { 1068 DragObjObject *self = (DragObjObject *)dragSendRefCon; 1069 PyObject *args, *rv; 1070 int i; 1071 1072 if ( self->sendproc == NULL ) 1073 return -1; 1074 args = Py_BuildValue("O&l", PyMac_BuildOSType, theType, theItem); 1075 if ( args == NULL ) 1076 return -1; 1077 rv = PyEval_CallObject(self->sendproc, args); 1078 Py_DECREF(args); 1079 if ( rv == NULL ) { 1080 PySys_WriteStderr("Drag: Exception in SendDataHandler\n"); 1081 PyErr_Print(); 1082 return -1; 1083 } 1084 i = -1; 1085 if ( rv == Py_None ) 1086 i = 0; 1087 else 1088 PyArg_Parse(rv, "l", &i); 1089 Py_DECREF(rv); 1090 return i; 1091 } 1092 1093 #if 0 1094 static pascal OSErr 1095 dragglue_Input(Point *mouse, short *modifiers, 1096 void *dragSendRefCon, DragReference theDrag) 1097 { 1098 return 0; 1099 } 1100 1101 static pascal OSErr 1102 dragglue_Drawing(xxxx 1103 void *dragSendRefCon, DragReference theDrag) 1104 { 1105 return 0; 1106 } 1107 #endif 1108 #else /* __LP64__ */ 1109 static PyMethodDef Drag_methods[] = { 1110 {NULL, NULL, 0} 1111 }; 1112 #endif /* __LP64__ */ 1113 1114 1115 void init_Drag(void) 1116 { 1117 PyObject *m; 1118 #if APPLE_SUPPORTS_QUICKTIME 1119 PyObject *d; 1120 1121 1122 1123 PyMac_INIT_TOOLBOX_OBJECT_NEW(DragRef, DragObj_New); 1124 PyMac_INIT_TOOLBOX_OBJECT_CONVERT(DragRef, DragObj_Convert); 1125 #endif /* APPLE_SUPPORTS_QUICKTIME */ 1126 1127 1128 m = Py_InitModule("_Drag", Drag_methods); 1129 #if APPLE_SUPPORTS_QUICKTIME 1130 d = PyModule_GetDict(m); 1131 Drag_Error = PyMac_GetOSErrException(); 1132 if (Drag_Error == NULL || 1133 PyDict_SetItemString(d, "Error", Drag_Error) != 0) 1134 return; 1135 DragObj_Type.ob_type = &PyType_Type; 1136 if (PyType_Ready(&DragObj_Type) < 0) return; 1137 Py_INCREF(&DragObj_Type); 1138 PyModule_AddObject(m, "DragObj", (PyObject *)&DragObj_Type); 1139 /* Backward-compatible name */ 1140 Py_INCREF(&DragObj_Type); 1141 PyModule_AddObject(m, "DragObjType", (PyObject *)&DragObj_Type); 1142 1143 dragglue_TrackingHandlerUPP = NewDragTrackingHandlerUPP(dragglue_TrackingHandler); 1144 dragglue_ReceiveHandlerUPP = NewDragReceiveHandlerUPP(dragglue_ReceiveHandler); 1145 dragglue_SendDataUPP = NewDragSendDataUPP(dragglue_SendData); 1146 #if 0 1147 dragglue_InputUPP = NewDragInputUPP(dragglue_Input); 1148 dragglue_DrawingUPP = NewDragDrawingUPP(dragglue_Drawing); 1149 #endif 1150 1151 #endif /* APPLE_SUPPORTS_QUICKTIME */ 1152 1153 } 1154 1155 /* ======================== End module _Drag ======================== */ 1156 1157