XWorkstation.st
changeset 3230 e6e06f7b7df4
parent 3229 e83490cc4472
child 3232 aeda024f481d
equal deleted inserted replaced
3229:e83490cc4472 3230:e6e06f7b7df4
  4331     ^ false
  4331     ^ false
  4332 ! !
  4332 ! !
  4333 
  4333 
  4334 !XWorkstation methodsFor:'event forwarding'!
  4334 !XWorkstation methodsFor:'event forwarding'!
  4335 
  4335 
       
  4336 buttonMotion:view state:state x:x y:y rootX:rX rootY:rY time:time
       
  4337     "forward a buttonMotion event for some view"
       
  4338 
       
  4339     self buttonMotion:state x:x y:y view:view
       
  4340 !
       
  4341 
       
  4342 buttonPress:view button:button state:state x:x y:y rootX:rX rootY:rY time:time
       
  4343     "forward a buttonPress event for some view"
       
  4344 
       
  4345     |logicalButton nextMultiClickTime|
       
  4346 
       
  4347     altDown := state bitTest:altModifierMask.
       
  4348     metaDown := state bitTest:metaModifierMask.
       
  4349     shiftDown := state bitTest:(self shiftModifierMask).
       
  4350     ctrlDown := state bitTest:(self ctrlModifierMask).
       
  4351 
       
  4352     eventRootX := rX.
       
  4353     eventRootY := rY.
       
  4354 
       
  4355     "/ physical to logical button translation
       
  4356     logicalButton := buttonTranslation at:button ifAbsent:button.
       
  4357     buttonsPressed := buttonsPressed bitOr:(1 bitShift:logicalButton-1).
       
  4358 
       
  4359     multiClickTimeDelta notNil ifTrue:[
       
  4360         nextMultiClickTime := time + multiClickTimeDelta.
       
  4361         multiClickTime notNil ifTrue:[
       
  4362             time < multiClickTime ifTrue:[
       
  4363                 multiClickTime := nextMultiClickTime.
       
  4364                 self buttonMultiPress:logicalButton x:x y:y view:view.
       
  4365                 ^ self.
       
  4366             ]
       
  4367         ].
       
  4368         multiClickTime := nextMultiClickTime.
       
  4369     ].
       
  4370 
       
  4371     self buttonPress:logicalButton x:x y:y view:view
       
  4372 !
       
  4373 
  4336 buttonPress:button x:x y:y view:aView
  4374 buttonPress:button x:x y:y view:aView
  4337     "forward a button-press event for some view"
  4375     "forward a button-press event for some view"
  4338 
  4376 
       
  4377     aView isNil ifTrue:[
       
  4378         "/ event arrived, after I destroyed it myself
       
  4379         ^ self
       
  4380     ].
  4339     button == 1 ifTrue:[
  4381     button == 1 ifTrue:[
  4340 	activateOnClick == true ifTrue:[
  4382         activateOnClick == true ifTrue:[
  4341 	    "/ dont raise above an active popup view.
  4383             "/ dont raise above an active popup view.
  4342 	    (activeKeyboardGrab isNil and:[activePointerGrab isNil]) ifTrue:[
  4384             (activeKeyboardGrab isNil and:[activePointerGrab isNil]) ifTrue:[
  4343 		aView topView raise.
  4385                 aView topView raise.
  4344 "/            ] ifFalse:[
  4386 "/            ] ifFalse:[
  4345 "/                activeKeyboardGrab printCR.
  4387 "/                activeKeyboardGrab printCR.
  4346 "/                activePointerGrab printCR.
  4388 "/                activePointerGrab printCR.
  4347 	    ]
  4389             ]
  4348 	].
  4390         ].
  4349     ].
  4391     ].
  4350     super buttonPress:button x:x y:y view:aView
  4392     super buttonPress:button x:x y:y view:aView
  4351 
  4393 
  4352 
  4394 
  4353 
  4395 
       
  4396 !
       
  4397 
       
  4398 buttonRelease:view button:button state:state x:x y:y rootX:rX rootY:rY time:time
       
  4399     "forward a buttonPress event for some view"
       
  4400 
       
  4401     |logicalButton|
       
  4402 
       
  4403     altDown := state bitTest:altModifierMask.
       
  4404     metaDown := state bitTest:metaModifierMask.
       
  4405     shiftDown := state bitTest:(self shiftModifierMask).
       
  4406     ctrlDown := state bitTest:(self ctrlModifierMask).
       
  4407 
       
  4408     eventRootX := rX.
       
  4409     eventRootY := rY.
       
  4410 
       
  4411     "/ physical to logical button translation
       
  4412     logicalButton := buttonTranslation at:button ifAbsent:button.
       
  4413 
       
  4414     buttonsPressed := buttonsPressed bitClear:(1 bitShift:logicalButton-1).
       
  4415 
       
  4416     self buttonRelease:logicalButton x:x y:y view:view
  4354 !
  4417 !
  4355 
  4418 
  4356 circulateNotifyView:aView
  4419 circulateNotifyView:aView
  4357     "sent, when the stacking order changes.
  4420     "sent, when the stacking order changes.
  4358      ignored for now."
  4421      ignored for now."
  4398 
  4461 
  4399 colorMapChangeView:aView
  4462 colorMapChangeView:aView
  4400     "sent, when another colormap is installed.
  4463     "sent, when another colormap is installed.
  4401      This is a very X-specific mechanism."
  4464      This is a very X-specific mechanism."
  4402 
  4465 
       
  4466     aView isNil ifTrue:[
       
  4467         "/ event arrived, after I destroyed it myself
       
  4468         ^ self
       
  4469     ].
  4403     aView colorMapChange
  4470     aView colorMapChange
       
  4471 !
       
  4472 
       
  4473 configure:view x:x y:y width:w height:h above:above
       
  4474     "forward a size-change event for some view"
       
  4475 
       
  4476     self configureX:x y:y width:w height:h view:view
  4404 !
  4477 !
  4405 
  4478 
  4406 configureRequestView:aView
  4479 configureRequestView:aView
  4407     "ignored for now"
  4480     "ignored for now"
  4408 
  4481 
  4523 
  4596 
  4524     "Created: 4.4.1997 / 17:59:37 / cg"
  4597     "Created: 4.4.1997 / 17:59:37 / cg"
  4525     "Modified: 6.4.1997 / 14:50:44 / cg"
  4598     "Modified: 6.4.1997 / 14:50:44 / cg"
  4526 !
  4599 !
  4527 
  4600 
       
  4601 expose:view x:x y:y width:w height:h count:count
       
  4602     "forward an expose event for some view"
       
  4603 
       
  4604     self exposeX:x y:y width:w height:h view:view.
       
  4605 
       
  4606 
       
  4607 
       
  4608 
       
  4609 !
       
  4610 
       
  4611 focusIn:view mode:mode detail:detail
       
  4612     "forward a key-press event for some view"
       
  4613 
       
  4614     self focusInView:view
       
  4615 !
       
  4616 
       
  4617 focusOut:view mode:mode detail:detail
       
  4618     "forward a key-press event for some view"
       
  4619 
       
  4620     self focusOutView:view
       
  4621 !
       
  4622 
       
  4623 graphicsExpose:view x:x y:y width:w height:h count:count
       
  4624     "forward a graphics-expose event for some view"
       
  4625 
       
  4626     self graphicsExposeX:x y:y width:w height:h final:(count==0) view:view
       
  4627 
       
  4628 
       
  4629 
       
  4630 
       
  4631 !
       
  4632 
  4528 gravityNotifyView:aView
  4633 gravityNotifyView:aView
  4529     "ignored for now"
  4634     "ignored for now"
  4530 
  4635 
  4531     "/ aView gravityNotify
  4636     "/ aView gravityNotify
  4532 !
  4637 !
  4533 
  4638 
       
  4639 keyPress:view key:key code:keyCode state:state x:x y:y rootX:rX rootY:rY time:time
       
  4640     "forward a key-press event for some view"
       
  4641 
       
  4642     altDown := state bitTest:altModifierMask.
       
  4643     metaDown := state bitTest:metaModifierMask.
       
  4644     shiftDown := state bitTest:(self shiftModifierMask).
       
  4645     ctrlDown := state bitTest:(self ctrlModifierMask).
       
  4646 
       
  4647     key isNil ifTrue:[
       
  4648         "/ happens sometimes on some systems
       
  4649         "/ (alt-graph on sun has no keysym) 
       
  4650         ^ self
       
  4651     ].
       
  4652     eventRootX := rX.
       
  4653     eventRootY := rY.
       
  4654     self keyPress:key x:x y:y view:view.
       
  4655 
       
  4656 
       
  4657 !
       
  4658 
       
  4659 keyRelease:view key:key code:keyCode state:state x:x y:y rootX:rX rootY:rY time:time
       
  4660     "forward a key-release event for some view"
       
  4661 
       
  4662     altDown := state bitTest:altModifierMask.
       
  4663     metaDown := state bitTest:metaModifierMask.
       
  4664     shiftDown := state bitTest:(self shiftModifierMask).
       
  4665     ctrlDown := state bitTest:(self ctrlModifierMask).
       
  4666 
       
  4667     key isNil ifTrue:[
       
  4668         "/ happens sometimes on some systems
       
  4669         "/ (alt-graph on sun has no keysym) 
       
  4670         ^ self
       
  4671     ].
       
  4672     eventRootX := rX.
       
  4673     eventRootY := rY.
       
  4674     self keyRelease:key x:x y:y view:view.
       
  4675 
       
  4676 
       
  4677 
       
  4678 
       
  4679 !
       
  4680 
  4534 mapRequestView:aView
  4681 mapRequestView:aView
  4535     "ignored for now"
  4682     "ignored for now"
  4536 
  4683 
  4537     "/ aView mapRequest
  4684     "/ aView mapRequest
       
  4685 !
       
  4686 
       
  4687 pointerEnter:view x:x y:y rootX:rX rootY:rY state:state mode:mode detail:detail time:time
       
  4688     "forward a pointer enter event for some view"
       
  4689 
       
  4690     altDown := state bitTest:altModifierMask.
       
  4691     metaDown := state bitTest:metaModifierMask.
       
  4692     shiftDown := state bitTest:(self shiftModifierMask).
       
  4693     ctrlDown := state bitTest:(self ctrlModifierMask).
       
  4694 
       
  4695     eventRootX := rX.
       
  4696     eventRootY := rY.
       
  4697     self pointerEnter:state x:x y:y view:view
       
  4698 !
       
  4699 
       
  4700 pointerLeave:view x:x y:y rootX:rX rootY:rY state:state mode:mode detail:detail time:time
       
  4701     "forward a pointer leave event for some view"
       
  4702 
       
  4703     altDown := state bitTest:altModifierMask.
       
  4704     metaDown := state bitTest:metaModifierMask.
       
  4705     shiftDown := state bitTest:(self shiftModifierMask).
       
  4706     ctrlDown := state bitTest:(self ctrlModifierMask).
       
  4707 
       
  4708     eventRootX := rX.
       
  4709     eventRootY := rY.
       
  4710     self pointerLeave:state view:view
  4538 !
  4711 !
  4539 
  4712 
  4540 propertyChangeView:aView
  4713 propertyChangeView:aView
  4541     "sent when an X property changes.
  4714     "sent when an X property changes.
  4542      This is a very X-specific mechanism."
  4715      This is a very X-specific mechanism."
  4543 
  4716 
       
  4717     aView isNil ifTrue:[
       
  4718         "/ event arrived, after I destroyed it myself
       
  4719         ^ self
       
  4720     ].
  4544     aView propertyChange
  4721     aView propertyChange
  4545 !
  4722 !
  4546 
  4723 
  4547 reparentedView:aView
  4724 reparentedView:aView
  4548     "ignored for now"
  4725     "ignored for now"
  4684     "Modified: / 17.6.1998 / 20:24:40 / cg"
  4861     "Modified: / 17.6.1998 / 20:24:40 / cg"
  4685 ! !
  4862 ! !
  4686 
  4863 
  4687 !XWorkstation methodsFor:'event handling'!
  4864 !XWorkstation methodsFor:'event handling'!
  4688 
  4865 
       
  4866 decomposeLastEventInto:eventArr
       
  4867     "extracet event fields and place them into an array:
       
  4868      the fields are:
       
  4869         1:      windowID
       
  4870         2:      eventType-ID
       
  4871         3:      eventTypeSymbol
       
  4872 
       
  4873         4..     args
       
  4874     "
       
  4875 %{ 
       
  4876 #   define ANYBUTTON   (Button1MotionMask | Button2MotionMask | Button3MotionMask)
       
  4877 
       
  4878     OBJ eB;
       
  4879     XEvent *ev;
       
  4880     int ev_x, ev_y;
       
  4881 
       
  4882 #   define ae ((XAnyEvent *)ev)
       
  4883 #   define ee ((XExposeEvent *)ev)
       
  4884 #   define ke ((XKeyPressedEvent *)ev)
       
  4885 #   define be ((XButtonPressedEvent *)ev)
       
  4886 #   define ce ((XConfigureEvent *)ev)
       
  4887 #   define cr ((XConfigureRequestEvent *)ev)
       
  4888 #   define me ((XMotionEvent *)ev)
       
  4889 #   define ele ((XCrossingEvent *)ev)
       
  4890 #   define de ((XDestroyWindowEvent *)ev)
       
  4891 #   define ve ((XVisibilityEvent *)ev)
       
  4892 #   define fe ((XFocusChangeEvent *)ev)
       
  4893 #   define cre ((XCreateWindowEvent *)ev)
       
  4894 #   define mape ((XMappingEvent *)ev)
       
  4895 #   define gre ((XGravityEvent *)ev)
       
  4896 #   define rr ((XResizeRequestEvent *)ev)
       
  4897 #   define cie ((XCirculateEvent *)ev)
       
  4898 #   define pe ((XPropertyEvent *)ev)
       
  4899 #   define sce ((XSelectionClearEvent *)ev)
       
  4900 #   define cme ((XColormapEvent *)ev)
       
  4901 
       
  4902     KeySym keySym;
       
  4903     unsigned char buffer[10];
       
  4904     int i, nchars;
       
  4905     char *keySymString;
       
  4906     char keySymStringBuffer[32];
       
  4907     unsigned INT nextMultiClickTime;
       
  4908     OBJ arg, sym, t, windowID;
       
  4909 
       
  4910     eB = __INST(eventBuffer);
       
  4911 
       
  4912     if (__isByteArray(eB)) {
       
  4913         ev = (XEvent *)(__ByteArrayInstPtr(eB)->ba_element);
       
  4914     } else {
       
  4915         printf("DISPLAY: no eventBuffer\n");
       
  4916         RETURN (false);
       
  4917     }
       
  4918     if (!__isArray(eventArr)) {
       
  4919         printf("DISPLAY: bad argument\n");
       
  4920         RETURN (false);
       
  4921     }
       
  4922     if (__arraySize(eventArr) < 11) {
       
  4923         printf("DISPLAY: bad argument\n");
       
  4924         RETURN (false);
       
  4925     }
       
  4926 
       
  4927     if (((t = __INST(lastId)) != nil)
       
  4928      && __isExternalAddress(t)
       
  4929      && (_WindowVal(t) == ae->window)) {
       
  4930         windowID = t;
       
  4931     } else {
       
  4932         windowID = __MKEXTERNALADDRESS(ae->window);
       
  4933     }
       
  4934 
       
  4935     __ArrayInstPtr(eventArr)->a_element[0] = windowID; __STORE(eventArr, windowID);
       
  4936     __ArrayInstPtr(eventArr)->a_element[1] = __MKSMALLINT(ev->type);
       
  4937 
       
  4938     switch (ev->type) {
       
  4939         case KeyRelease:
       
  4940             sym = @symbol(keyRelease:key:code:state:x:y:rootX:rootY:time:);
       
  4941             goto keyPressAndRelease;
       
  4942 
       
  4943         case KeyPress:
       
  4944             sym = @symbol(keyPress:key:code:state:x:y:rootX:rootY:time:);
       
  4945             /* FALL INTO */
       
  4946 
       
  4947         keyPressAndRelease:
       
  4948             arg = nil;
       
  4949             nchars = XLookupString(ke, (char *)buffer, sizeof(buffer), &keySym, NULL);
       
  4950             if (nchars 
       
  4951              && (((buffer[0] >= ' ') && (buffer[0] <= '~'))
       
  4952                  || (buffer[0] >= 0x80))) {
       
  4953                 arg = _MKCHARACTER(buffer[0])/* *_CharacterTable[buffer[0]] */;
       
  4954                 keySymString = NULL;
       
  4955             } else {
       
  4956                 keySymString = XKeysymToString(keySym);
       
  4957                 if (keySymString) {
       
  4958                     arg = __MKSTRING(keySymString);
       
  4959                 }
       
  4960             }
       
  4961 
       
  4962             if (arg == nil) {
       
  4963                 /* happens sometimes (alt-graph on sun has no keysym) */
       
  4964                 RETURN (false);
       
  4965             }
       
  4966 
       
  4967             __ArrayInstPtr(eventArr)->a_element[2] = sym;
       
  4968 
       
  4969             __ArrayInstPtr(eventArr)->a_element[3] = arg; __STORE(eventArr, arg);
       
  4970             __ArrayInstPtr(eventArr)->a_element[4] = t = __MKUINT(ke->keycode); __STORE(eventArr, t);
       
  4971             __ArrayInstPtr(eventArr)->a_element[5] = __mkSmallInteger(ke->state);
       
  4972             __ArrayInstPtr(eventArr)->a_element[6] = __mkSmallInteger(ke->x);
       
  4973             __ArrayInstPtr(eventArr)->a_element[7] = __mkSmallInteger(ke->y);
       
  4974             __ArrayInstPtr(eventArr)->a_element[8] = __mkSmallInteger(ke->x_root);
       
  4975             __ArrayInstPtr(eventArr)->a_element[9] = __mkSmallInteger(ke->y_root);
       
  4976             __ArrayInstPtr(eventArr)->a_element[10] = t = __MKUINT(ke->time); __STORE(eventArr, t);
       
  4977             RETURN (true);
       
  4978 
       
  4979         case ButtonPress:
       
  4980             sym = @symbol(buttonPress:button:state:x:y:rootX:rootY:time:);
       
  4981             goto buttonPressAndRelease;
       
  4982 
       
  4983         case ButtonRelease:
       
  4984             sym = @symbol(buttonRelease:button:state:x:y:rootX:rootY:time:);
       
  4985             /* fall into */
       
  4986 
       
  4987         buttonPressAndRelease:
       
  4988             __ArrayInstPtr(eventArr)->a_element[2] = sym;
       
  4989             __ArrayInstPtr(eventArr)->a_element[3] = __mkSmallInteger(be->button);
       
  4990             __ArrayInstPtr(eventArr)->a_element[4] = __mkSmallInteger(ke->state);
       
  4991             __ArrayInstPtr(eventArr)->a_element[5] = __mkSmallInteger(be->x);
       
  4992             __ArrayInstPtr(eventArr)->a_element[6] = __mkSmallInteger(be->y);
       
  4993             __ArrayInstPtr(eventArr)->a_element[7] = __mkSmallInteger(be->x_root);
       
  4994             __ArrayInstPtr(eventArr)->a_element[8] = __mkSmallInteger(be->y_root);
       
  4995             __ArrayInstPtr(eventArr)->a_element[9] = t = __MKUINT(be->time); __STORE(eventArr, t);
       
  4996             RETURN (true);
       
  4997 
       
  4998         case MotionNotify:
       
  4999             __ArrayInstPtr(eventArr)->a_element[2] = @symbol(buttonMotion:state:x:y:rootX:rootY:time:);
       
  5000 
       
  5001             __ArrayInstPtr(eventArr)->a_element[3] = __mkSmallInteger(me->state);
       
  5002             __ArrayInstPtr(eventArr)->a_element[4] = __mkSmallInteger(me->x);
       
  5003             __ArrayInstPtr(eventArr)->a_element[5] = __mkSmallInteger(me->y);
       
  5004             __ArrayInstPtr(eventArr)->a_element[6] = __mkSmallInteger(me->x_root);
       
  5005             __ArrayInstPtr(eventArr)->a_element[7] = __mkSmallInteger(me->y_root);
       
  5006             __ArrayInstPtr(eventArr)->a_element[8] = t = __MKUINT(me->time); __STORE(eventArr, t);
       
  5007             RETURN (true);
       
  5008 
       
  5009         case FocusIn:
       
  5010             __ArrayInstPtr(eventArr)->a_element[2] = @symbol(focusIn:mode:detail:);
       
  5011             goto focusInOut;
       
  5012 
       
  5013         case FocusOut:
       
  5014             __ArrayInstPtr(eventArr)->a_element[2] = @symbol(focusOut:mode:detail:);
       
  5015             /* fall into */
       
  5016 
       
  5017         focusInOut:
       
  5018             __ArrayInstPtr(eventArr)->a_element[3] = __mkSmallInteger(fe->mode);
       
  5019             __ArrayInstPtr(eventArr)->a_element[4] = __mkSmallInteger(fe->detail);
       
  5020             RETURN (true);
       
  5021 
       
  5022 
       
  5023         case EnterNotify:
       
  5024             __ArrayInstPtr(eventArr)->a_element[2] = @symbol(pointerEnter:x:y:rootX:rootY:state:mode:detail:time:);
       
  5025             goto enterLeave;
       
  5026 
       
  5027         case LeaveNotify:
       
  5028             __ArrayInstPtr(eventArr)->a_element[2] = @symbol(pointerLeave:x:y:rootX:rootY:state:mode:detail:time:);
       
  5029             /* fall into */
       
  5030 
       
  5031         enterLeave:
       
  5032             __ArrayInstPtr(eventArr)->a_element[3] = __mkSmallInteger(ele->x);
       
  5033             __ArrayInstPtr(eventArr)->a_element[4] = __mkSmallInteger(ele->y);
       
  5034             __ArrayInstPtr(eventArr)->a_element[5] = __mkSmallInteger(ele->x_root);
       
  5035             __ArrayInstPtr(eventArr)->a_element[6] = __mkSmallInteger(ele->y_root);
       
  5036             __ArrayInstPtr(eventArr)->a_element[7] = __mkSmallInteger(ele->state);
       
  5037             __ArrayInstPtr(eventArr)->a_element[8] = __mkSmallInteger(ele->mode);
       
  5038             __ArrayInstPtr(eventArr)->a_element[9] = __mkSmallInteger(ele->detail);
       
  5039             __ArrayInstPtr(eventArr)->a_element[10] = t = __MKUINT(ele->time); __STORE(eventArr, t);
       
  5040             RETURN (true);
       
  5041 
       
  5042         case Expose:
       
  5043             __ArrayInstPtr(eventArr)->a_element[2] = @symbol(expose:x:y:width:height:count:);
       
  5044             goto expose;
       
  5045 
       
  5046         case GraphicsExpose:
       
  5047             __ArrayInstPtr(eventArr)->a_element[2] = @symbol(graphicsExpose:x:y:width:height:count:);
       
  5048             /* fall into */
       
  5049 
       
  5050         expose:
       
  5051             __ArrayInstPtr(eventArr)->a_element[3] = __mkSmallInteger(ee->x);
       
  5052             __ArrayInstPtr(eventArr)->a_element[4] = __mkSmallInteger(ee->y);
       
  5053             __ArrayInstPtr(eventArr)->a_element[5] = __mkSmallInteger(ee->width);
       
  5054             __ArrayInstPtr(eventArr)->a_element[6] = __mkSmallInteger(ee->height);
       
  5055             __ArrayInstPtr(eventArr)->a_element[7] = __mkSmallInteger(ee->count);
       
  5056             RETURN (true);
       
  5057 
       
  5058         case NoExpose:
       
  5059             __ArrayInstPtr(eventArr)->a_element[2] = @symbol(noExposeView:);
       
  5060             RETURN (true);
       
  5061 
       
  5062         case VisibilityNotify:
       
  5063             __ArrayInstPtr(eventArr)->a_element[2] = @symbol(visibilityNotify:state:);
       
  5064             switch (ve->state) {
       
  5065                 case VisibilityUnobscured:
       
  5066                     __ArrayInstPtr(eventArr)->a_element[3] = @symbol(unobscured);
       
  5067                     break;
       
  5068                 case VisibilityPartiallyObscured:
       
  5069                     __ArrayInstPtr(eventArr)->a_element[3] = @symbol(partiallyObscured);
       
  5070                     break;
       
  5071                 case VisibilityFullyObscured:
       
  5072                     __ArrayInstPtr(eventArr)->a_element[3] = @symbol(fullyObscured);
       
  5073                     break;
       
  5074             }
       
  5075             RETURN (true);
       
  5076 
       
  5077         case CreateNotify:
       
  5078             __ArrayInstPtr(eventArr)->a_element[2] = @symbol(createWindow:x:y:width:height:);
       
  5079             __ArrayInstPtr(eventArr)->a_element[3] = __mkSmallInteger(cre->x);
       
  5080             __ArrayInstPtr(eventArr)->a_element[4] = __mkSmallInteger(cre->y);
       
  5081             __ArrayInstPtr(eventArr)->a_element[5] = __mkSmallInteger(cre->width);
       
  5082             __ArrayInstPtr(eventArr)->a_element[6] = __mkSmallInteger(cre->height);
       
  5083             RETURN (true);
       
  5084 
       
  5085         case DestroyNotify:
       
  5086             __ArrayInstPtr(eventArr)->a_element[2] = @symbol(destroyedView:);
       
  5087             RETURN (true);
       
  5088 
       
  5089         case UnmapNotify:
       
  5090             __ArrayInstPtr(eventArr)->a_element[2] = @symbol(unmappedView:);
       
  5091             RETURN (true);
       
  5092 
       
  5093         case MapNotify:
       
  5094             __ArrayInstPtr(eventArr)->a_element[2] = @symbol(mappedView:);
       
  5095             RETURN (true);
       
  5096 
       
  5097         case ConfigureNotify:
       
  5098             __ArrayInstPtr(eventArr)->a_element[2] = @symbol(configure:x:y:width:height:above:);
       
  5099             __ArrayInstPtr(eventArr)->a_element[3] = __mkSmallInteger(ce->x);
       
  5100             __ArrayInstPtr(eventArr)->a_element[4] = __mkSmallInteger(ce->y);
       
  5101             __ArrayInstPtr(eventArr)->a_element[5] = __mkSmallInteger(ce->width);
       
  5102             __ArrayInstPtr(eventArr)->a_element[6] = __mkSmallInteger(ce->height);
       
  5103             __ArrayInstPtr(eventArr)->a_element[7] = nil;
       
  5104             if (ce->above != None) {
       
  5105                 __ArrayInstPtr(eventArr)->a_element[8] = t = __MKEXTERNALADDRESS(ce->above); __STORE(eventArr, t);
       
  5106             }
       
  5107             RETURN (true);
       
  5108 
       
  5109         case GravityNotify:
       
  5110             __ArrayInstPtr(eventArr)->a_element[2] = @symbol(gravityNotify:x:y:);
       
  5111             __ArrayInstPtr(eventArr)->a_element[3] = __mkSmallInteger(gre->x);
       
  5112             __ArrayInstPtr(eventArr)->a_element[4] = __mkSmallInteger(gre->y);
       
  5113             RETURN (true);
       
  5114             break;
       
  5115 
       
  5116         case ResizeRequest:
       
  5117             __ArrayInstPtr(eventArr)->a_element[2] = @symbol(resizeRequest:width:height:);
       
  5118             __ArrayInstPtr(eventArr)->a_element[3] = __mkSmallInteger(rr->width);
       
  5119             __ArrayInstPtr(eventArr)->a_element[4] = __mkSmallInteger(rr->height);
       
  5120             RETURN (true);
       
  5121             break;
       
  5122 
       
  5123         case ConfigureRequest:
       
  5124             __ArrayInstPtr(eventArr)->a_element[2] = @symbol(configureRequest:x:y:width:height:above:detail:);
       
  5125             __ArrayInstPtr(eventArr)->a_element[3] = __mkSmallInteger(cr->x);
       
  5126             __ArrayInstPtr(eventArr)->a_element[4] = __mkSmallInteger(cr->y);
       
  5127             __ArrayInstPtr(eventArr)->a_element[5] = __mkSmallInteger(cr->width);
       
  5128             __ArrayInstPtr(eventArr)->a_element[6] = __mkSmallInteger(cr->height);
       
  5129             __ArrayInstPtr(eventArr)->a_element[7] = nil;
       
  5130             if (cr->above != None) {
       
  5131                 __ArrayInstPtr(eventArr)->a_element[7] = t = __MKEXTERNALADDRESS(cr->above); __STORE(eventArr, t);
       
  5132             }
       
  5133             switch (cr->detail) {
       
  5134                 case Above:
       
  5135                     __ArrayInstPtr(eventArr)->a_element[8] = @symbol(above);
       
  5136                     break;
       
  5137                 case Below:
       
  5138                     __ArrayInstPtr(eventArr)->a_element[8] = @symbol(below);
       
  5139                     break;
       
  5140                 case TopIf:
       
  5141                     __ArrayInstPtr(eventArr)->a_element[8] = @symbol(topIf);
       
  5142                     break;
       
  5143                 case BottomIf:
       
  5144                     __ArrayInstPtr(eventArr)->a_element[8] = @symbol(bottomIf);
       
  5145                     break;
       
  5146                 case Opposite:
       
  5147                     __ArrayInstPtr(eventArr)->a_element[8] = @symbol(opposite);
       
  5148                     break;
       
  5149                 default:
       
  5150                     __ArrayInstPtr(eventArr)->a_element[8] = nil;
       
  5151                     break;
       
  5152             }
       
  5153             RETURN (true);
       
  5154             break;
       
  5155 
       
  5156         case CirculateNotify:
       
  5157             __ArrayInstPtr(eventArr)->a_element[2] = @symbol(circulateNotify:place:);
       
  5158             goto circulate;
       
  5159 
       
  5160         case CirculateRequest:
       
  5161             __ArrayInstPtr(eventArr)->a_element[2] = @symbol(circulateNotify:place:);
       
  5162             /* fall into */
       
  5163         circulate:
       
  5164             switch (cie->place) {
       
  5165                 case PlaceOnTop:
       
  5166                     __ArrayInstPtr(eventArr)->a_element[3] = @symbol(placeOnTop);
       
  5167                     break;
       
  5168                 case PlaceOnBottom:
       
  5169                     __ArrayInstPtr(eventArr)->a_element[3] = @symbol(placeOnBottom);
       
  5170                     break;
       
  5171                 default:
       
  5172                     __ArrayInstPtr(eventArr)->a_element[3] = nil;
       
  5173                     break;
       
  5174             }
       
  5175             RETURN (true);
       
  5176             break;
       
  5177 
       
  5178         case PropertyNotify:
       
  5179             __ArrayInstPtr(eventArr)->a_element[2] = @symbol(propertyChange:atom:state:time:);
       
  5180             __ArrayInstPtr(eventArr)->a_element[3] = t = __MKUINT(pe->atom); __STORE(eventArr, t);
       
  5181             switch (pe->state) {
       
  5182                 case PropertyNewValue:
       
  5183                     __ArrayInstPtr(eventArr)->a_element[4] = @symbol(newValue);
       
  5184                     break;
       
  5185                 case PropertyDelete:
       
  5186                     __ArrayInstPtr(eventArr)->a_element[4] = @symbol(deleted);
       
  5187                     break;
       
  5188                 default:
       
  5189                     __ArrayInstPtr(eventArr)->a_element[4] = nil;
       
  5190                     break;
       
  5191             }
       
  5192             __ArrayInstPtr(eventArr)->a_element[3] = t = __MKUINT(pe->time); __STORE(eventArr, t);
       
  5193             RETURN (true);
       
  5194             break;
       
  5195 
       
  5196         case SelectionClear:
       
  5197             __ArrayInstPtr(eventArr)->a_element[2] = @symbol(propertyChange:atom:time:);
       
  5198             __ArrayInstPtr(eventArr)->a_element[3] = t = __MKUINT(sce->selection); __STORE(eventArr, t);
       
  5199             __ArrayInstPtr(eventArr)->a_element[4] = t = __MKUINT(sce->time);      __STORE(eventArr, t);
       
  5200             RETURN (true);
       
  5201             break;
       
  5202 
       
  5203         case SelectionRequest:
       
  5204             /*
       
  5205              * someone wants the selection
       
  5206              */
       
  5207             __ArrayInstPtr(eventArr)->a_element[2] = @symbol(selectionRequest:requestor:selection:target:property:time:);
       
  5208             __ArrayInstPtr(eventArr)->a_element[3] = t = __MKUINT(ev->xselectionrequest.requestor); __STORE(eventArr, t);
       
  5209             __ArrayInstPtr(eventArr)->a_element[4] = t = __MKUINT(ev->xselectionrequest.selection); __STORE(eventArr, t);
       
  5210             __ArrayInstPtr(eventArr)->a_element[5] = t = __MKUINT(ev->xselectionrequest.target);    __STORE(eventArr, t);
       
  5211             __ArrayInstPtr(eventArr)->a_element[6] = t = __MKUINT(ev->xselectionrequest.property);  __STORE(eventArr, t);
       
  5212             __ArrayInstPtr(eventArr)->a_element[7] = t = __MKUINT(ev->xselectionrequest.time);      __STORE(eventArr, t);
       
  5213             RETURN (true);
       
  5214 
       
  5215         case SelectionNotify:
       
  5216             /*
       
  5217              * returned selection value (answer from SelectionRequest)
       
  5218              */
       
  5219             __ArrayInstPtr(eventArr)->a_element[2] = @symbol(selectionNotify:selection:target:property:time:);
       
  5220             __ArrayInstPtr(eventArr)->a_element[3] = t = __MKUINT(ev->xselectionrequest.selection); __STORE(eventArr, t);
       
  5221             __ArrayInstPtr(eventArr)->a_element[4] = t = __MKUINT(ev->xselectionrequest.target);    __STORE(eventArr, t);
       
  5222             __ArrayInstPtr(eventArr)->a_element[5] = t = __MKUINT(ev->xselectionrequest.property);  __STORE(eventArr, t);
       
  5223             __ArrayInstPtr(eventArr)->a_element[6] = t = __MKUINT(ev->xselectionrequest.time);      __STORE(eventArr, t);
       
  5224             RETURN (true);
       
  5225 
       
  5226         case ColormapNotify:
       
  5227             __ArrayInstPtr(eventArr)->a_element[2] = @symbol(colormapNotify:state:);
       
  5228             __ArrayInstPtr(eventArr)->a_element[3] = cme->state == ColormapInstalled ? true : false;
       
  5229             RETURN (true);
       
  5230             break;
       
  5231 
       
  5232         case ClientMessage:
       
  5233             if (ev->xclient.message_type == (int) _AtomVal(__INST(protocolsAtom))) {
       
  5234                 if ((ev->xclient.data.l[0] == (int) _AtomVal(__INST(quitAppAtom)))
       
  5235                  || (ev->xclient.data.l[0] == (int) _AtomVal(__INST(deleteWindowAtom)))) {
       
  5236                     __ArrayInstPtr(eventArr)->a_element[2] = @symbol(terminateView:);
       
  5237                     RETURN (true);
       
  5238                 }
       
  5239                 if (ev->xclient.data.l[0] == (int) _AtomVal(__INST(saveYourselfAtom))) {
       
  5240                     __ArrayInstPtr(eventArr)->a_element[2] = @symbol(saveAndTerminateView:);
       
  5241                     RETURN (true);
       
  5242                 }
       
  5243             }
       
  5244             /*
       
  5245              * any other client message
       
  5246              */
       
  5247             __ArrayInstPtr(eventArr)->a_element[2] = @symbol(clientMessage:type:format:data:);
       
  5248             __ArrayInstPtr(eventArr)->a_element[3] = __MKSMALLINT(ev->xclient.message_type);
       
  5249             __ArrayInstPtr(eventArr)->a_element[4] = __MKSMALLINT(ev->xclient.format);
       
  5250             __ArrayInstPtr(eventArr)->a_element[5] = t = __MKBYTEARRAY(ev->xclient.data, sizeof(ev->xclient.data)); __STORE(eventArr, t);
       
  5251             RETURN (true);
       
  5252             break;
       
  5253 
       
  5254         case MappingNotify:
       
  5255             switch(mape->request) {
       
  5256                 case MappingModifier:
       
  5257                     __ArrayInstPtr(eventArr)->a_element[2] = @symbol(mappingModifier:);
       
  5258                     break;
       
  5259                 case MappingKeyboard:
       
  5260                     __ArrayInstPtr(eventArr)->a_element[2] = @symbol(mappingKeyboard:);
       
  5261                     break;
       
  5262                 case MappingPointer:
       
  5263                     __ArrayInstPtr(eventArr)->a_element[2] = @symbol(mappingPointer:);
       
  5264                     break;
       
  5265                 default:
       
  5266                     arg = nil;
       
  5267                     break;
       
  5268             }
       
  5269             RETURN (true);
       
  5270 
       
  5271         case KeymapNotify:
       
  5272             __ArrayInstPtr(eventArr)->a_element[2] = @symbol(keymapNotify:);
       
  5273             RETURN (true);
       
  5274             break;
       
  5275 
       
  5276         case MapRequest:
       
  5277             __ArrayInstPtr(eventArr)->a_element[2] = @symbol(mapRequest:);
       
  5278             RETURN (true);
       
  5279 
       
  5280         case ReparentNotify:
       
  5281             __ArrayInstPtr(eventArr)->a_element[2] = @symbol(reparentedView:);
       
  5282             break;
       
  5283 
       
  5284 
       
  5285     }
       
  5286 #undef ae
       
  5287 #undef ee
       
  5288 #undef ke
       
  5289 #undef be
       
  5290 #undef ce
       
  5291 #undef cr
       
  5292 #undef cre
       
  5293 #undef cle
       
  5294 #undef gre
       
  5295 #undef me
       
  5296 #undef ewe
       
  5297 #undef ele
       
  5298 #undef lwe
       
  5299 #undef de
       
  5300 #undef mape
       
  5301 #undef ve
       
  5302 #undef fe
       
  5303 #undef rr
       
  5304 #undef pe
       
  5305 #undef sce
       
  5306 #undef cme
       
  5307 %}.
       
  5308     ^ true
       
  5309 !
       
  5310 
  4689 defaultEventMask
  5311 defaultEventMask
  4690     "return a mask to enable some events by default."
  5312     "return a mask to enable some events by default."
  4691 
  5313 
  4692 %{  /* NOCONTEXT */
  5314 %{  /* NOCONTEXT */
  4693     RETURN (__MKSMALLINT( ExposureMask | StructureNotifyMask |
  5315     RETURN (__MKSMALLINT( ExposureMask | StructureNotifyMask |
  4704      If the argument aViewIdOrNil is nil, events for any view are processed,
  5326      If the argument aViewIdOrNil is nil, events for any view are processed,
  4705      otherwise only events for the view with given id are processed.
  5327      otherwise only events for the view with given id are processed.
  4706      If the argument aMask is nonNil, only events for this eventMask are
  5328      If the argument aMask is nonNil, only events for this eventMask are
  4707      handled.
  5329      handled.
  4708      WARNING: this may block to wait for an event - you better check for a 
  5330      WARNING: this may block to wait for an event - you better check for a 
  4709 	      pending event before calling this."
  5331               pending event before calling this."
  4710 
  5332 
  4711     (self getEventFor:aViewIdOrNil withMask:eventMask) ifTrue:[
  5333     (self getEventFor:aViewIdOrNil withMask:eventMask) ifTrue:[
  4712 	AbortSignal handle:[:ex |
  5334         AbortSignal handle:[:ex |
  4713 	    ex return
  5335             ex return
  4714 	] do:[
  5336         ] do:[
  4715 	    self dispatchLastEvent.
  5337             self newDispatchLastEvent.
  4716 	]
  5338         ]
  4717     ].
  5339     ].
  4718 
  5340 
  4719     "Modified: 19.8.1997 / 17:10:42 / cg"
  5341     "Modified: 19.8.1997 / 17:10:42 / cg"
  4720 !
  5342 !
  4721 
  5343 
  5397 #undef mape
  6019 #undef mape
  5398 %}.
  6020 %}.
  5399     ^ true
  6021     ^ true
  5400 !
  6022 !
  5401 
  6023 
       
  6024 dispatchLastEvent:evArray
       
  6025     |viewId view evTypeNr evType arguments|
       
  6026 
       
  6027     viewId := evArray at:1.
       
  6028     viewId notNil ifTrue:[
       
  6029         viewId = lastId ifTrue:[
       
  6030             view := lastView
       
  6031         ] ifFalse:[
       
  6032             view := self viewFromId:viewId
       
  6033         ].
       
  6034     ].
       
  6035 
       
  6036     evType := evArray at:3.
       
  6037 
       
  6038     (self respondsTo:evType) ifTrue:[
       
  6039         arguments := evArray copyFrom:3 to:(3 + evType numArgs - 1).
       
  6040         arguments at:1 put:view.
       
  6041 
       
  6042         self perform:evType withArguments:arguments.
       
  6043         ^ true.
       
  6044     ].
       
  6045 '********** unhandled event:' errorPrintCR.
       
  6046 evType errorPrintCR.
       
  6047 '********** see newDispatchLastEvent' errorPrintCR.
       
  6048     ^ false
       
  6049 
       
  6050 !
       
  6051 
  5402 dispatchPendingEvents
  6052 dispatchPendingEvents
  5403     "central event handling method for modal operation.
  6053     "central event handling method for modal operation.
  5404      (i.e. this is now only used in the modal debugger)
  6054      (i.e. this is now only used in the modal debugger)
  5405      Dispatch any pending events; return when no more are pending.
  6055      Dispatch any pending events; return when no more are pending.
  5406      This code is somewhat special, since X has a concept of graphic
  6056      This code is somewhat special, since X has a concept of graphic
  5408      we only handle exposes until the graphicsExpose arrives.
  6058      we only handle exposes until the graphicsExpose arrives.
  5409      Other systems may not need such a kludge"
  6059      Other systems may not need such a kludge"
  5410 
  6060 
  5411     "interested in exposes only ?"
  6061     "interested in exposes only ?"
  5412     dispatchingExpose notNil ifTrue:[
  6062     dispatchingExpose notNil ifTrue:[
  5413 	[self exposeEventPendingFor:dispatchingExpose withSync:false] whileTrue:[
  6063         [self exposeEventPendingFor:dispatchingExpose withSync:false] whileTrue:[
  5414 	    self dispatchExposeEventFor:dispatchingExpose
  6064             self dispatchExposeEventFor:dispatchingExpose
  5415 	].
  6065         ].
  5416 	^ self
  6066         ^ self
  5417     ].
  6067     ].
  5418 
  6068 
  5419     [self eventPendingWithSync:false] whileTrue:[
  6069     [self eventPendingWithSync:false] whileTrue:[
  5420 	(self getEventFor:nil withMask:nil) ifTrue:[
  6070         (self getEventFor:nil withMask:nil) ifTrue:[
  5421 	    AbortSignal handle:[:ex |
  6071             AbortSignal handle:[:ex |
  5422 		ex return
  6072                 ex return
  5423 	    ] do:[
  6073             ] do:[
  5424 		self dispatchLastEvent
  6074                 self newDispatchLastEvent
  5425 	    ]
  6075             ]
  5426 	].
  6076         ].
  5427     ]
  6077     ]
  5428 
  6078 
  5429     "Modified: 19.8.1997 / 17:11:18 / cg"
  6079     "Modified: 19.8.1997 / 17:11:18 / cg"
  5430 !
  6080 !
  5431 
  6081 
  5729 	"Maybe some of our modifiers have been changed"
  6379 	"Maybe some of our modifiers have been changed"
  5730 	self initializeModifierMappings.
  6380 	self initializeModifierMappings.
  5731     ].
  6381     ].
  5732 
  6382 
  5733     "Created: 1.12.1995 / 16:28:23 / stefan"
  6383     "Created: 1.12.1995 / 16:28:23 / stefan"
       
  6384 !
       
  6385 
       
  6386 newDispatchLastEvent
       
  6387     |arr|
       
  6388 
       
  6389     arr := Array new:13.
       
  6390     self decomposeLastEventInto:arr.
       
  6391     (self dispatchLastEvent:arr) ifFalse:[
       
  6392         self dispatchLastEvent
       
  6393     ]
  5734 !
  6394 !
  5735 
  6395 
  5736 setEventMask:aMask in:aWindowId
  6396 setEventMask:aMask in:aWindowId
  5737     "tell X that we are only interested in events from aMask, which
  6397     "tell X that we are only interested in events from aMask, which
  5738      is the bitwise or of the eventMask bits (see 'eventMaskFor:')"
  6398      is the bitwise or of the eventMask bits (see 'eventMaskFor:')"
  8206     "
  8866     "
  8207 
  8867 
  8208     altModifierMask := aSmallInteger
  8868     altModifierMask := aSmallInteger
  8209 !
  8869 !
  8210 
  8870 
       
  8871 ctrlModifierMask
       
  8872     "return the Xlib mask bit for the control modifier key"
       
  8873 
       
  8874 %{  /* NOCONTEXT */
       
  8875     RETURN (__MKSMALLINT(ControlMask));
       
  8876 %}
       
  8877 !
       
  8878 
  8211 metaModifierMask
  8879 metaModifierMask
  8212     "return the mask (in motionEvents) for the meta-key modifier.
  8880     "return the mask (in motionEvents) for the meta-key modifier.
  8213      Notice: ST/X may use the left ALT key as CMD/Meta key,
  8881      Notice: ST/X may use the left ALT key as CMD/Meta key,
  8214      therefore return a variable here, which can be changed during startup."
  8882      therefore return a variable here, which can be changed during startup."
  8215 
  8883 
  8316     ^ modifierKeyMap 
  8984     ^ modifierKeyMap 
  8317 
  8985 
  8318     "
  8986     "
  8319 	Display rawModifierMapping
  8987 	Display rawModifierMapping
  8320     "
  8988     "
       
  8989 !
       
  8990 
       
  8991 shiftModifierMask
       
  8992     "return the Xlib mask bit for the shift modifier key"
       
  8993 
       
  8994 %{  /* NOCONTEXT */
       
  8995     RETURN (__MKSMALLINT(ShiftMask));
       
  8996 %}
  8321 !
  8997 !
  8322 
  8998 
  8323 stringFromKeycode:code
  8999 stringFromKeycode:code
  8324     "Get a KeySymbol (a smalltalk symbol) from the keycode."
  9000     "Get a KeySymbol (a smalltalk symbol) from the keycode."
  8325 
  9001 
 10546 ! !
 11222 ! !
 10547 
 11223 
 10548 !XWorkstation class methodsFor:'documentation'!
 11224 !XWorkstation class methodsFor:'documentation'!
 10549 
 11225 
 10550 version
 11226 version
 10551     ^ '$Header: /cvs/stx/stx/libview/XWorkstation.st,v 1.360 2000-07-10 16:50:02 cg Exp $'
 11227     ^ '$Header: /cvs/stx/stx/libview/XWorkstation.st,v 1.361 2000-07-11 13:40:18 cg Exp $'
 10552 ! !
 11228 ! !
 10553 XWorkstation initialize!
 11229 XWorkstation initialize!