+++ /dev/null
-// Copyright (c) 1999-2012 OPEN CASCADE SAS
-//
-// The content of this file is subject to the Open CASCADE Technology Public
-// License Version 6.5 (the "License"). You may not use the content of this file
-// except in compliance with the License. Please obtain a copy of the License
-// at http://www.opencascade.org and read it completely before using this file.
-//
-// The Initial Developer of the Original Code is Open CASCADE S.A.S., having its
-// main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France.
-//
-// The Original Code and all software distributed under the License is
-// distributed on an "AS IS" basis, without warranty of any kind, and the
-// Initial Developer hereby disclaims all such warranties, including without
-// limitation, any warranties of merchantability, fitness for a particular
-// purpose or non-infringement. Please see the License for the specific terms
-// and conditions governing the rights and limitations under the License.
-
-
-#include <Xw_Extension.h>
-
-/* ifdef then trace on */
-#ifdef TRACE
-#define TRACE_WAIT_EVENT
-#endif
-
-/*
- STATUS Xw_wait_event (awindow)
- XW_EXT_WINDOW *awindow
-
- Wait any event activated by Xw_set_event in any Window
- and CALL the associated call_back routine if defined
- NOTE than if call_back returns ERROR this go outside the WAIT
- event loop .
-
- Returns ERROR always
-
-*/
-
-static XW_CALLBACK ecbk ;
-static XW_ICALLBACK icbk ;
-
-static char keystring[32] ;
-static KeySym modifier = 0 ;
-
-static XW_EVENT xwevent ;
-
-static Window LastEventWindow = 0 ;
-
-#ifdef XW_PROTOTYPE
-XW_STATUS Xw_wait_event (void* awindow)
-#else
-XW_STATUS Xw_wait_event (awindow)
-void *awindow ;
-#endif /*XW_PROTOTYPE*/
-{
-XW_EXT_WINDOW *pwindow = (XW_EXT_WINDOW*)awindow ;
-XEvent xevent ;
-XW_STATUS status = XW_SUCCESS ;
-XW_USERDATA *userdata ;
-int lstring,xbutton=0,ybutton=0,bbutton = 0,mbutton = False ;
-KeySym keysym ;
-XComposeStatus key_status ;
-
- if( !Xw_isdefine_window(pwindow) ) {
- /*ERROR*Bad EXT_WINDOW Address*/
- Xw_set_error(24,"Xw_wait_event",pwindow) ;
- return (XW_ERROR) ;
- }
-
- while ( status == XW_SUCCESS ) {
- XNextEvent(_DISPLAY,&xevent) ;
-
- xwevent.any.type = XW_ALLEVENT ;
- if( LastEventWindow != xevent.xany.window ) {
- LastEventWindow = xevent.xany.window ;
- xwevent.any.awindow = pwindow =
- Xw_get_window_structure(LastEventWindow) ;
- }
-
-#ifdef TRACE_WAIT_EVENT
-if( Xw_get_trace() > 3 ) {
- printf (" Xw_event(%lx,%d)\n",(long ) pwindow,xevent.type) ;
-}
-#endif
- if( pwindow ) {
- switch (xevent.type) {
- case KeyPress :
- lstring = XLookupString( &xevent.xkey,
- keystring, sizeof(keystring), &keysym , &key_status ) ;
- if( lstring ) {
- xwevent.any.type = XW_KEYBOARD ;
- xwevent.keyboard.modifier = modifier ;
- xwevent.keyboard.keycode = 0 ;
- xwevent.keyboard.state = True ;
- xwevent.keyboard.string = &keystring[0] ;
- xwevent.keyboard.x = xevent.xkey.x ;
- xwevent.keyboard.y = xevent.xkey.y ;
- } else {
- if( IsModifierKey(keysym) ) {
- modifier = keysym ;
- } else {
- xwevent.any.type = XW_KEYBOARD ;
- xwevent.keyboard.modifier = modifier ;
- xwevent.keyboard.keycode = keysym ;
- xwevent.keyboard.state = True ;
- xwevent.keyboard.string = NULL ;
- xwevent.keyboard.x = xevent.xkey.x ;
- xwevent.keyboard.y = xevent.xkey.y ;
- }
- }
- break ;
- case KeyRelease :
- lstring = XLookupString( &xevent.xkey,
- keystring, sizeof(keystring), &keysym , &key_status ) ;
- if( IsModifierKey(keysym) ) {
- modifier = 0 ;
- }
- break ;
- case ButtonPress :
- bbutton = xevent.xbutton.button ;
- xbutton = xevent.xbutton.x ;
- ybutton = xevent.xbutton.y ;
- mbutton = False ;
- if( xevent.xbutton.button == 1 )
- xwevent.any.type = XW_MOUSEBUTTON1 ;
- else if( xevent.xbutton.button == 2 )
- xwevent.any.type = XW_MOUSEBUTTON2 ;
- else if( xevent.xbutton.button == 3 )
- xwevent.any.type = XW_MOUSEBUTTON3 ;
- xwevent.mousebutton.button = bbutton ;
- xwevent.mousebutton.state = True ;
- xwevent.mousebutton.modifier = modifier ;
- xwevent.mousebutton.x = xbutton ;
- xwevent.mousebutton.y = ybutton ;
- break ;
- case ButtonRelease :
- if( mbutton ) {
- if( xevent.xbutton.button == 1 )
- xwevent.any.type = XW_MOUSEBUTTON1 ;
- else if( xevent.xbutton.button == 2 )
- xwevent.any.type = XW_MOUSEBUTTON2 ;
- else if( xevent.xbutton.button == 3 )
- xwevent.any.type = XW_MOUSEBUTTON3 ;
- xwevent.mousebutton.button = bbutton ;
- xwevent.mousebutton.state = False ;
- xwevent.mousebutton.modifier = modifier ;
- xwevent.mousebutton.x = xevent.xbutton.x ;
- xwevent.mousebutton.y = xevent.xbutton.y ;
- }
- bbutton = 0 ;
- mbutton = False ;
- break ;
- case MotionNotify :
- if( bbutton ) {
- int dx,dy ;
-
- while( XCheckTypedWindowEvent(_DISPLAY,LastEventWindow,
- MotionNotify,&xevent) ) ;
- if( !mbutton ) {
- dx = xevent.xmotion.x - xbutton ;
- dy = xevent.xmotion.y - ybutton ;
- if( (abs(dx) + abs(dy)) > 6 ) {
- mbutton = True ;
- }
- }
-
- if( mbutton ) {
- if( bbutton == 1 )
- xwevent.any.type = XW_MOUSEMOVEWITHBUTTON1 ;
- else if( bbutton == 2 )
- xwevent.any.type = XW_MOUSEMOVEWITHBUTTON2 ;
- else if( bbutton == 3 )
- xwevent.any.type = XW_MOUSEMOVEWITHBUTTON3 ;
- xwevent.mousemovewithbutton.button = bbutton ;
- xwevent.mousemovewithbutton.state = True ;
- xwevent.mousemovewithbutton.modifier = modifier ;
- xwevent.mousemovewithbutton.x = xevent.xmotion.x;
- xwevent.mousemovewithbutton.y = xevent.xmotion.y;
- }
- } else {
- while( XCheckTypedWindowEvent(_DISPLAY,LastEventWindow,
- MotionNotify,&xevent) ) ;
- xwevent.any.type = XW_MOUSEMOVE ;
- xwevent.mousemove.modifier = modifier ;
- xwevent.mousemove.x = xevent.xmotion.x ;
- xwevent.mousemove.y = xevent.xmotion.y ;
- }
- break ;
- case EnterNotify :
- xwevent.any.type = XW_ENTERWINDOW ;
- break ;
- case Expose :
- if( !xevent.xexpose.count ) {
- int x1 = xevent.xexpose.x ;
- int y1 = xevent.xexpose.y ;
- int x2 = x1 + xevent.xexpose.width ;
- int y2 = y1 + xevent.xexpose.height ;
-
- xwevent.any.type = XW_EXPOSEWINDOW ;
- xwevent.windowexpose.xc = (x1+x2)/2 ;
- xwevent.windowexpose.yc = (y1+y2)/2 ;
- xwevent.windowexpose.width = (x2-x1) ;
- xwevent.windowexpose.height = (y2-y1) ;
- while( XCheckWindowEvent(_DISPLAY,LastEventWindow,
- ExposureMask,&xevent) ) {
- if( !xevent.xexpose.count ) {
- int nx1 = xevent.xexpose.x ;
- int ny1 = xevent.xexpose.y ;
- int nx2 = nx1 + xevent.xexpose.width ;
- int ny2 = ny1 + xevent.xexpose.height ;
-
- x1 = min(x1,nx1) ; y1 = min(y1,ny1) ;
- x2 = max(x2,nx2) ; y2 = max(y2,ny2) ;
- xwevent.windowexpose.xc = (x1+x2)/2 ;
- xwevent.windowexpose.yc = (y1+y2)/2 ;
- xwevent.windowexpose.width = (x2-x1) ;
- xwevent.windowexpose.height = (y2-y1) ;
- }
- }
- }
- break ;
- case ConfigureNotify :
- {
- int xc = _X + _WIDTH/2 ;
- int yc = _Y + _HEIGHT/2 ;
- int width = _WIDTH ;
- int height = _HEIGHT ;
-
- pwindow->rwidth = xevent.xconfigure.width ;
- pwindow->rheight = xevent.xconfigure.height ;
- Xw_get_window_position(pwindow,
- &xwevent.windowresize.xc,
- &xwevent.windowresize.yc,
- &xwevent.windowresize.width,
- &xwevent.windowresize.height) ;
- if( (width != xwevent.windowresize.width) ||
- (height != xwevent.windowresize.height) )
- xwevent.any.type = XW_RESIZEWINDOW ;
- else if( (xc != xwevent.windowresize.xc) ||
- (yc != xwevent.windowresize.yc) )
- xwevent.any.type = XW_MOVEWINDOW ;
- }
- break ;
- case ResizeRequest :
- {
- int xc = _X + _WIDTH/2 ;
- int yc = _Y + _HEIGHT/2 ;
- int width = _WIDTH ;
- int height = _HEIGHT ;
-
- pwindow->rwidth = xevent.xresizerequest.width ;
- pwindow->rheight = xevent.xresizerequest.height ;
- Xw_get_window_position(pwindow,
- &xwevent.windowresize.xc,
- &xwevent.windowresize.yc,
- &xwevent.windowresize.width,
- &xwevent.windowresize.height) ;
- if( (width != xwevent.windowresize.width) ||
- (height != xwevent.windowresize.height) )
- xwevent.any.type = XW_RESIZEWINDOW ;
- else if( (xc != xwevent.windowresize.xc) ||
- (yc != xwevent.windowresize.yc) )
- xwevent.any.type = XW_MOVEWINDOW ;
- }
- break ;
- case UnmapNotify :
- xwevent.any.type = XW_ICONIFYWINDOW ;
- break ;
- case MapNotify :
- case ReparentNotify :
- case NoExpose :
- case ClientMessage :
- case GraphicsExpose :
- case DestroyNotify :
- case CreateNotify :
- break ;
- case LeaveNotify :
- case FocusIn :
- case FocusOut :
- case KeymapNotify :
- case ConfigureRequest :
- case GravityNotify :
- case CirculateNotify :
- case CirculateRequest :
- case PropertyNotify :
- case SelectionClear :
- case SelectionRequest :
- case SelectionNotify :
- case ColormapNotify :
- case MappingNotify :
- case VisibilityNotify :
- case MapRequest :
- /*WARNING*Unimplemented EVENT type*/
- Xw_set_error(86,"Xw_wait_event",&xevent.type) ;
- break ;
- }
-
- if(( icbk = pwindow->icbk[xwevent.any.type].function )) {
- status = (*icbk)(&xwevent) ;
- }
- if(( ecbk = pwindow->ecbk[xwevent.any.type].function )) {
- userdata = pwindow->ecbk[xwevent.any.type].userdata ;
- status = (*ecbk)(&xwevent,userdata) ;
- }
- }
- }
-
-#ifdef TRACE_WAIT_EVENT
-if( Xw_get_trace() ) {
- printf (" Xw_wait_event(%lx)\n",(long ) pwindow) ;
-}
-#endif
- return (status);
-
-}