21 stringAtom lengthAtom |
21 stringAtom lengthAtom |
22 listOfXFonts buttonsPressed |
22 listOfXFonts buttonsPressed |
23 eventRootX eventRootY |
23 eventRootX eventRootY |
24 displayName eventTrace |
24 displayName eventTrace |
25 dispatchingExpose |
25 dispatchingExpose |
26 rgbVisual virtualRootId' |
26 rgbVisual virtualRootId |
|
27 eventBuffer' |
27 classVariableNames: '' |
28 classVariableNames: '' |
28 poolDictionaries:'' |
29 poolDictionaries:'' |
29 category:'Interface-Graphics' |
30 category:'Interface-Graphics' |
30 ! |
31 ! |
31 |
32 |
32 XWorkstation comment:' |
33 XWorkstation comment:' |
33 COPYRIGHT (c) 1989 by Claus Gittinger |
34 COPYRIGHT (c) 1989 by Claus Gittinger |
34 All Rights Reserved |
35 All Rights Reserved |
35 |
36 |
36 $Header: /cvs/stx/stx/libview/XWorkstation.st,v 1.40 1995-04-11 15:55:56 claus Exp $ |
37 $Header: /cvs/stx/stx/libview/XWorkstation.st,v 1.41 1995-05-03 00:27:22 claus Exp $ |
37 '! |
38 '! |
38 |
39 |
39 !XWorkstation class methodsFor:'documentation'! |
40 !XWorkstation class methodsFor:'documentation'! |
40 |
41 |
41 copyright |
42 copyright |
419 _INST(height) = _MKSMALLINT(DisplayHeight(dpy, scr)); |
414 _INST(height) = _MKSMALLINT(DisplayHeight(dpy, scr)); |
420 _INST(widthMM) = _MKSMALLINT(DisplayWidthMM(dpy, scr)); |
415 _INST(widthMM) = _MKSMALLINT(DisplayWidthMM(dpy, scr)); |
421 _INST(heightMM) = _MKSMALLINT(DisplayHeightMM(dpy, scr)); |
416 _INST(heightMM) = _MKSMALLINT(DisplayHeightMM(dpy, scr)); |
422 _INST(blackpixel) = _MKSMALLINT(BlackPixel(dpy, scr)); |
417 _INST(blackpixel) = _MKSMALLINT(BlackPixel(dpy, scr)); |
423 _INST(whitepixel) = _MKSMALLINT(WhitePixel(dpy, scr)); |
418 _INST(whitepixel) = _MKSMALLINT(WhitePixel(dpy, scr)); |
|
419 |
424 #ifdef SHAPE |
420 #ifdef SHAPE |
425 if (XShapeQueryExtension(dpy, &shapeEventBase, &shapeErrorBase)) |
421 if (XShapeQueryExtension(dpy, &shapeEventBase, &shapeErrorBase)) |
426 _INST(hasShapeExtension) = true; |
422 _INST(hasShapeExtension) = true; |
427 else |
423 else |
428 #else |
424 #endif |
429 _INST(hasShapeExtension) = false; |
425 _INST(hasShapeExtension) = false; |
430 #endif |
426 |
431 #ifdef SHM |
427 #ifdef SHM |
432 if (XShmQueryExtension(dpy, &shmEventBase, &shmErrorBase)) |
428 if (XShmQueryExtension(dpy, &shmEventBase, &shmErrorBase)) |
433 _INST(hasShmExtension) = true; |
429 _INST(hasShmExtension) = true; |
434 else |
430 else |
435 #else |
431 #endif |
436 _INST(hasShmExtension) = false; |
432 _INST(hasShmExtension) = false; |
437 #endif |
433 |
438 #ifdef FAX |
434 #ifdef FAX |
439 if (XFAXImageQueryExtension(dpy, &faxEventBase, &faxErrorBase)) |
435 if (XFAXImageQueryExtension(dpy, &faxEventBase, &faxErrorBase)) |
440 _INST(hasFaxExtension) = true; |
436 _INST(hasFaxExtension) = true; |
441 else |
437 else |
442 #else |
438 #endif |
443 _INST(hasFaxExtension) = false; |
439 _INST(hasFaxExtension) = false; |
444 #endif |
440 |
445 #ifdef DPS |
441 #ifdef DPS |
446 if (XQueryExtension(dpy, "DPSExtension", &dummy, &dummy, &dummy)) |
442 if (XQueryExtension(dpy, "DPSExtension", &dummy, &dummy, &dummy)) |
447 _INST(hasDPSExtension) = true; |
443 _INST(hasDPSExtension) = true; |
448 else |
444 else |
449 #else |
445 #endif |
450 _INST(hasDPSExtension) = false; |
446 _INST(hasDPSExtension) = false; |
451 #endif |
|
452 /* |
|
453 * this is a kludge around a bug in the X11/NeWS server, |
|
454 * which does not correctly handle saveUnder |
|
455 */ |
|
456 if (strncmp(XServerVendor(dpy), "X11/NeWS", 8) == 0) { |
|
457 _INST(hasSaveUnder) = false; |
|
458 } else |
|
459 _INST(hasSaveUnder) = true; |
|
460 |
447 |
461 /* |
448 /* |
462 * look for RGB visual |
449 * look for RGB visual |
463 */ |
450 */ |
464 nvi = 0; |
451 nvi = 0; |
585 protocolsAtom := nil. |
572 protocolsAtom := nil. |
586 deleteWindowAtom := nil. |
573 deleteWindowAtom := nil. |
587 saveYourselfAtom := nil. |
574 saveYourselfAtom := nil. |
588 quitAppAtom := nil. |
575 quitAppAtom := nil. |
589 |
576 |
|
577 self initializeEventBuffer. |
|
578 self initializeSpecialFlags. |
590 self initializeKeyboardMap. |
579 self initializeKeyboardMap. |
591 |
580 |
592 ObjectMemory errorInterruptHandler:self class. |
581 ObjectMemory errorInterruptHandler:self class. |
|
582 ! |
|
583 |
|
584 initializeEventBuffer |
|
585 |sz| |
|
586 |
|
587 %{ |
|
588 sz = _MKSMALLINT(sizeof(XEvent) + 100); |
|
589 %}. |
|
590 eventBuffer := ByteArray new:sz. |
|
591 ! |
|
592 |
|
593 initializeSpecialFlags |
|
594 "perform additional special server implementation flags" |
|
595 |
|
596 "/ |
|
597 "/ assume we have it ... (should check) |
|
598 "/ |
|
599 hasSaveUnder := true. |
|
600 ignoreBackingStore := false. |
|
601 |
|
602 (self serverVendor = 'X11/NeWS') ifTrue:[ |
|
603 "/ |
|
604 "/ this is a kludge around a bug in the X11/NeWS server, |
|
605 "/ which does not correctly handle saveUnder |
|
606 "/ |
|
607 hasSaveUnder := false. |
|
608 ]. |
593 ! |
609 ! |
594 |
610 |
595 close |
611 close |
596 "close down the connection to the X-server" |
612 "close down the connection to the X-server" |
597 |
613 |
2728 len = XTextWidth(f, cp, n); |
2759 len = XTextWidth(f, cp, n); |
2729 END_INTERRUPTSBLOCKED |
2760 END_INTERRUPTSBLOCKED |
2730 RETURN ( _MKSMALLINT(len) ); |
2761 RETURN ( _MKSMALLINT(len) ); |
2731 } |
2762 } |
2732 #ifdef TWOBYTESTRINGS |
2763 #ifdef TWOBYTESTRINGS |
2733 if (_Class(aString) == TwoByteString) { |
2764 if (__Class(aString) == TwoByteString) { |
2734 n = _byteArraySize(aString) / 2; |
2765 n = _byteArraySize(aString) / 2; |
2735 cp = (char *) _stringVal(aString); |
2766 cp = (char *) _stringVal(aString); |
2736 BEGIN_INTERRUPTSBLOCKED |
2767 BEGIN_INTERRUPTSBLOCKED |
2737 len = XTextWidth16(f, (XChar2b *)cp, n); |
2768 len = XTextWidth16(f, (XChar2b *)cp, n); |
2738 END_INTERRUPTSBLOCKED |
2769 END_INTERRUPTSBLOCKED |
4678 |
4709 |
4679 if (__bothSmallInteger(aGCId, aDrawableId) |
4710 if (__bothSmallInteger(aGCId, aDrawableId) |
4680 && __isNonNilObject(aString) |
4711 && __isNonNilObject(aString) |
4681 && __bothSmallInteger(index1, index2) |
4712 && __bothSmallInteger(index1, index2) |
4682 && __bothSmallInteger(x, y)) { |
4713 && __bothSmallInteger(x, y)) { |
4683 cls = _qClass(aString); |
4714 cls = __qClass(aString); |
4684 if ((cls == String) || (cls == Symbol)) { |
4715 if ((cls == String) || (cls == Symbol)) { |
4685 i1 = _intVal(index1) - 1; |
4716 i1 = _intVal(index1) - 1; |
4686 i2 = _intVal(index2) - 1; |
4717 i2 = _intVal(index2) - 1; |
4687 n = _stringSize(aString); |
4718 n = _stringSize(aString); |
4688 cp = _stringVal(aString); |
4719 cp = _stringVal(aString); |
5401 ] |
5432 ] |
5402 ]. |
5433 ]. |
5403 ! |
5434 ! |
5404 |
5435 |
5405 getEventFor:aViewIdOrNil withMask:eventMask |
5436 getEventFor:aViewIdOrNil withMask:eventMask |
5406 "read next event - put into local buffer. If aViewIdOrNil is |
5437 "read next event - put into local eventBuffer. |
5407 nil, events for any view are fetched; otherwise only events for that |
5438 If aViewIdOrNil is nil, events for any view are fetched; |
5408 view will be processed. |
5439 otherwise only events for that specific view will be fetched. |
|
5440 Returns true, if there was an event, false otherwise. |
|
5441 This method may block - so you better check for pending events |
|
5442 before calling for it. |
5409 |
5443 |
5410 Sorry I had to split dispatch into this fetch method and an extra |
5444 Sorry I had to split dispatch into this fetch method and an extra |
5411 handle method to allow unlimitedstack here. |
5445 handle method to allow unlimitedstack here. |
5412 (some Xlibs do a big alloca there ...) which cannot be done in |
5446 (some Xlibs do a big alloca there ...) which cannot be done in |
5413 dispatchLastEvent, since it dispatches out into ST-methods. |
5447 dispatchLastEvent, since it dispatches out into ST-methods. |
5418 %{ /* UNLIMITEDSTACK */ |
5452 %{ /* UNLIMITEDSTACK */ |
5419 |
5453 |
5420 Display *dpy = myDpy; |
5454 Display *dpy = myDpy; |
5421 Window win, wWanted; |
5455 Window win, wWanted; |
5422 int evMask; |
5456 int evMask; |
5423 |
5457 OBJ eB; |
5424 __ev__.type = 0; |
5458 XEvent *ev; |
|
5459 |
|
5460 eB = _INST(eventBuffer); |
|
5461 if (__isByteArray(eB)) { |
|
5462 ev = (XEvent *)(_ByteArrayInstPtr(eB)->ba_element); |
|
5463 } else { |
|
5464 printf("DISPLAY: no eventBuffer\n"); |
|
5465 RETURN (false); |
|
5466 } |
|
5467 ev->type = 0; |
5425 |
5468 |
5426 if (__isSmallInteger(eventMask)) { |
5469 if (__isSmallInteger(eventMask)) { |
5427 evMask = _intVal(eventMask); |
5470 evMask = _intVal(eventMask); |
5428 } else { |
5471 } else { |
5429 evMask = ~0; |
5472 evMask = ~0; |
5430 } |
5473 } |
5431 |
5474 |
5432 if (__isSmallInteger(aViewIdOrNil)) { |
5475 if (__isSmallInteger(aViewIdOrNil)) { |
5433 wWanted = _WindowVal(aViewIdOrNil); |
5476 wWanted = _WindowVal(aViewIdOrNil); |
5434 if (XCheckWindowEvent(dpy, wWanted, evMask, &__ev__)) { |
5477 if (XCheckWindowEvent(dpy, wWanted, evMask, ev)) { |
5435 RETURN ( true ); |
5478 RETURN ( true ); |
5436 } |
5479 } |
5437 } else { |
5480 } else { |
5438 if (evMask == ~0) { |
5481 if (evMask == ~0) { |
5439 XNextEvent(dpy, &__ev__); |
5482 XNextEvent(dpy, ev); |
5440 RETURN (true); |
5483 RETURN (true); |
5441 } |
5484 } |
5442 if (XCheckMaskEvent(dpy, evMask, &__ev__)) { |
5485 if (XCheckMaskEvent(dpy, evMask, ev)) { |
5443 RETURN (true); |
5486 RETURN (true); |
5444 } |
5487 } |
5445 } |
5488 } |
5446 %}. |
5489 %}. |
5447 ^ false |
5490 ^ false |
5452 |
5495 |
5453 %{ /* STACK: 8000 */ |
5496 %{ /* STACK: 8000 */ |
5454 # define ANYBUTTON (Button1MotionMask | Button2MotionMask | Button3MotionMask) |
5497 # define ANYBUTTON (Button1MotionMask | Button2MotionMask | Button3MotionMask) |
5455 |
5498 |
5456 Display *dpy = myDpy; |
5499 Display *dpy = myDpy; |
5457 |
5500 OBJ eB; |
5458 XAnyEvent *ae = (XAnyEvent *)&__ev__; |
5501 XEvent *ev; |
5459 # define ee ((XExposeEvent *)&__ev__) |
5502 |
5460 # define ke ((XKeyPressedEvent *)&__ev__) |
5503 # define ae ((XAnyEvent *)ev) |
5461 # define be ((XButtonPressedEvent *)&__ev__) |
5504 # define ee ((XExposeEvent *)ev) |
5462 # define ce ((XConfigureEvent *)&__ev__) |
5505 # define ke ((XKeyPressedEvent *)ev) |
5463 # define me ((XMotionEvent *)&__ev__) |
5506 # define be ((XButtonPressedEvent *)ev) |
5464 # define ewe ((XEnterWindowEvent *)&__ev__) |
5507 # define ce ((XConfigureEvent *)ev) |
5465 # define lwe ((XLeaveWindowEvent *)&__ev__) |
5508 # define me ((XMotionEvent *)ev) |
5466 # define de ((XDestroyWindowEvent *)&__ev__) |
5509 # define ewe ((XEnterWindowEvent *)ev) |
5467 # define ve ((XVisibilityEvent *)&__ev__) |
5510 # define lwe ((XLeaveWindowEvent *)ev) |
|
5511 # define de ((XDestroyWindowEvent *)ev) |
|
5512 # define ve ((XVisibilityEvent *)ev) |
|
5513 |
5468 KeySym keySym; |
5514 KeySym keySym; |
5469 unsigned char buffer[10]; |
5515 unsigned char buffer[10]; |
5470 int i, nchars; |
5516 int i, nchars; |
5471 char *keySymString; |
5517 char *keySymString; |
5472 char keySymStringBuffer[32]; |
5518 char keySymStringBuffer[32]; |
5765 sibling); |
5819 sibling); |
5766 } |
5820 } |
5767 break; |
5821 break; |
5768 |
5822 |
5769 case ClientMessage: |
5823 case ClientMessage: |
5770 if (__ev__.xclient.message_type == (int) _AtomVal(_INST(protocolsAtom))) { |
5824 if (ev->xclient.message_type == (int) _AtomVal(_INST(protocolsAtom))) { |
5771 if ((__ev__.xclient.data.l[0] == (int) _AtomVal(_INST(quitAppAtom))) |
5825 if ((ev->xclient.data.l[0] == (int) _AtomVal(_INST(quitAppAtom))) |
5772 || (__ev__.xclient.data.l[0] == (int) _AtomVal(_INST(deleteWindowAtom)))) { |
5826 || (ev->xclient.data.l[0] == (int) _AtomVal(_INST(deleteWindowAtom)))) { |
5773 (*termS.ilc_func)(self, |
5827 (*termS.ilc_func)(self, |
5774 @symbol(terminateView:) |
5828 @symbol(terminateView:) |
5775 COMMA_CON, nil, &termS, theView); |
5829 COMMA_CON, nil, &termS, theView); |
5776 break; |
5830 break; |
5777 } |
5831 } |
5778 if (__ev__.xclient.data.l[0] == (int) _AtomVal(_INST(saveYourselfAtom))) { |
5832 if (ev->xclient.data.l[0] == (int) _AtomVal(_INST(saveYourselfAtom))) { |
5779 (*savtermS.ilc_func)(self, |
5833 (*savtermS.ilc_func)(self, |
5780 @symbol(saveAndTerminateView:) |
5834 @symbol(saveAndTerminateView:) |
5781 COMMA_CON, nil, &savtermS, theView); |
5835 COMMA_CON, nil, &savtermS, theView); |
5782 break; |
5836 break; |
5783 } |
5837 } |
5854 |
5908 |
5855 case SelectionClear: |
5909 case SelectionClear: |
5856 (*selClear.ilc_func)(theView, |
5910 (*selClear.ilc_func)(theView, |
5857 @symbol(selectionClear:) |
5911 @symbol(selectionClear:) |
5858 COMMA_CON, nil, &selClear, |
5912 COMMA_CON, nil, &selClear, |
5859 MKOBJ(__ev__.xselectionclear.selection)); |
5913 MKOBJ(ev->xselectionclear.selection)); |
5860 break; |
5914 break; |
5861 |
5915 |
5862 case SelectionNotify: |
5916 case SelectionNotify: |
5863 /* |
5917 /* |
5864 * returned selection value (answer from SelectionRequest) |
5918 * returned selection value (answer from SelectionRequest) |
5865 */ |
5919 */ |
5866 DPRINTF(("SelectionNotify prop=%x target=%x selection= %x requestor=%x\n", |
5920 DPRINTF(("SelectionNotify prop=%x target=%x selection= %x requestor=%x\n", |
5867 __ev__.xselection.property, __ev__.xselection.target, |
5921 ev->xselection.property, ev->xselection.target, |
5868 __ev__.xselection.selection, __ev__.xselection.requestor)); |
5922 ev->xselection.selection, ev->xselection.requestor)); |
5869 |
5923 |
5870 (*selNotify.ilc_func)(theView, |
5924 (*selNotify.ilc_func)(theView, |
5871 @symbol(selectionNotify:target:selection:from:) |
5925 @symbol(selectionNotify:target:selection:from:) |
5872 COMMA_CON, nil, &selNotify, |
5926 COMMA_CON, nil, &selNotify, |
5873 MKOBJ(__ev__.xselection.property), |
5927 MKOBJ(ev->xselection.property), |
5874 MKOBJ(__ev__.xselection.target), |
5928 MKOBJ(ev->xselection.target), |
5875 MKOBJ(__ev__.xselection.selection), |
5929 MKOBJ(ev->xselection.selection), |
5876 MKOBJ(__ev__.xselection.requestor)); |
5930 MKOBJ(ev->xselection.requestor)); |
5877 break; |
5931 break; |
5878 |
5932 |
5879 case SelectionRequest: |
5933 case SelectionRequest: |
5880 /* |
5934 /* |
5881 * someone wants the selection |
5935 * someone wants the selection |
5882 */ |
5936 */ |
5883 DPRINTF(("SelectionRequest prop=%x target=%x selection=%x requestor=%x\n", |
5937 DPRINTF(("SelectionRequest prop=%x target=%x selection=%x requestor=%x\n", |
5884 __ev__.xselectionrequest.property, |
5938 ev->xselectionrequest.property, |
5885 __ev__.xselectionrequest.target, |
5939 ev->xselectionrequest.target, |
5886 __ev__.xselectionrequest.selection, |
5940 ev->xselectionrequest.selection, |
5887 __ev__.xselectionrequest.requestor)); |
5941 ev->xselectionrequest.requestor)); |
5888 |
5942 |
5889 (*selReq.ilc_func)(theView, |
5943 (*selReq.ilc_func)(theView, |
5890 @symbol(selectionRequest:target:selection:from:) |
5944 @symbol(selectionRequest:target:selection:from:) |
5891 COMMA_CON, nil, &selReq, |
5945 COMMA_CON, nil, &selReq, |
5892 MKOBJ(__ev__.xselectionrequest.property), |
5946 MKOBJ(ev->xselectionrequest.property), |
5893 MKOBJ(__ev__.xselectionrequest.target), |
5947 MKOBJ(ev->xselectionrequest.target), |
5894 MKOBJ(__ev__.xselectionrequest.selection), |
5948 MKOBJ(ev->xselectionrequest.selection), |
5895 MKOBJ(__ev__.xselectionrequest.requestor)); |
5949 MKOBJ(ev->xselectionrequest.requestor)); |
5896 break; |
5950 break; |
5897 |
5951 |
5898 case ColormapNotify: |
5952 case ColormapNotify: |
5899 (*colormap.ilc_func)(theView, |
5953 (*colormap.ilc_func)(theView, |
5900 @symbol(colorMapChange) |
5954 @symbol(colorMapChange) |