summaryrefslogtreecommitdiff
path: root/vcl/unx/source/app/saldisp.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'vcl/unx/source/app/saldisp.cxx')
-rw-r--r--vcl/unx/source/app/saldisp.cxx3435
1 files changed, 0 insertions, 3435 deletions
diff --git a/vcl/unx/source/app/saldisp.cxx b/vcl/unx/source/app/saldisp.cxx
deleted file mode 100644
index 92d5f75f7315..000000000000
--- a/vcl/unx/source/app/saldisp.cxx
+++ /dev/null
@@ -1,3435 +0,0 @@
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2000, 2010 Oracle and/or its affiliates.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-// MARKER(update_precomp.py): autogen include statement, do not remove
-#include "precompiled_vcl.hxx"
-
-#define SAL_XT
-
-// -=-= #includes =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-#include <string.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <math.h>
-#include <sys/time.h>
-#include <pthread.h>
-#include <unistd.h>
-#include <ctype.h>
-#include <string.h>
-
-#if defined(SOLARIS)
-#include <sal/alloca.h>
-#include <osl/module.h>
-#endif
-
-#include <tools/prex.h>
-#include <X11/cursorfont.h>
-#include "salcursors.h"
-#include "invert50.h"
-#ifdef SOLARIS
-#define XK_KOREAN
-#endif
-#include <X11/keysym.h>
-
-#include <X11/Xatom.h>
-
-#ifdef USE_XINERAMA
-#ifdef USE_XINERAMA_XORG
-#include <X11/extensions/Xinerama.h>
-#elif defined USE_XINERAMA_XSUN
-#if defined(SOLARIS) && defined(INTEL) // missing extension header in standard installation
-#define MAXFRAMEBUFFERS 16
-Bool XineramaGetState(Display*, int);
-Status XineramaGetInfo(Display*, int, XRectangle*, unsigned char*, int*);
-#else
-#include <X11/extensions/xinerama.h>
-#endif
-#else
-#error USE_XINERAMA but no xinerama version
-#endif
-#endif
-
-#include <tools/postx.h>
-
-#include <salunx.h>
-#include <sal/types.h>
-#include "i18n_im.hxx"
-#include "i18n_xkb.hxx"
-#include <saldisp.hxx>
-#include <saldata.hxx>
-#include <vcl/salinst.hxx>
-#include <salgdi.h>
-#include <salframe.h>
-#include <vcl/keycodes.hxx>
-#include <vcl/salbtype.hxx>
-#include <salbmp.h>
-#ifndef _OSL_THREADMUTEX_H_
-#include <osl/mutex.h>
-#endif
-#include <salobj.h>
-#include <sm.hxx>
-#include <wmadaptor.hxx>
-#include <dtint.hxx>
-
-#include <osl/socket.h>
-#include <poll.h>
-
-using namespace rtl;
-using namespace vcl_sal;
-
-// -=-= #defines -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-#define PSEUDOCOLOR12
-#define PSEUDOCOLOR8
-#define TRUECOLOR24
-#define TRUECOLOR16
-#define TRUECOLOR15
-#define TRUECOLOR12
-#define TRUECOLOR8
-
-#define SALCOLOR_WHITE MAKE_SALCOLOR( 0xFF, 0xFF, 0xFF )
-#define SALCOLOR_BLACK MAKE_SALCOLOR( 0x00, 0x00, 0x00 )
-
-// -=-= Prototyps =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-// -=-= static variables -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-static const char* const VisualClassName[] = {
- "StaticGray",
- "GrayScale",
- "StaticColor",
- "PseudoColor",
- "TrueColor",
- "DirectColor"
-};
-
-static const char* const EventNames[] =
-{
- NULL,
- NULL,
- "KeyPress",
- "KeyRelease",
- "ButtonPress",
- "ButtonRelease",
- "MotionNotify",
- "EnterNotify",
- "LeaveNotify",
- "FocusIn",
- "FocusOut",
- "KeymapNotify",
- "Expose",
- "GraphicsExpose",
- "NoExpose",
- "VisibilityNotify",
- "CreateNotify",
- "DestroyNotify",
- "UnmapNotify",
- "MapNotify",
- "MapRequest",
- "ReparentNotify",
- "ConfigureNotify",
- "ConfigureRequest",
- "GravityNotify",
- "ResizeRequest",
- "CirculateNotify",
- "CirculateRequest",
- "PropertyNotify",
- "SelectionClear",
- "SelectionRequest",
- "SelectionNotify",
- "ColormapNotify",
- "ClientMessage",
- "MappingNotify"
-};
-
-// -=-= global inline =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-inline const char *Null( const char *p ) { return p ? p : ""; }
-inline const char *GetEnv( const char *p ) { return Null( getenv( p ) ); }
-inline const char *KeyStr( KeySym n ) { return Null( XKeysymToString( n ) ); }
-
-inline const char *GetAtomName( Display *d, Atom a )
-{ return Null( XGetAtomName( d, a ) ); }
-
-inline double Hypothenuse( long w, long h )
-{ return sqrt( (double)((w*w)+(h*h)) ); }
-
-inline int ColorDiff( int r, int g, int b )
-{ return (r*r)+(g*g)+(b*b); }
-
-inline int ColorDiff( SalColor c1, int r, int g, int b )
-{ return ColorDiff( (int)SALCOLOR_RED (c1)-r,
- (int)SALCOLOR_GREEN(c1)-g,
- (int)SALCOLOR_BLUE (c1)-b ); }
-
-// -=-= global functions -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-static int sal_Shift( Pixel nMask )
-{
- int i = 24;
- if( nMask < 0x00010000 ) { nMask <<= 16; i -= 16; }
- if( nMask < 0x01000000 ) { nMask <<= 8; i -= 8; }
- if( nMask < 0x10000000 ) { nMask <<= 4; i -= 4; }
- if( nMask < 0x40000000 ) { nMask <<= 2; i -= 2; }
- if( nMask < 0x80000000 ) { nMask <<= 1; i -= 1; }
- return i;
-}
-
-static int sal_significantBits( Pixel nMask )
-{
- int nRotate = sizeof(Pixel)*4;
- int nBits = 0;
- while( nRotate-- )
- {
- if( nMask & 1 )
- nBits++;
- nMask >>= 1;
- }
- return nBits;
-}
-
-// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-static BOOL sal_GetVisualInfo( Display *pDisplay, XID nVID, XVisualInfo &rVI )
-{
- int nInfos;
- XVisualInfo aTemplate;
- XVisualInfo*pInfos;
-
- aTemplate.visualid = nVID;
-
- pInfos = XGetVisualInfo( pDisplay, VisualIDMask, &aTemplate, &nInfos );
- if( !pInfos )
- return FALSE;
-
- rVI = *pInfos;
- XFree( pInfos );
-
- DBG_ASSERT( rVI.visualid == nVID,
- "sal_GetVisualInfo: could not get correct visual by visualId" );
- return TRUE;
-}
-
-// ---------------------------------------------------------------------------
-
-// check wether displaystring is in format N.M or N. or just N
-// with N and M beeing natural numbers
-static BOOL
-sal_IsDisplayNumber( const char *pDisplayString )
-{
- if ( ! isdigit(*pDisplayString) )
- return FALSE;
- while ( isdigit(*(++pDisplayString)) )
- ; /* do nothing */
-
- if ( *pDisplayString == '.' )
- {
- while ( isdigit(*(++pDisplayString)) )
- ; /* do nothing */
- }
-
- return (*pDisplayString == '\0');
-}
-
-// check whether host1 and host2 point to the same ip address
-static BOOL
-sal_EqualHosts( const OUString& Host1, const OUString& Host2)
-{
- oslSocketAddr pHostAddr1;
- oslSocketAddr pHostAddr2;
- BOOL bEqualAddress = FALSE;
-
- if ( Host1.toChar() >= '0' && Host1.toChar() <= '9' )
- pHostAddr1 = osl_createInetSocketAddr( Host1.pData, 0 );
- else
- pHostAddr1 = osl_resolveHostname( Host1.pData );
-
- if ( Host2.toChar() >= '0' && Host2.toChar() <= '9' )
- pHostAddr2 = osl_createInetSocketAddr( Host2.pData, 0 );
- else
- pHostAddr2 = osl_resolveHostname( Host2.pData );
-
- if( pHostAddr1 && pHostAddr2 )
- bEqualAddress = osl_isEqualSocketAddr( pHostAddr1, pHostAddr2 ) ? TRUE : FALSE;
-
- if( pHostAddr1 )
- osl_destroySocketAddr( pHostAddr1 );
- if( pHostAddr2 )
- osl_destroySocketAddr( pHostAddr2 );
-
- return bEqualAddress;
-}
-
-static BOOL
-sal_IsLocalDisplay( Display *pDisplay )
-{
- const char *pDisplayString = DisplayString( pDisplay );
-
- // no string, no idea
- if ( pDisplayString == NULL || pDisplayString[ 0 ] == '\0')
- return FALSE;
-
- // check for ":x.y"
- if ( pDisplayString[ 0 ] == ':' )
- return sal_IsDisplayNumber( pDisplayString + 1 );
-
- // check for fixed token which all mean localhost:x.y
- const char pLocal[] = "localhost:";
- const int nLocalLen = sizeof(pLocal) - 1;
- if ( strncmp(pDisplayString, pLocal, nLocalLen) == 0 )
- return sal_IsDisplayNumber( pDisplayString + nLocalLen );
-
- const char pUnix[] = "unix:";
- const int nUnixLen = sizeof(pUnix) - 1;
- if ( strncmp(pDisplayString, pUnix, nUnixLen) == 0 )
- return sal_IsDisplayNumber( pDisplayString + nUnixLen );
-
- const char pLoopback[] = "127.0.0.1:";
- const int nLoopbackLen= sizeof(pLoopback) - 1;
- if ( strncmp(pDisplayString, pLoopback, nLoopbackLen) == 0 )
- return sal_IsDisplayNumber( pDisplayString + nLoopbackLen );
-
- // compare local hostname to displaystring, both may be ip address or
- // hostname
- BOOL bEqual = FALSE;
- char *pDisplayHost = strdup( pDisplayString );
- char *pPtr = strrchr( pDisplayHost, ':' );
-
- if( pPtr != NULL )
- {
- const OUString& rLocalHostname( GetX11SalData()->GetLocalHostName() );
- if( rLocalHostname.getLength() )
- {
- *pPtr = '\0';
- OUString aDisplayHostname( pDisplayHost, strlen( pDisplayHost ), osl_getThreadTextEncoding() );
- bEqual = sal_EqualHosts( rLocalHostname, aDisplayHostname );
- bEqual = bEqual && sal_IsDisplayNumber( pPtr + 1 );
- }
- }
- free( pDisplayHost );
-
- return bEqual;
-}
-
-// ---------------------------------------------------------------------------
-// IsLocal means soffice is running on the same host as the xserver
-// since it is not called very often and sal_IsLocalDisplay() is relative
-// expensive bLocal_ is initialized on first call
-
-BOOL SalDisplay::IsLocal()
-{
- if ( ! mbLocalIsValid )
- {
- bLocal_ = sal_IsLocalDisplay( pDisp_ );
- mbLocalIsValid = TRUE;
- }
- return (BOOL)bLocal_;
-}
-
-// ---------------------------------------------------------------------------
-extern "C" srv_vendor_t
-sal_GetServerVendor( Display *p_display )
-{
- typedef struct {
- srv_vendor_t e_vendor; // vendor as enum
- const char *p_name; // vendor name as returned by VendorString()
- unsigned int n_len; // number of chars to compare
- } vendor_t;
-
- const vendor_t p_vendorlist[] = {
- { vendor_xfree, "The XFree86 Project, Inc", 13 },
- { vendor_sun, "Sun Microsystems, Inc.", 10 },
- { vendor_attachmate, "Attachmate Corporation", 10 },
- { vendor_excursion,
- "DECWINDOWS DigitalEquipmentCorporation, eXcursion", 42 },
- { vendor_hp, "Hewlett-Packard Company", 17 },
- { vendor_hummingbird, "Hummingbird Communications Ltd.", 11 },
- { vendor_ibm, "International Business Machines", 24 },
- { vendor_sgi, "Silicon Graphics", 9 },
- { vendor_sco, "The Santa Cruz Operation", 16 },
- { vendor_xinside, "X Inside Inc.", 10 },
- // allways the last entry: vendor_none to indicate eol
- { vendor_none, NULL, 0 },
- };
-
- // handle regular server vendors
- char *p_name = ServerVendor( p_display );
- vendor_t *p_vendor;
- for (p_vendor = const_cast<vendor_t*>(p_vendorlist); p_vendor->e_vendor != vendor_none; p_vendor++)
- {
- if ( strncmp (p_name, p_vendor->p_name, p_vendor->n_len) == 0 )
- return p_vendor->e_vendor;
- }
-
- // vendor not found in list
- return vendor_unknown;
-}
-
-static sal_Bool sal_IsTrustedSolaris (Display *p_display)
-{
- int n_numextensions = 0;
- char **p_extensions = XListExtensions (p_display, &n_numextensions);
- sal_Bool b_is = sal_False;
-
- if (p_extensions != NULL)
- {
- for (int i = 0; !b_is && i < n_numextensions; i++)
- b_is = (strcmp (p_extensions[i], "SUN_TSOL") == 0);
- XFreeExtensionList (p_extensions);
- }
-
- return b_is;
-}
-
-// -=-= SalDisplay -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-BOOL SalDisplay::BestVisual( Display *pDisplay,
- int nScreen,
- XVisualInfo &rVI )
-{
- VisualID nDefVID = XVisualIDFromVisual( DefaultVisual( pDisplay, nScreen ) );
- VisualID nVID = 0;
- char *pVID = getenv( "SAL_VISUAL" );
- if( pVID )
- sscanf( pVID, "%li", &nVID );
-
- if( nVID && sal_GetVisualInfo( pDisplay, nVID, rVI ) )
- return rVI.visualid == nDefVID;
-
- XVisualInfo aVI;
- aVI.screen = nScreen;
- // get all visuals
- int nVisuals;
- XVisualInfo* pVInfos = XGetVisualInfo( pDisplay, VisualScreenMask,
- &aVI, &nVisuals );
- // pVInfos should contain at least one visual, otherwise
- // we're in trouble
- int* pWeight = (int*)alloca( sizeof(int)*nVisuals );
- int i;
- for( i = 0; i < nVisuals; i++ )
- {
- BOOL bUsable = FALSE;
- int nTrueColor = 1;
-
- if ( pVInfos[i].screen != nScreen )
- {
- bUsable = FALSE;
- }
- else
- if( pVInfos[i].c_class == TrueColor )
- {
- nTrueColor = 2048;
- if( pVInfos[i].depth == 24 )
- bUsable = TRUE;
-#ifdef TRUECOLOR8
- else if( pVInfos[i].depth == 8 )
- {
- nTrueColor = -1; // strongly discourage 8 bit true color
- bUsable = TRUE;
- }
-#endif
-#ifdef TRUECOLOR15
- else if( pVInfos[i].depth == 15 )
- bUsable = TRUE;
-#endif
-#ifdef TRUECOLOR16
- else if( pVInfos[i].depth == 16 )
- bUsable = TRUE;
-#endif
-#ifdef TRUECOLOR32
- else if( pVInfos[i].depth == 32 )
- {
- nTrueColor = 256;
- // we do not have use for an alpha channel
- // better use a 24 or 16 bit truecolor visual if possible
- bUsable = TRUE;
- }
-#endif
- }
- else if( pVInfos[i].c_class == PseudoColor )
- {
- if( pVInfos[i].depth <= 8 )
- bUsable = TRUE;
-#ifdef PSEUDOCOLOR12
- else if( pVInfos[i].depth == 12 )
- bUsable = TRUE;
-#endif
- }
- pWeight[ i ] = bUsable ? nTrueColor*pVInfos[i].depth : -1024;
- pWeight[ i ] -= pVInfos[ i ].visualid;
- }
-
- int nBestVisual = 0;
- int nBestWeight = -1024;
- for( i = 0; i < nVisuals; i++ )
- {
- if( pWeight[ i ] > nBestWeight )
- {
- nBestWeight = pWeight[ i ];
- nBestVisual = i;
- }
- }
-
- rVI = pVInfos[ nBestVisual ];
-
- XFree( pVInfos );
- return rVI.visualid == nDefVID;
-}
-
-// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-
-SalDisplay::SalDisplay( Display *display ) :
- mpInputMethod( NULL ),
- pDisp_( display ),
- m_pWMAdaptor( NULL ),
- m_pDtIntegrator( NULL ),
- m_bUseRandRWrapper( true ),
- m_nLastUserEventTime( CurrentTime )
-{
-#if OSL_DEBUG_LEVEL > 1
- fprintf( stderr, "SalDisplay::SalDisplay()\n" );
-#endif
- X11SalData *pSalData = GetX11SalData();
-
- DBG_ASSERT( ! pSalData->GetDisplay(), "Second SalDisplay created !!!\n" );
- pSalData->SetSalDisplay( this );
-
- pXLib_ = pSalData->GetLib();
- m_nDefaultScreen = DefaultScreen( pDisp_ );
-
-}
-
-// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-SalDisplay::~SalDisplay( )
-{
-#if OSL_DEBUG_LEVEL > 1
- fprintf( stderr, "SalDisplay::~SalDisplay()\n" );
-#endif
- if( pDisp_ )
- {
- doDestruct();
-#if OSL_DEBUG_LEVEL > 1
- fprintf( stderr, "display %p closed\n", pDisp_ );
-#endif
- pDisp_ = NULL;
- }
- // don't do this in doDestruct since RandR extension adds hooks into Display
- // that is XCloseDisplay still needs the RandR library if it was used
- DeInitRandR();
-}
-
-void SalDisplay::doDestruct()
-{
- X11SalData *pSalData = GetX11SalData();
-
- delete m_pWMAdaptor;
- m_pWMAdaptor = NULL;
- delete m_pDtIntegrator;
- m_pDtIntegrator = NULL;
- X11SalBitmap::ImplDestroyCache();
- X11SalGraphics::releaseGlyphPeer();
-
- if( IsDisplay() )
- {
- delete mpInputMethod, mpInputMethod = (SalI18N_InputMethod*)ILLEGAL_POINTER;
- delete mpKbdExtension, mpKbdExtension = (SalI18N_KeyboardExtension*)ILLEGAL_POINTER;
-
- // do not call anything that could implicitly call back into
- // this object after this point
- osl_destroyMutex( hEventGuard_ );
-
- for( unsigned int i = 0; i < m_aScreens.size(); i++ )
- {
- ScreenData& rData = m_aScreens[i];
- if( rData.m_bInit )
- {
- if( rData.m_aMonoGC != rData.m_aCopyGC )
- XFreeGC( pDisp_, rData.m_aMonoGC );
- XFreeGC( pDisp_, rData.m_aCopyGC );
- XFreeGC( pDisp_, rData.m_aAndInvertedGC );
- XFreeGC( pDisp_, rData.m_aAndGC );
- XFreeGC( pDisp_, rData.m_aOrGC );
- XFreeGC( pDisp_, rData.m_aStippleGC );
- XFreePixmap( pDisp_, rData.m_hInvert50 );
- XDestroyWindow( pDisp_, rData.m_aRefWindow );
- Colormap aColMap = rData.m_aColormap.GetXColormap();
- if( aColMap != None && aColMap != DefaultColormap( pDisp_, i ) )
- XFreeColormap( pDisp_, aColMap );
- }
- }
-
- hEventGuard_ = (oslMutex)ILLEGAL_POINTER;
-
- for( size_t i = 0; i < POINTER_COUNT; i++ )
- {
- if( aPointerCache_[i] )
- XFreeCursor( pDisp_, aPointerCache_[i] );
- }
-
- pXLib_->Remove( ConnectionNumber( pDisp_ ) );
- }
-
- if( pSalData->GetDisplay() == this )
- pSalData->SetSalDisplay( NULL );
-}
-
-static int DisplayHasEvent( int
-#ifdef DBG_UTIL
-fd
-#endif
-, SalX11Display *pDisplay )
-{
- DBG_ASSERT( ConnectionNumber( pDisplay->GetDisplay() ) == fd,
- "wrong fd in DisplayHasEvent" );
- if( ! pDisplay->IsDisplay() )
- return 0;
-
- vos::IMutex* pSalInstYieldMutex =
- GetSalData()->m_pInstance->GetYieldMutex();
- ::vos::OGuard aGuard( *pSalInstYieldMutex );
- return pDisplay->IsEvent();
-}
-static int DisplayQueue( int
-#ifdef DBG_UTIL
-fd
-#endif
-, SalX11Display *pDisplay )
-{
- DBG_ASSERT( ConnectionNumber( pDisplay->GetDisplay() ) == fd,
- "wrong fd in DisplayHasEvent" );
- vos::IMutex* pSalInstYieldMutex =
- GetSalData()->m_pInstance->GetYieldMutex();
- ::vos::OGuard aGuard( *pSalInstYieldMutex );
- return XEventsQueued( pDisplay->GetDisplay(),
- QueuedAfterReading );
-}
-static int DisplayYield( int
-#ifdef DBG_UTIL
-fd
-#endif
-, SalX11Display *pDisplay )
-{
- DBG_ASSERT( ConnectionNumber( pDisplay->GetDisplay() ) == fd,
- "wrong fd in DisplayHasEvent" );
- vos::IMutex* pSalInstYieldMutex =
- GetSalData()->m_pInstance->GetYieldMutex();
- ::vos::OGuard aGuard( *pSalInstYieldMutex );
- pDisplay->Yield();
- return TRUE;
-}
-
-SalX11Display::SalX11Display( Display *display )
- : SalDisplay( display )
-{
- Init();
-
- pXLib_->Insert( ConnectionNumber( pDisp_ ),
- this,
- (YieldFunc) DisplayHasEvent,
- (YieldFunc) DisplayQueue,
- (YieldFunc) DisplayYield );
-}
-
-SalX11Display::~SalX11Display()
-{
-#if OSL_DEBUG_LEVEL > 1
- fprintf( stderr, "SalX11Display::~SalX11Display()\n" );
-#endif
- if( pDisp_ )
- {
- doDestruct();
- XCloseDisplay( pDisp_ );
- pDisp_ = NULL;
- }
-}
-
-void SalDisplay::initScreen( int nScreen ) const
-{
- if( nScreen < 0 || nScreen >= static_cast<int>(m_aScreens.size()) )
- nScreen = m_nDefaultScreen;
- ScreenData& rSD = const_cast<ScreenData&>(m_aScreens[nScreen]);
- if( rSD.m_bInit )
- return;
- rSD.m_bInit = true;
-
- XVisualInfo aVI;
- Colormap aColMap;
-
- if( SalDisplay::BestVisual( pDisp_, nScreen, aVI ) ) // DefaultVisual
- aColMap = DefaultColormap( pDisp_, nScreen );
- else
- aColMap = XCreateColormap( pDisp_,
- RootWindow( pDisp_, nScreen ),
- aVI.visual,
- AllocNone );
-
- Screen* pScreen = ScreenOfDisplay( pDisp_, nScreen );
-
- rSD.m_aSize = Size( WidthOfScreen( pScreen ), HeightOfScreen( pScreen ) );
- rSD.m_aRoot = RootWindow( pDisp_, nScreen );
- rSD.m_aVisual = SalVisual( &aVI );
- rSD.m_aColormap = SalColormap( this, aColMap, nScreen );
-
- // we're interested in configure notification of root windows
- InitRandR( rSD.m_aRoot );
-
- // - - - - - - - - - - Reference Window/Default Drawable - -
- XSetWindowAttributes aXWAttributes;
- aXWAttributes.border_pixel = 0;
- aXWAttributes.background_pixel = 0;
- aXWAttributes.colormap = aColMap;
- rSD.m_aRefWindow = XCreateWindow( pDisp_,
- rSD.m_aRoot,
- 0,0, 16,16, 0,
- rSD.m_aVisual.GetDepth(),
- InputOutput,
- rSD.m_aVisual.GetVisual(),
- CWBorderPixel|CWBackPixel|CWColormap,
- &aXWAttributes );
-
- // set client leader (session id gets set when session is started)
- if( rSD.m_aRefWindow )
- {
- // client leader must have WM_CLIENT_LEADER pointing to itself
- XChangeProperty( pDisp_,
- rSD.m_aRefWindow,
- XInternAtom( pDisp_, "WM_CLIENT_LEADER", False ),
- XA_WINDOW,
- 32,
- PropModeReplace,
- (unsigned char*)&rSD.m_aRefWindow,
- 1
- );
-
- ByteString aExec( SessionManagerClient::getExecName(), osl_getThreadTextEncoding() );
- const char* argv[2];
- argv[0] = "/bin/sh";
- argv[1] = aExec.GetBuffer();
- XSetCommand( pDisp_, rSD.m_aRefWindow, const_cast<char**>(argv), 2 );
- XSelectInput( pDisp_, rSD.m_aRefWindow, PropertyChangeMask );
-
- // - - - - - - - - - - GCs - - - - - - - - - - - - - - - - -
- XGCValues values;
- values.graphics_exposures = False;
- values.fill_style = FillOpaqueStippled;
- values.background = (1<<rSD.m_aVisual.GetDepth())-1;
- values.foreground = 0;
-
- rSD.m_aCopyGC = XCreateGC( pDisp_,
- rSD.m_aRefWindow,
- GCGraphicsExposures
- | GCForeground
- | GCBackground,
- &values );
- rSD.m_aAndInvertedGC= XCreateGC( pDisp_,
- rSD.m_aRefWindow,
- GCGraphicsExposures
- | GCForeground
- | GCBackground,
- &values );
- rSD.m_aAndGC = XCreateGC( pDisp_,
- rSD.m_aRefWindow,
- GCGraphicsExposures
- | GCForeground
- | GCBackground,
- &values );
- rSD.m_aOrGC = XCreateGC( pDisp_,
- rSD.m_aRefWindow,
- GCGraphicsExposures
- | GCForeground
- | GCBackground,
- &values );
- rSD.m_aStippleGC = XCreateGC( pDisp_,
- rSD.m_aRefWindow,
- GCGraphicsExposures
- | GCFillStyle
- | GCForeground
- | GCBackground,
- &values );
-
- XSetFunction( pDisp_, rSD.m_aAndInvertedGC, GXandInverted );
- XSetFunction( pDisp_, rSD.m_aAndGC, GXand );
- // #44556# PowerPC Solaris 2.5 (XSun 3500) Bug: GXor = GXnop
- //XSetFunction( pDisp_, pOrGC_, GXor );
- XSetFunction( pDisp_, rSD.m_aOrGC, GXxor );
-
- if( 1 == rSD.m_aVisual.GetDepth() )
- {
- XSetFunction( pDisp_, rSD.m_aCopyGC, GXcopyInverted );
- rSD.m_aMonoGC = rSD.m_aCopyGC;
- }
- else
- {
- Pixmap hPixmap = XCreatePixmap( pDisp_, rSD.m_aRefWindow, 1, 1, 1 );
- rSD.m_aMonoGC = XCreateGC( pDisp_,
- hPixmap,
- GCGraphicsExposures,
- &values );
- XFreePixmap( pDisp_, hPixmap );
- }
- rSD.m_hInvert50 = XCreateBitmapFromData( pDisp_,
- rSD.m_aRefWindow,
- invert50_bits,
- invert50_width,
- invert50_height );
- }
-}
-
-// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-void SalDisplay::Init()
-{
- for( size_t i = 0; i < POINTER_COUNT; i++ )
- aPointerCache_[i] = None;
-
- eWindowManager_ = otherwm;
- nProperties_ = PROPERTY_DEFAULT;
- hEventGuard_ = NULL;
- mpFactory = (AttributeProvider*)NULL;
- m_pCapture = NULL;
- m_bXinerama = false;
-
- int nDisplayScreens = ScreenCount( pDisp_ );
- m_aScreens = std::vector<ScreenData>(nDisplayScreens);
-
- mbExactResolution = false;
- /* #i15507#
- * Xft resolution should take precedence since
- * it is what modern desktops use.
- */
- const char* pValStr = XGetDefault( pDisp_, "Xft", "dpi" );
- if( pValStr != NULL )
- {
- const rtl::OString aValStr( pValStr );
- const long nDPI = (long) aValStr.toDouble();
- // guard against insane resolution
- if( (nDPI >= 50) && (nDPI <= 500) )
- {
- aResolution_ = Pair( nDPI, nDPI );
- mbExactResolution = true;
- }
- }
- if( mbExactResolution == false )
- {
- aResolution_ =
- Pair( DPI( WidthOfScreen( DefaultScreenOfDisplay( pDisp_ ) ), DisplayWidthMM ( pDisp_, m_nDefaultScreen ) ),
- DPI( HeightOfScreen( DefaultScreenOfDisplay( pDisp_ ) ), DisplayHeightMM( pDisp_, m_nDefaultScreen ) ) );
- }
-
- nMaxRequestSize_ = XExtendedMaxRequestSize( pDisp_ ) * 4;
- if( !nMaxRequestSize_ )
- nMaxRequestSize_ = XMaxRequestSize( pDisp_ ) * 4;
-
- SetServerVendor();
- X11SalBitmap::ImplCreateCache();
-
- hEventGuard_ = osl_createMutex();
- bLocal_ = FALSE; /* dont care, initialize later by
- calling SalDisplay::IsLocal() */
- mbLocalIsValid = FALSE; /* bLocal_ is not yet initialized */
-
- // - - - - - - - - - - Synchronize - - - - - - - - - - - - -
- if( getenv( "SAL_SYNCHRONIZE" ) )
- XSynchronize( pDisp_, True );
-
- // - - - - - - - - - - Keyboardmapping - - - - - - - - - - -
- ModifierMapping();
-
- // - - - - - - - - - - Window Manager - - - - - - - - - - -
- m_pWMAdaptor = ::vcl_sal::WMAdaptor::createWMAdaptor( this );
- const char *pWM = getenv( "SAL_WM" );
- if( pWM )
- {
- long int nWM = 0;
- sscanf( pWM, "%li", &nWM );
- eWindowManager_ = SalWM(nWM);
- }
- else if( XInternAtom( pDisp_, "_SGI_TELL_WM", True ) )
- eWindowManager_ = FourDwm;
- else if( XInternAtom( pDisp_, "KWM_RUNNING", True ) )
- eWindowManager_ = mwm; // naja, eigentlich kwm ...
- else if( XInternAtom( pDisp_, "_OL_WIN_ATTR", True ) )
- eWindowManager_ = olwm;
- else if( m_pWMAdaptor->getWindowManagerName().EqualsAscii( "Dtwm" ) )
- eWindowManager_ = dtwm;
-
- // - - - - - - - - - - Properties - - - - - - - - - - - - -
- const char *pProperties = getenv( "SAL_PROPERTIES" );
- if( pProperties )
- sscanf( pProperties, "%li", &nProperties_ );
- else
- {
-#if defined DBG_UTIL || defined SUN || defined LINUX || defined FREEBSD
- nProperties_ |= PROPERTY_FEATURE_Maximize;
-#endif
- // Server Bugs & Properties
- if( GetServerVendor() == vendor_excursion )
- {
- nProperties_ |= PROPERTY_BUG_Stipple;
- nProperties_ |= PROPERTY_BUG_DrawLine;
- nProperties_ &= ~PROPERTY_SUPPORT_XSetClipMask;
- }
- else
- if( GetServerVendor() == vendor_attachmate )
- {
- nProperties_ |= PROPERTY_BUG_CopyPlane_RevertBWPixel;
- }
- else
- if( GetServerVendor() == vendor_ibm )
- {
- nProperties_ |= PROPERTY_BUG_XA_FAMILY_NAME_nil;
-
- if( otherwm == eWindowManager_ ) eWindowManager_ = mwm;
- }
- else
- if( GetServerVendor() == vendor_xfree )
- {
- nProperties_ |= PROPERTY_BUG_XCopyArea_GXxor;
-#if defined LINUX || defined FREEBSD
- // otherwm and olwm are a kind of default, which are not detected
- // carefully. if we are running linux (i.e. not netbsd) on an xfree
- // display, fvwm is most probable the wm to choose, confusing with mwm
- // doesn't harm. #57791# start maximized if possible
- if( (otherwm == eWindowManager_)
- || (olwm == eWindowManager_ ))
- {
- eWindowManager_ = fvwm; // ???
- nProperties_ |= PROPERTY_FEATURE_Maximize;
- }
-#else
- if( otherwm == eWindowManager_ ) eWindowManager_ = winmgr;
-#endif
-#if defined SOLARIS && defined SPARC
- nProperties_ |= PROPERTY_BUG_Bitmap_Bit_Order;
- // solaris xlib seems to have problems with putting images
- // in correct bit order to xfree 8 bit displays
-#endif
- }
- else
- if( GetServerVendor() == vendor_sun )
- {
- // nicht alle! (bekannt: nur Sparc II CG3, CG6?)
- nProperties_ &= ~PROPERTY_SUPPORT_XSetClipMask;
-
- // trusted solaris doesn't allow to change properties on the
- // wm decoration window
- if (sal_IsTrustedSolaris (pDisp_))
- nProperties_ |= PROPERTY_FEATURE_TrustedSolaris;
-
- // Fehler im Sun-Solaris X86 Server !
- if (ImageByteOrder(GetDisplay()) == LSBFirst)
- {
- nProperties_ |= PROPERTY_BUG_Tile;
- nProperties_ |= PROPERTY_SUPPORT_3ButtonMouse;
- }
- else // MSBFirst Sun-Solaris Sparc Server
- {
- // XCopyPlane reverts black and white for 1bit bitmaps
- // only sun, only 8bit pseudocolor target
- if ( (GetVisual(m_nDefaultScreen).GetDepth() == 8)
- && (GetVisual(m_nDefaultScreen).GetClass() == PseudoColor))
- nProperties_ |= PROPERTY_BUG_CopyPlane_RevertBWPixel;
- // Fehler in Solaris 2.5.1
- if (VendorRelease ( GetDisplay() ) < 3600)
- nProperties_ |= PROPERTY_BUG_FillPolygon_Tile;
- }
-
- if( otherwm == eWindowManager_ )
- eWindowManager_ = olwm;
- }
- else
- if( GetServerVendor() == vendor_sco )
- {
- if( otherwm == eWindowManager_ ) eWindowManager_ = pmwm;
- }
- else
- if( GetServerVendor() == vendor_sgi )
- {
- if( GetVisual( m_nDefaultScreen ).GetDepth() > 8 && GetVisual( m_nDefaultScreen ).GetDepth() <= 16 )
- nProperties_ |= PROPERTY_BUG_XCopyArea_GXxor;
- nProperties_ |= PROPERTY_SUPPORT_XSetClipMask;
-
- if( otherwm == eWindowManager_ )
- eWindowManager_ = FourDwm;
- }
- else
- if( GetServerVendor() == vendor_hp )
- {
- if( otherwm == eWindowManager_ ) eWindowManager_ = dtwm;
- }
- else
- if( GetServerVendor() == vendor_hummingbird )
- {
- if (GetVisual(m_nDefaultScreen).GetDepth() == 24)
- nProperties_ |= PROPERTY_BUG_CopyArea_OnlySmallSlices;
- }
-
- if( otherwm == eWindowManager_ )
- {
- if( !XInternAtom( pDisp_, "_MOTIF_WM_INFO", True ) )
- eWindowManager_ = olwm;
- // ???
- }
-
- if( winmgr == eWindowManager_ )
- {
- nProperties_ &= ~PROPERTY_SUPPORT_WM_SetPos;
- nProperties_ &= ~PROPERTY_SUPPORT_WM_Screen;
- nProperties_ |= PROPERTY_FEATURE_Maximize;
- }
- else if( dtwm == eWindowManager_ )
- {
- nProperties_ &= ~PROPERTY_SUPPORT_WM_ClientPos;
- }
- else if( pmwm == eWindowManager_ )
- {
- nProperties_ &= ~PROPERTY_SUPPORT_WM_ClientPos;
- }
- }
-
- InitXinerama();
-
- // initialize system settings update
- m_pDtIntegrator = DtIntegrator::CreateDtIntegrator();
-
-#ifdef DBG_UTIL
- PrintInfo();
-#endif
-}
-
-// Sound
-// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-void SalDisplay::Beep() const
-{
- XBell( pDisp_, 0 );
-}
-
-// Keyboard
-// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-String SalDisplay::GetKeyNameFromKeySym( KeySym nKeySym ) const
-{
- String aRet;
-
- // return an empty string for keysyms that are not bound to
- // any key code
- XLIB_KeyCode aKeyCode = XKeysymToKeycode( GetDisplay(), nKeySym );
- if( aKeyCode != 0 && aKeyCode != NoSymbol )
- {
- if( !nKeySym )
- aRet = String::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM( "???" ) );
- else
- {
- aRet = ::vcl_sal::getKeysymReplacementName( const_cast<SalDisplay*>(this)->GetKeyboardName(), nKeySym );
- if( ! aRet.Len() )
- {
- const char *pString = XKeysymToString( nKeySym );
- int n = strlen( pString );
- if( n > 2 && pString[n-2] == '_' )
- aRet = String( pString, n-2, RTL_TEXTENCODING_ISO_8859_1 );
- else
- aRet = String( pString, n, RTL_TEXTENCODING_ISO_8859_1 );
- }
- }
- }
- return aRet;
-}
-
-inline KeySym sal_XModifier2Keysym( Display *pDisplay,
- XModifierKeymap *pXModMap,
- int n )
-{
- return XKeycodeToKeysym( pDisplay,
- pXModMap->modifiermap[n*pXModMap->max_keypermod],
- 0 );
-}
-
-void SalDisplay::ModifierMapping()
-{
- XModifierKeymap *pXModMap = XGetModifierMapping( pDisp_ );
-
- bNumLockFromXS_ = True;
- nShiftKeySym_ = sal_XModifier2Keysym( pDisp_, pXModMap, ShiftMapIndex );
- nCtrlKeySym_ = sal_XModifier2Keysym( pDisp_, pXModMap, ControlMapIndex );
- nMod1KeySym_ = sal_XModifier2Keysym( pDisp_, pXModMap, Mod1MapIndex );
- // Auf Sun-Servern und SCO-Severn beruecksichtigt XLookupString
- // nicht den NumLock Modifier.
- if( (GetServerVendor() == vendor_sun)
- || (GetServerVendor() == vendor_sco) )
- {
- XLIB_KeyCode aNumLock = XKeysymToKeycode( pDisp_, XK_Num_Lock );
-
- if( aNumLock ) for( int i = ShiftMapIndex; i <= Mod5MapIndex; i++ )
- {
- if( pXModMap->modifiermap[i*pXModMap->max_keypermod] == aNumLock )
- {
- bNumLockFromXS_ = False;
- nNumLockIndex_ = i;
- nNumLockMask_ = 1<<i;
- break;
- }
- }
- }
-
- XFreeModifiermap( pXModMap );
-}
-
-// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-XubString SalDisplay::GetKeyName( USHORT nKeyCode ) const
-{
- String aStrMap;
-
- if( nKeyCode & KEY_MOD1 )
- aStrMap += GetKeyNameFromKeySym( nCtrlKeySym_ );
-
- if( nKeyCode & KEY_MOD2 )
- {
- if( aStrMap.Len() )
- aStrMap += '+';
- aStrMap += GetKeyNameFromKeySym( nMod1KeySym_ );
- }
-
- if( nKeyCode & KEY_SHIFT )
- {
- if( aStrMap.Len() )
- aStrMap += '+';
- aStrMap += GetKeyNameFromKeySym( nShiftKeySym_ );
- }
- nKeyCode &= 0x0FFF;
-
- KeySym nKeySym = 0;
-
- if( KEY_0 <= nKeyCode && nKeyCode <= KEY_9 )
- nKeySym = XK_0 + (nKeyCode - KEY_0);
- else if( KEY_A <= nKeyCode && nKeyCode <= KEY_Z )
- nKeySym = XK_A + (nKeyCode - KEY_A);
- else if( KEY_F1 <= nKeyCode && nKeyCode <= KEY_F26 ) // Existiert die Taste
- nKeySym = XK_F1 + (nKeyCode - KEY_F1);
- else switch( nKeyCode )
- {
- case KEY_DOWN:
- nKeySym = XK_Down;
- break;
- case KEY_UP:
- nKeySym = XK_Up;
- break;
- case KEY_LEFT:
- nKeySym = XK_Left;
- break;
- case KEY_RIGHT:
- nKeySym = XK_Right;
- break;
- case KEY_HOME:
- nKeySym = XK_Home;
- break;
- case KEY_END:
- nKeySym = XK_End;
- break;
- case KEY_PAGEUP:
- nKeySym = XK_Prior;
- break;
- case KEY_PAGEDOWN:
- nKeySym = XK_Next;
- break;
- case KEY_RETURN:
- nKeySym = XK_Return;
- break;
- case KEY_ESCAPE:
- nKeySym = XK_Escape;
- break;
- case KEY_TAB:
- nKeySym = XK_Tab;
- break;
- case KEY_BACKSPACE:
- nKeySym = XK_BackSpace;
- break;
- case KEY_SPACE:
- nKeySym = XK_space;
- break;
- case KEY_INSERT:
- nKeySym = XK_Insert;
- break;
- case KEY_DELETE:
- nKeySym = XK_Delete;
- break;
-
- #if !defined (SunXK_Undo)
- #define SunXK_Stop 0x0000FF69 // XK_Cancel
- #define SunXK_Props 0x1005FF70
- #define SunXK_Front 0x1005FF71
- #define SunXK_Copy 0x1005FF72
- #define SunXK_Open 0x1005FF73
- #define SunXK_Paste 0x1005FF74
- #define SunXK_Cut 0x1005FF75
- #endif
-
- case KEY_REPEAT:
- nKeySym = XK_Redo;
- break;
- case KEY_PROPERTIES:
- nKeySym = SunXK_Props;
- break;
- case KEY_UNDO:
- nKeySym = XK_Undo;
- break;
- case KEY_FRONT:
- nKeySym = SunXK_Front;
- break;
- case KEY_COPY:
- nKeySym = SunXK_Copy;
- break;
- case KEY_OPEN:
- nKeySym = SunXK_Open;
- break;
- case KEY_PASTE:
- nKeySym = SunXK_Paste;
- break;
- case KEY_FIND:
- nKeySym = XK_Find;
- break;
- case KEY_CUT:
- nKeySym = GetServerVendor() == vendor_sun ? SunXK_Cut : XK_L10;
- break;
- case KEY_ADD:
- nKeySym = XK_plus;
- break;
- case KEY_SUBTRACT:
- nKeySym = XK_minus;
- break;
- case KEY_MULTIPLY:
- nKeySym = XK_asterisk;
- break;
- case KEY_DIVIDE:
- nKeySym = XK_slash;
- break;
- case KEY_POINT:
- nKeySym = XK_period;
- break;
- case KEY_COMMA:
- nKeySym = XK_comma;
- break;
- case KEY_LESS:
- nKeySym = XK_less;
- break;
- case KEY_GREATER:
- nKeySym = XK_greater;
- break;
- case KEY_EQUAL:
- nKeySym = XK_equal;
- break;
- case KEY_HELP:
- nKeySym = XK_Help;
- break;
- case KEY_HANGUL_HANJA:
- nKeySym = XK_Hangul_Hanja;
- break;
- case KEY_TILDE:
- nKeySym = XK_asciitilde;
- break;
- case KEY_QUOTELEFT:
- nKeySym = XK_grave;
- break;
-
- default:
- nKeySym = 0;
- break;
- }
-
- if( nKeySym )
- {
- String aKeyName = GetKeyNameFromKeySym( nKeySym );
- if( aKeyName.Len() )
- {
- if( aStrMap.Len() )
- aStrMap += '+';
- aStrMap += aKeyName;
- }
- else
- aStrMap.Erase();
- }
- else
- aStrMap.Erase();
-
- return aStrMap;
-}
-
-// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-#ifndef IsISOKey
-#define IsISOKey( n ) (0x0000FE00==((n)&0xFFFFFF00))
-#endif
-
-USHORT SalDisplay::GetKeyCode( KeySym keysym, char*pcPrintable ) const
-{
- USHORT nKey = 0;
-
- if( XK_a <= keysym && XK_z >= keysym )
- nKey = (USHORT)(KEY_A + (keysym - XK_a));
- else if( XK_A <= keysym && XK_Z >= keysym )
- nKey = (USHORT)(KEY_A + (keysym - XK_A));
- else if( XK_0 <= keysym && XK_9 >= keysym )
- nKey = (USHORT)(KEY_0 + (keysym - XK_0));
- else if( IsModifierKey( keysym ) )
- ;
- else if( IsKeypadKey( keysym ) )
- {
- if( (keysym >= XK_KP_0) && (keysym <= XK_KP_9) )
- {
- nKey = (USHORT)(KEY_0 + (keysym - XK_KP_0));
- *pcPrintable = '0' + nKey - KEY_0;
- }
- else if( IsPFKey( keysym ) )
- nKey = (USHORT)(KEY_F1 + (keysym - XK_KP_F1));
- else switch( keysym )
- {
- case XK_KP_Space:
- nKey = KEY_SPACE;
- *pcPrintable = ' ';
- break;
- case XK_KP_Tab:
- nKey = KEY_TAB;
- break;
- case XK_KP_Enter:
- nKey = KEY_RETURN;
- break;
- case XK_KP_Begin:
- case XK_KP_Home:
- nKey = KEY_HOME;
- break;
- case XK_KP_Left:
- nKey = KEY_LEFT;
- break;
- case XK_KP_Up:
- nKey = KEY_UP;
- break;
- case XK_KP_Right:
- nKey = KEY_RIGHT;
- break;
- case XK_KP_Down:
- nKey = KEY_DOWN;
- break;
- case XK_KP_Prior: // XK_KP_Page_Up
- nKey = KEY_PAGEUP;
- break;
- case XK_KP_Next: // XK_KP_Page_Down
- nKey = KEY_PAGEDOWN;
- break;
- case XK_KP_End:
- nKey = KEY_END;
- break;
- case XK_KP_Insert:
- nKey = KEY_INSERT;
- break;
- case XK_KP_Delete:
- nKey = KEY_DELETE;
- break;
- case XK_KP_Equal:
- nKey = KEY_EQUAL;
- *pcPrintable = '=';
- break;
- case XK_KP_Multiply:
- nKey = KEY_MULTIPLY;
- *pcPrintable = '*';
- break;
- case XK_KP_Add:
- nKey = KEY_ADD;
- *pcPrintable = '+';
- break;
- case XK_KP_Separator:
- nKey = KEY_DECIMAL;
- *pcPrintable = ',';
- break;
- case XK_KP_Subtract:
- nKey = KEY_SUBTRACT;
- *pcPrintable = '-';
- break;
- case XK_KP_Decimal:
- nKey = KEY_DECIMAL;
- *pcPrintable = '.';
- break;
- case XK_KP_Divide:
- nKey = KEY_DIVIDE;
- *pcPrintable = '/';
- break;
- }
- }
- else if( IsFunctionKey( keysym ) )
- {
- if( bNumLockFromXS_ )
- {
- if( keysym >= XK_F1 && keysym <= XK_F26 )
- nKey = (USHORT)(KEY_F1 + keysym - XK_F1);
- }
- else switch( keysym )
- {
- // - - - - - Sun X-Server Tastatur ohne Cursorblock ??? - - -
- case XK_R7: // XK_F27:
- nKey = KEY_HOME;
- break;
- case XK_R8: // XK_F28:
- nKey = KEY_UP;
- break;
- case XK_R9: // XK_F29:
- nKey = KEY_PAGEUP;
- break;
- case XK_R10: // XK_F30:
- nKey = KEY_LEFT;
- break;
- case XK_R11: // XK_F31:
- nKey = 0; // KEY_F31
- break;
- case XK_R12: // XK_F32:
- nKey = KEY_RIGHT;
- break;
- case XK_R13: // XK_F33:
- nKey = KEY_END;
- break;
- case XK_R14: // XK_F34:
- nKey = KEY_DOWN;
- break;
- case XK_R15: // XK_F35:
- nKey = KEY_PAGEDOWN;
- break;
- // - - - - - Sun X-Server Tastatur ??? - - - - - - - - - - - -
- case XK_L1: // XK_F11:
- nKey = KEY_F11; // on a sun keyboard this actually is usally SunXK_Stop,
- // but VCL doesn't have a key defintion for that
- break;
- case XK_L2: // XK_F12:
- if ( GetServerVendor() == vendor_sun )
- nKey = KEY_REPEAT;
- else
- nKey = KEY_F12;
- break;
- case XK_L3: // XK_F13:
- nKey = KEY_PROPERTIES; // KEY_F13
- break;
- case XK_L4: // XK_F14:
- nKey = KEY_UNDO; // KEY_F14
- break;
- case XK_L5: // XK_F15:
- nKey = KEY_F15; // KEY_FRONT
- break;
- case XK_L6: // XK_F16:
- nKey = KEY_COPY; // KEY_F16
- break;
- case XK_L7: // XK_F17:
- nKey = KEY_F17; // KEY_OPEN
- break;
- case XK_L8: // XK_F18:
- nKey = KEY_PASTE; // KEY_F18
- break;
- case XK_L9: // XK_F19:
- nKey = KEY_F19; // KEY_FIND
- break;
- case XK_L10: // XK_F20:
- nKey = KEY_CUT; // KEY_F20
- break;
- default:
- if( keysym >= XK_F1 && keysym <= XK_F26 )
- nKey = (USHORT)(KEY_F1 + keysym - XK_F1);
- break;
- }
- }
- else if( IsCursorKey( keysym ) )
- {
- switch( keysym )
- {
- case XK_Begin:
- case XK_Home:
- nKey = KEY_HOME;
- break;
- case XK_Left:
- nKey = KEY_LEFT;
- break;
- case XK_Up:
- nKey = KEY_UP;
- break;
- case XK_Right:
- nKey = KEY_RIGHT;
- break;
- case XK_Down:
- nKey = KEY_DOWN;
- break;
- case XK_Prior: // XK_Page_Up
- nKey = KEY_PAGEUP;
- break;
- case XK_Next: // XK_Page_Down
- nKey = KEY_PAGEDOWN;
- break;
- case XK_End:
- nKey = KEY_END;
- break;
- }
- }
- else if( IsMiscFunctionKey( keysym ) )
- {
- switch( keysym )
- {
- case XK_Insert:
- nKey = KEY_INSERT;
- break;
- case XK_Redo:
- nKey = KEY_REPEAT;
- break;
- case XK_Undo:
- nKey = KEY_UNDO;
- break;
- case XK_Find:
- nKey = KEY_FIND;
- break;
- case XK_Help:
- nKey = KEY_HELP;
- break;
- case XK_Menu:
- nKey = KEY_CONTEXTMENU;
- break;
-/*
- case XK_Break:
- case XK_Select:
- case XK_Execute:
- case XK_Print:
- case XK_Cancel:
-*/
- }
- }
- else if( IsISOKey( keysym ) ) // XK_ISO_
- {
- switch( keysym )
- {
- case 0xFE20: // XK_ISO_Left_Tab:
- nKey = KEY_TAB;
- break;
- }
- }
- else switch( keysym )
- {
- case XK_Return:
- nKey = KEY_RETURN;
- break;
- case XK_BackSpace:
- nKey = KEY_BACKSPACE;
- break;
- case XK_Delete:
- nKey = KEY_DELETE;
- break;
- case XK_space:
- nKey = KEY_SPACE;
- break;
- case XK_Tab:
- nKey = KEY_TAB;
- break;
- case XK_Escape:
- nKey = KEY_ESCAPE;
- break;
- case XK_plus:
- nKey = KEY_ADD;
- break;
- case XK_minus:
- nKey = KEY_SUBTRACT;
- break;
- case XK_asterisk:
- nKey = KEY_MULTIPLY;
- break;
- case XK_slash:
- nKey = KEY_DIVIDE;
- break;
- case XK_period:
- nKey = KEY_POINT;
- break;
- case XK_comma:
- nKey = KEY_COMMA;
- break;
- case XK_less:
- nKey = KEY_LESS;
- break;
- case XK_greater:
- nKey = KEY_GREATER;
- break;
- case XK_equal:
- nKey = KEY_EQUAL;
- break;
- case XK_Hangul_Hanja:
- nKey = KEY_HANGUL_HANJA;
- break;
- case XK_asciitilde:
- nKey = KEY_TILDE;
- *pcPrintable = '~';
- break;
- case XK_grave:
- nKey = KEY_QUOTELEFT;
- *pcPrintable = '`';
- break;
-// case XK_Linefeed:
-// *pcPrintable = '\n';
-// break;
- // - - - - - - - - - - - - - Apollo - - - - - - - - - - - - - 0x1000
- case 0x1000FF02: // apXK_Copy
- nKey = KEY_COPY;
- break;
- case 0x1000FF03: // apXK_Cut
- nKey = KEY_CUT;
- break;
- case 0x1000FF04: // apXK_Paste
- nKey = KEY_PASTE;
- break;
- case 0x1000FF14: // apXK_Repeat
- nKey = KEY_REPEAT;
- break;
- // Exit, Save
- // - - - - - - - - - - - - - - D E C - - - - - - - - - - - - - 0x1000
- case 0x1000FF00:
- nKey = KEY_DELETE;
- break;
- // - - - - - - - - - - - - - - H P - - - - - - - - - - - - - 0x1000
- case 0x1000FF73: // hpXK_DeleteChar
- nKey = KEY_DELETE;
- break;
- case 0x1000FF74: // hpXK_BackTab
- case 0x1000FF75: // hpXK_KP_BackTab
- nKey = KEY_TAB;
- break;
- // - - - - - - - - - - - - - - I B M - - - - - - - - - - - - -
- // - - - - - - - - - - - - - - O S F - - - - - - - - - - - - - 0x1004
- case 0x1004FF02: // osfXK_Copy
- nKey = KEY_COPY;
- break;
- case 0x1004FF03: // osfXK_Cut
- nKey = KEY_CUT;
- break;
- case 0x1004FF04: // osfXK_Paste
- nKey = KEY_PASTE;
- break;
- case 0x1004FF07: // osfXK_BackTab
- nKey = KEY_TAB;
- break;
- case 0x1004FF08: // osfXK_BackSpace
- nKey = KEY_BACKSPACE;
- break;
- case 0x1004FF1B: // osfXK_Escape
- nKey = KEY_ESCAPE;
- break;
- // Up, Down, Left, Right, PageUp, PageDown
- // - - - - - - - - - - - - - - S C O - - - - - - - - - - - - -
- // - - - - - - - - - - - - - - S G I - - - - - - - - - - - - - 0x1007
- // - - - - - - - - - - - - - - S N I - - - - - - - - - - - - -
- // - - - - - - - - - - - - - - S U N - - - - - - - - - - - - - 0x1005
- case 0x1005FF10: // SunXK_F36
- nKey = KEY_F11;
- break;
- case 0x1005FF11: // SunXK_F37
- nKey = KEY_F12;
- break;
- case 0x1005FF70: // SunXK_Props
- nKey = KEY_PROPERTIES;
- break;
- case 0x1005FF71: // SunXK_Front
- nKey = KEY_FRONT;
- break;
- case 0x1005FF72: // SunXK_Copy
- nKey = KEY_COPY;
- break;
- case 0x1005FF73: // SunXK_Open
- nKey = KEY_OPEN;
- break;
- case 0x1005FF74: // SunXK_Paste
- nKey = KEY_PASTE;
- break;
- case 0x1005FF75: // SunXK_Cut
- nKey = KEY_CUT;
- break;
- }
- return nKey;
-}
-
-// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-KeySym SalDisplay::GetKeySym( XKeyEvent *pEvent,
- unsigned char *pPrintable,
- int *pLen,
- KeySym *pUnmodifiedKeySym,
- Status *pStatusReturn,
- XIC aInputContext ) const
-{
- KeySym nKeySym = 0;
- memset( pPrintable, 0, *pLen );
- *pStatusReturn = 0;
-
- // first get the printable of the possibly modified KeySym
- if ( (aInputContext == 0)
- || (pEvent->type == KeyRelease)
- || (mpInputMethod != NULL && mpInputMethod->PosixLocale()) )
- {
- // XmbLookupString must not be called for KeyRelease events
- // Cannot enter space in c locale problem #89616# #88978# btraq #4478197
- *pLen = XLookupString( pEvent, (char*)pPrintable, 1, &nKeySym, NULL );
- }
- else
- {
- *pLen = XmbLookupString( aInputContext,
- pEvent, (char*)pPrintable, *pLen - 1, &nKeySym, pStatusReturn );
-
- // Lookup the string again, now with appropriate size
- if ( *pStatusReturn == XBufferOverflow )
- {
- pPrintable[ 0 ] = (char)0;
- return 0;
- }
-
- switch ( *pStatusReturn )
- {
- case XBufferOverflow:
- /* unhandled error */
- break;
- case XLookupNone:
- /* unhandled error */
- break;
- case XLookupKeySym:
- /* #72223# this is a strange one: on exceed sometimes
- * no printable is returned for the first char entered,
- * just to retry lookup solves the problem. The problem
- * is not yet fully understood, so restrict 2nd lookup
- * to 7bit ascii chars */
- if ( (XK_space <= nKeySym) && (XK_asciitilde >= nKeySym) )
- {
- *pLen = 1;
- pPrintable[ 0 ] = (char)nKeySym;
- }
- break;
- case XLookupBoth:
- case XLookupChars:
-
- /* nothing to, char allready in pPrintable */
- break;
- }
- }
-
- if( !bNumLockFromXS_
- && (IsCursorKey(nKeySym)
- || IsFunctionKey(nKeySym)
- || IsKeypadKey(nKeySym)
- || XK_Delete == nKeySym ) )
- {
- // Bei einigen X-Servern muss man bei den Keypadtasten
- // schon sehr genau hinschauen. ZB. Solaris XServer:
- // 2, 4, 6, 8 werden als Cursorkeys klassifiziert (Up, Down, Left, Right
- // 1, 3, 5, 9 werden als Functionkeys klassifiziert (F27,F29,F33,F35)
- // 0 als Keypadkey und der Dezimalpunkt gar nicht (KP_Insert)
- KeySym nNewKeySym = XLookupKeysym( pEvent, nNumLockIndex_ );
- if( nNewKeySym != NoSymbol )
- nKeySym = nNewKeySym;
- }
-
- // Now get the unmodified KeySym for KeyCode retrieval
- // try to strip off modifiers, e.g. Ctrl-$ becomes Ctrl-Shift-4
- *pUnmodifiedKeySym = XKeycodeToKeysym( GetDisplay(), pEvent->keycode, 0);
-
- return nKeySym;
-}
-
-// Pointer
-// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-#define MAKE_BITMAP( name ) \
- XCreateBitmapFromData( pDisp_, \
- DefaultRootWindow( pDisp_ ), \
- name##_bits, \
- name##_width, \
- name##_height )
-
-#define MAKE_CURSOR( name ) \
- aCursBitmap = MAKE_BITMAP( name##curs ); \
- aMaskBitmap = MAKE_BITMAP( name##mask ); \
- nXHot = name##curs_x_hot; \
- nYHot = name##curs_y_hot
-
-XLIB_Cursor SalDisplay::GetPointer( int ePointerStyle )
-{
- if( ePointerStyle >= POINTER_COUNT )
- return 0;
-
- XLIB_Cursor &aCur = aPointerCache_[ePointerStyle];
-
- if( aCur != None )
- return aCur;
-
- Pixmap aCursBitmap = None, aMaskBitmap = None;
- unsigned int nXHot = 0, nYHot = 0;
-
- switch( ePointerStyle )
- {
- case POINTER_NULL:
- MAKE_CURSOR( null );
- break;
- case POINTER_ARROW:
- aCur = XCreateFontCursor( pDisp_, XC_left_ptr );
- DBG_ASSERT( aCur != None, "GetPointer: Could not define cursor" );
- break;
- case POINTER_WAIT:
- aCur = XCreateFontCursor( pDisp_, XC_watch );
- break;
- case POINTER_TEXT: // Mouse Pointer ist ein "I" Beam
- aCur = XCreateFontCursor( pDisp_, XC_xterm );
- DBG_ASSERT( aCur != None, "GetPointer: Could not define cursor" );
- break;
- case POINTER_HELP:
- aCur = XCreateFontCursor( pDisp_, XC_question_arrow );
- DBG_ASSERT( aCur != None, "GetPointer: Could not define cursor" );
- break;
- case POINTER_CROSS: // Mouse Pointer ist ein Kreuz
- aCur = XCreateFontCursor( pDisp_, XC_crosshair );
- DBG_ASSERT( aCur != None, "GetPointer: Could not define cursor" );
- break;
- case POINTER_NSIZE:
- aCur = XCreateFontCursor( pDisp_, XC_sb_v_double_arrow );
- DBG_ASSERT( aCur != None, "GetPointer: Could not define cursor" );
- break;
- case POINTER_SSIZE:
- aCur = XCreateFontCursor( pDisp_, XC_sb_v_double_arrow );
- DBG_ASSERT( aCur != None, "GetPointer: Could not define cursor" );
- break;
- case POINTER_WSIZE:
- aCur = XCreateFontCursor( pDisp_, XC_sb_h_double_arrow );
- DBG_ASSERT( aCur != None, "GetPointer: Could not define cursor" );
- break;
- case POINTER_ESIZE:
- aCur = XCreateFontCursor( pDisp_, XC_sb_h_double_arrow );
- DBG_ASSERT( aCur != None, "GetPointer: Could not define cursor" );
- break;
- case POINTER_WINDOW_NSIZE:
- aCur = XCreateFontCursor( pDisp_, XC_top_side );
- DBG_ASSERT( aCur != None, "GetPointer: Could not define cursor" );
- break;
- case POINTER_WINDOW_SSIZE:
- aCur = XCreateFontCursor( pDisp_, XC_bottom_side );
- DBG_ASSERT( aCur != None, "GetPointer: Could not define cursor" );
- break;
- case POINTER_WINDOW_WSIZE:
- aCur = XCreateFontCursor( pDisp_, XC_left_side );
- DBG_ASSERT( aCur != None, "GetPointer: Could not define cursor" );
- break;
- case POINTER_WINDOW_ESIZE:
- aCur = XCreateFontCursor( pDisp_, XC_right_side );
- DBG_ASSERT( aCur != None, "GetPointer: Could not define cursor" );
- break;
- case POINTER_NWSIZE:
- aCur = XCreateFontCursor( pDisp_, XC_top_left_corner );
- break;
- case POINTER_NESIZE:
- aCur = XCreateFontCursor( pDisp_, XC_top_right_corner );
- break;
- case POINTER_SWSIZE:
- aCur = XCreateFontCursor( pDisp_, XC_bottom_left_corner );
- break;
- case POINTER_SESIZE:
- aCur = XCreateFontCursor( pDisp_, XC_bottom_right_corner );
- break;
- case POINTER_WINDOW_NWSIZE:
- aCur = XCreateFontCursor( pDisp_, XC_top_left_corner );
- DBG_ASSERT( aCur != None, "GetPointer: Could not define cursor" );
- break;
- case POINTER_WINDOW_NESIZE:
- aCur = XCreateFontCursor( pDisp_, XC_top_right_corner );
- DBG_ASSERT( aCur != None, "GetPointer: Could not define cursor" );
- break;
- case POINTER_WINDOW_SWSIZE:
- aCur = XCreateFontCursor( pDisp_, XC_bottom_left_corner );
- DBG_ASSERT( aCur != None, "GetPointer: Could not define cursor" );
- break;
- case POINTER_WINDOW_SESIZE:
- aCur = XCreateFontCursor( pDisp_, XC_bottom_right_corner );
- DBG_ASSERT( aCur != None, "GetPointer: Could not define cursor" );
- break;
- case POINTER_HSPLIT:
- aCur = XCreateFontCursor( pDisp_, XC_sb_h_double_arrow );
- break;
- case POINTER_VSPLIT:
- aCur = XCreateFontCursor( pDisp_, XC_sb_v_double_arrow );
- break;
- case POINTER_HSIZEBAR:
- aCur = XCreateFontCursor( pDisp_, XC_sb_h_double_arrow ); // ???
- DBG_ASSERT( aCur != None, "GetPointer: Could not define cursor" );
- break;
- case POINTER_VSIZEBAR:
- aCur = XCreateFontCursor( pDisp_, XC_sb_v_double_arrow ); // ???
- DBG_ASSERT( aCur != None, "GetPointer: Could not define cursor" );
- break;
- case POINTER_REFHAND:
- aCur = XCreateFontCursor( pDisp_, XC_hand1 );
- DBG_ASSERT( aCur != None, "GetPointer: Could not define cursor" );
- break;
- case POINTER_HAND:
- aCur = XCreateFontCursor( pDisp_, XC_hand2 );
- break;
- case POINTER_MAGNIFY:
- MAKE_CURSOR( magnify_ );
- break;
- case POINTER_FILL:
- MAKE_CURSOR( fill_ );
- break;
- case POINTER_MOVE:
- aCur = XCreateFontCursor( pDisp_, XC_fleur );
- break;
- case POINTER_MOVEDATA:
- MAKE_CURSOR( movedata_ );
- break;
- case POINTER_COPYDATA:
- MAKE_CURSOR( copydata_ );
- break;
- case POINTER_MOVEFILE:
- MAKE_CURSOR( movefile_ );
- break;
- case POINTER_COPYFILE:
- MAKE_CURSOR( copyfile_ );
- break;
- case POINTER_MOVEFILES:
- MAKE_CURSOR( movefiles_ );
- break;
- case POINTER_COPYFILES:
- MAKE_CURSOR( copyfiles_ );
- break;
- case POINTER_NOTALLOWED:
- MAKE_CURSOR( nodrop_ );
- break;
- case POINTER_ROTATE:
- MAKE_CURSOR( rotate_ );
- break;
- case POINTER_HSHEAR:
- MAKE_CURSOR( hshear_ );
- break;
- case POINTER_VSHEAR:
- MAKE_CURSOR( vshear_ );
- break;
- case POINTER_DRAW_LINE:
- MAKE_CURSOR( drawline_ );
- break;
- case POINTER_DRAW_RECT:
- MAKE_CURSOR( drawrect_ );
- break;
- case POINTER_DRAW_POLYGON:
- MAKE_CURSOR( drawpolygon_ );
- break;
- case POINTER_DRAW_BEZIER:
- MAKE_CURSOR( drawbezier_ );
- break;
- case POINTER_DRAW_ARC:
- MAKE_CURSOR( drawarc_ );
- break;
- case POINTER_DRAW_PIE:
- MAKE_CURSOR( drawpie_ );
- break;
- case POINTER_DRAW_CIRCLECUT:
- MAKE_CURSOR( drawcirclecut_ );
- break;
- case POINTER_DRAW_ELLIPSE:
- MAKE_CURSOR( drawellipse_ );
- break;
- case POINTER_DRAW_CONNECT:
- MAKE_CURSOR( drawconnect_ );
- break;
- case POINTER_DRAW_TEXT:
- MAKE_CURSOR( drawtext_ );
- break;
- case POINTER_MIRROR:
- MAKE_CURSOR( mirror_ );
- break;
- case POINTER_CROOK:
- MAKE_CURSOR( crook_ );
- break;
- case POINTER_CROP:
- MAKE_CURSOR( crop_ );
- break;
- case POINTER_MOVEPOINT:
- MAKE_CURSOR( movepoint_ );
- break;
- case POINTER_MOVEBEZIERWEIGHT:
- MAKE_CURSOR( movebezierweight_ );
- break;
- case POINTER_DRAW_FREEHAND:
- MAKE_CURSOR( drawfreehand_ );
- break;
- case POINTER_DRAW_CAPTION:
- MAKE_CURSOR( drawcaption_ );
- break;
- case POINTER_PEN: // Mouse Pointer ist ein Stift
- aCur = XCreateFontCursor( pDisp_, XC_pencil );
- DBG_ASSERT( aCur != None, "GetPointer: Could not define cursor" );
- break;
- case POINTER_LINKDATA:
- MAKE_CURSOR( linkdata_ );
- break;
- case POINTER_MOVEDATALINK:
- MAKE_CURSOR( movedlnk_ );
- break;
- case POINTER_COPYDATALINK:
- MAKE_CURSOR( copydlnk_ );
- break;
- case POINTER_LINKFILE:
- MAKE_CURSOR( linkfile_ );
- break;
- case POINTER_MOVEFILELINK:
- MAKE_CURSOR( moveflnk_ );
- break;
- case POINTER_COPYFILELINK:
- MAKE_CURSOR( copyflnk_ );
- break;
- case POINTER_CHART:
- MAKE_CURSOR( chart_ );
- break;
- case POINTER_DETECTIVE:
- MAKE_CURSOR( detective_ );
- break;
- case POINTER_PIVOT_COL:
- MAKE_CURSOR( pivotcol_ );
- break;
- case POINTER_PIVOT_ROW:
- MAKE_CURSOR( pivotrow_ );
- break;
- case POINTER_PIVOT_FIELD:
- MAKE_CURSOR( pivotfld_ );
- break;
- case POINTER_PIVOT_DELETE:
- MAKE_CURSOR( pivotdel_ );
- break;
- case POINTER_CHAIN:
- MAKE_CURSOR( chain_ );
- break;
- case POINTER_CHAIN_NOTALLOWED:
- MAKE_CURSOR( chainnot_ );
- break;
- case POINTER_TIMEEVENT_MOVE:
- MAKE_CURSOR( timemove_ );
- break;
- case POINTER_TIMEEVENT_SIZE:
- MAKE_CURSOR( timesize_ );
- break;
- case POINTER_AUTOSCROLL_N:
- MAKE_CURSOR(asn_ );
- break;
- case POINTER_AUTOSCROLL_S:
- MAKE_CURSOR( ass_ );
- break;
- case POINTER_AUTOSCROLL_W:
- MAKE_CURSOR( asw_ );
- break;
- case POINTER_AUTOSCROLL_E:
- MAKE_CURSOR( ase_ );
- break;
- case POINTER_AUTOSCROLL_NW:
- MAKE_CURSOR( asnw_ );
- break;
- case POINTER_AUTOSCROLL_NE:
- MAKE_CURSOR( asne_ );
- break;
- case POINTER_AUTOSCROLL_SW:
- MAKE_CURSOR( assw_ );
- break;
- case POINTER_AUTOSCROLL_SE:
- MAKE_CURSOR( asse_ );
- break;
- case POINTER_AUTOSCROLL_NS:
- MAKE_CURSOR( asns_ );
- break;
- case POINTER_AUTOSCROLL_WE:
- MAKE_CURSOR( aswe_ );
- break;
- case POINTER_AUTOSCROLL_NSWE:
- MAKE_CURSOR( asnswe_ );
- break;
- case POINTER_AIRBRUSH:
- MAKE_CURSOR( airbrush_ );
- break;
- case POINTER_TEXT_VERTICAL:
- MAKE_CURSOR( vertcurs_ );
- break;
-
- // --> FME 2004-07-30 #i32329# Enhanced table selection
- case POINTER_TAB_SELECT_S:
- MAKE_CURSOR( tblsels_ );
- break;
- case POINTER_TAB_SELECT_E:
- MAKE_CURSOR( tblsele_ );
- break;
- case POINTER_TAB_SELECT_SE:
- MAKE_CURSOR( tblselse_ );
- break;
- case POINTER_TAB_SELECT_W:
- MAKE_CURSOR( tblselw_ );
- break;
- case POINTER_TAB_SELECT_SW:
- MAKE_CURSOR( tblselsw_ );
- break;
- // <--
-
- // --> FME 2004-08-16 #i20119# Paintbrush tool
- case POINTER_PAINTBRUSH :
- MAKE_CURSOR( paintbrush_ );
- break;
- // <--
-
- default:
- DBG_ERROR("pointer not implemented");
- aCur = XCreateFontCursor( pDisp_, XC_arrow );
- break;
- }
-
- if( None == aCur )
- {
- XColor aBlack, aWhite, aDummy;
- Colormap hColormap = GetColormap(m_nDefaultScreen).GetXColormap();
-
- XAllocNamedColor( pDisp_, hColormap, "black", &aBlack, &aDummy );
- XAllocNamedColor( pDisp_, hColormap, "white", &aWhite, &aDummy );
-
- aCur = XCreatePixmapCursor( pDisp_,
- aCursBitmap, aMaskBitmap,
- &aBlack, &aWhite,
- nXHot, nYHot );
-
- XFreePixmap( pDisp_, aCursBitmap );
- XFreePixmap( pDisp_, aMaskBitmap );
- }
-
- return aCur;
-}
-
-int SalDisplay::CaptureMouse( SalFrame *pCapture )
-{
- if( !pCapture )
- {
- m_pCapture = NULL;
- XUngrabPointer( GetDisplay(), CurrentTime );
- XFlush( GetDisplay() );
- return 0;
- }
-
- m_pCapture = NULL;
-
- // FIXME: get rid of X11SalFrame
- const SystemEnvData* pEnvData = pCapture->GetSystemData();
- int ret = XGrabPointer( GetDisplay(),
- (XLIB_Window)pEnvData->aWindow,
- False,
- PointerMotionMask| ButtonPressMask|ButtonReleaseMask,
- GrabModeAsync,
- GrabModeAsync,
- None,
- static_cast<X11SalFrame*>(pCapture)->GetCursor(),
- CurrentTime );
-
- if( ret != GrabSuccess )
- {
- DBG_ASSERT( 1, "SalDisplay::CaptureMouse could not grab pointer\n");
- return -1;
- }
-
- m_pCapture = pCapture;
- return 1;
-}
-
-// Events
-// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-
-void SalDisplay::SendInternalEvent( SalFrame* pFrame, void* pData, USHORT nEvent )
-{
- if( osl_acquireMutex( hEventGuard_ ) )
- {
- m_aUserEvents.push_back( SalUserEvent( pFrame, pData, nEvent ) );
-
- // Notify SalXLib::Yield() of a pending event.
- pXLib_->PostUserEvent();
-
- osl_releaseMutex( hEventGuard_ );
- }
- else {
- DBG_ASSERT( 1, "SalDisplay::SendInternalEvent !acquireMutex\n" );
- }
-}
-
-void SalDisplay::CancelInternalEvent( SalFrame* pFrame, void* pData, USHORT nEvent )
-{
- if( osl_acquireMutex( hEventGuard_ ) )
- {
- if( ! m_aUserEvents.empty() )
- {
- std::list< SalUserEvent >::iterator it, next;
- next = m_aUserEvents.begin();
- do
- {
- it = next++;
- if( it->m_pFrame == pFrame &&
- it->m_pData == pData &&
- it->m_nEvent == nEvent )
- {
- m_aUserEvents.erase( it );
- }
- } while( next != m_aUserEvents.end() );
- }
-
- osl_releaseMutex( hEventGuard_ );
- }
- else {
- DBG_ASSERT( 1, "SalDisplay::CancelInternalEvent !acquireMutex\n" );
- }
-}
-
-BOOL SalX11Display::IsEvent()
-{
- BOOL bRet = FALSE;
-
- if( osl_acquireMutex( hEventGuard_ ) )
- {
- if( m_aUserEvents.begin() != m_aUserEvents.end() )
- bRet = TRUE;
- osl_releaseMutex( hEventGuard_ );
- }
-
- if( bRet || XEventsQueued( pDisp_, QueuedAlready ) )
- return TRUE;
-
- XFlush( pDisp_ );
- return FALSE;
-}
-
-bool SalDisplay::DispatchInternalEvent()
-{
- SalFrame* pFrame = NULL;
- void* pData = NULL;
- USHORT nEvent = 0;
-
- if( osl_acquireMutex( hEventGuard_ ) )
- {
- if( m_aUserEvents.begin() != m_aUserEvents.end() )
- {
- pFrame = m_aUserEvents.front().m_pFrame;
- pData = m_aUserEvents.front().m_pData;
- nEvent = m_aUserEvents.front().m_nEvent;
-
- m_aUserEvents.pop_front();
- }
- osl_releaseMutex( hEventGuard_ );
- }
- else {
- DBG_ASSERT( 1, "SalDisplay::Yield !acquireMutex\n" );
- }
-
- if( pFrame )
- pFrame->CallCallback( nEvent, pData );
-
- return pFrame != NULL;
-}
-
-// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-
-void SalX11Display::Yield()
-{
- if( DispatchInternalEvent() )
- return;
-
- XEvent aEvent;
- DBG_ASSERT( static_cast<SalYieldMutex*>(GetSalData()->m_pInstance->GetYieldMutex())->GetThreadId() ==
- vos::OThread::getCurrentIdentifier(),
- "will crash soon since solar mutex not locked in SalDisplay::Yield" );
-
- XNextEvent( pDisp_, &aEvent );
-
- Dispatch( &aEvent );
-
-#ifdef DBG_UTIL
- if( pXLib_->HasXErrorOccured() )
- {
- XFlush( pDisp_ );
- PrintEvent( "SalDisplay::Yield (WasXError)", &aEvent );
- }
-#endif
- pXLib_->ResetXErrorOccured();
-}
-
-long SalX11Display::Dispatch( XEvent *pEvent )
-{
- if( pEvent->type == XLIB_KeyPress || pEvent->type == KeyRelease )
- {
- XLIB_Window aWindow = pEvent->xkey.window;
-
- std::list< SalFrame* >::const_iterator it;
- for( it = m_aFrames.begin(); it != m_aFrames.end(); ++it )
- {
- const X11SalFrame* pFrame = static_cast< const X11SalFrame* >(*it);
- if( pFrame->GetWindow() == aWindow || pFrame->GetShellWindow() == aWindow )
- {
- aWindow = pFrame->GetWindow();
- break;
- }
- }
- if( it != m_aFrames.end() )
- {
- if ( mpInputMethod->FilterEvent( pEvent , aWindow ) )
- return 0;
- }
- }
- else
- if ( mpInputMethod->FilterEvent( pEvent, None ) )
- return 0;
-
- SalInstance* pInstance = GetSalData()->m_pInstance;
- pInstance->CallEventCallback( pEvent, sizeof( XEvent ) );
-
- switch( pEvent->type )
- {
- case MotionNotify:
- while( XCheckWindowEvent( pEvent->xany.display,
- pEvent->xany.window,
- ButtonMotionMask,
- pEvent ) )
- ;
- m_nLastUserEventTime = pEvent->xmotion.time;
- break;
- case PropertyNotify:
- if( pEvent->xproperty.atom == getWMAdaptor()->getAtom( WMAdaptor::VCL_SYSTEM_SETTINGS ) )
- {
- for( unsigned int i = 0; i < m_aScreens.size(); i++ )
- {
- if( pEvent->xproperty.window == m_aScreens[i].m_aRefWindow )
- {
- std::list< SalFrame* >::const_iterator it;
- for( it = m_aFrames.begin(); it != m_aFrames.end(); ++it )
- (*it)->CallCallback( SALEVENT_SETTINGSCHANGED, NULL );
- return 0;
- }
- }
- }
- break;
- case MappingNotify:
- if( MappingKeyboard == pEvent->xmapping.request ||
- MappingModifier == pEvent->xmapping.request )
- {
- XRefreshKeyboardMapping( &pEvent->xmapping );
- if( MappingModifier == pEvent->xmapping.request )
- ModifierMapping();
- if( MappingKeyboard == pEvent->xmapping.request ) // refresh mapping
- GetKeyboardName( TRUE );
- }
- break;
- case ButtonPress:
- case ButtonRelease:
- m_nLastUserEventTime = pEvent->xbutton.time;
- break;
- case XLIB_KeyPress:
- case KeyRelease:
- m_nLastUserEventTime = pEvent->xkey.time;
- break;
- default:
-
- if ( GetKbdExtension()->UseExtension()
- && GetKbdExtension()->GetEventBase() == pEvent->type )
- {
- GetKbdExtension()->Dispatch( pEvent );
- return 1;
- }
- break;
- }
-
- std::list< SalFrame* >::iterator it;
- for( it = m_aFrames.begin(); it != m_aFrames.end(); ++it )
- {
- X11SalFrame* pFrame = static_cast< X11SalFrame* >(*it);
- XLIB_Window aDispatchWindow = pEvent->xany.window;
- if( pFrame->GetWindow() == aDispatchWindow
- || pFrame->GetShellWindow() == aDispatchWindow
- || pFrame->GetForeignParent() == aDispatchWindow
- )
- {
- return pFrame->Dispatch( pEvent );
- }
- if( pEvent->type == ConfigureNotify && pEvent->xconfigure.window == pFrame->GetStackingWindow() )
- {
- return pFrame->Dispatch( pEvent );
- }
- }
-
- // dispatch to salobjects
- X11SalObject::Dispatch( pEvent );
-
- // is this perhaps a root window that changed size ?
- processRandREvent( pEvent );
-
- return 0;
-}
-
-// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-void SalDisplay::PrintEvent( const ByteString &rComment,
- XEvent *pEvent ) const
-{
- if( pEvent->type <= MappingNotify )
- {
- fprintf( stderr, "[%s] %s s=%d w=%ld\n",
- rComment.GetBuffer(),
- EventNames[pEvent->type],
- pEvent->xany.send_event,
- pEvent->xany.window );
-
- switch( pEvent->type )
- {
- case XLIB_KeyPress:
- case KeyRelease:
- fprintf( stderr, "\t\ts=%d c=%d\n",
- pEvent->xkey.state,
- pEvent->xkey.keycode );
- break;
-
- case ButtonPress:
- case ButtonRelease:
- fprintf( stderr, "\t\ts=%d b=%d x=%d y=%d rx=%d ry=%d\n",
- pEvent->xbutton.state,
- pEvent->xbutton.button,
- pEvent->xbutton.x,
- pEvent->xbutton.y,
- pEvent->xbutton.x_root,
- pEvent->xbutton.y_root );
- break;
-
- case MotionNotify:
- fprintf( stderr, "\t\ts=%d x=%d y=%d\n",
- pEvent->xmotion.state,
- pEvent->xmotion.x,
- pEvent->xmotion.y );
- break;
-
- case EnterNotify:
- case LeaveNotify:
- fprintf( stderr, "\t\tm=%d f=%d x=%d y=%d\n",
- pEvent->xcrossing.mode,
- pEvent->xcrossing.focus,
- pEvent->xcrossing.x,
- pEvent->xcrossing.y );
- break;
-
- case FocusIn:
- case FocusOut:
- fprintf( stderr, "\t\tm=%d d=%d\n",
- pEvent->xfocus.mode,
- pEvent->xfocus.detail );
- break;
-
- case Expose:
- case GraphicsExpose:
- fprintf( stderr, "\t\tc=%d %d*%d %d+%d\n",
- pEvent->xexpose.count,
- pEvent->xexpose.width,
- pEvent->xexpose.height,
- pEvent->xexpose.x,
- pEvent->xexpose.y );
- break;
-
- case VisibilityNotify:
- fprintf( stderr, "\t\ts=%d\n",
- pEvent->xvisibility.state );
- break;
-
- case CreateNotify:
- case DestroyNotify:
- break;
-
- case MapNotify:
- case UnmapNotify:
- break;
-
- case ReparentNotify:
- fprintf( stderr, "\t\tp=%d x=%d y=%d\n",
- sal::static_int_cast< int >(pEvent->xreparent.parent),
- pEvent->xreparent.x,
- pEvent->xreparent.y );
- break;
-
- case ConfigureNotify:
- fprintf( stderr, "\t\tb=%d %d*%d %d+%d\n",
- pEvent->xconfigure.border_width,
- pEvent->xconfigure.width,
- pEvent->xconfigure.height,
- pEvent->xconfigure.x,
- pEvent->xconfigure.y );
- break;
-
- case PropertyNotify:
- fprintf( stderr, "\t\ta=%s (0x%X)\n",
- GetAtomName( pDisp_, pEvent->xproperty.atom ),
- sal::static_int_cast< unsigned int >(
- pEvent->xproperty.atom) );
- break;
-
- case ColormapNotify:
- fprintf( stderr, "\t\tc=%ld n=%d s=%d\n",
- pEvent->xcolormap.colormap,
- pEvent->xcolormap.c_new,
- pEvent->xcolormap.state );
- break;
-
- case ClientMessage:
- fprintf( stderr, "\t\ta=%s (0x%X) f=%i [0x%lX,0x%lX,0x%lX,0x%lX,0x%lX])\n",
- GetAtomName( pDisp_, pEvent->xclient.message_type ),
- sal::static_int_cast< unsigned int >(
- pEvent->xclient.message_type),
- pEvent->xclient.format,
- pEvent->xclient.data.l[0],
- pEvent->xclient.data.l[1],
- pEvent->xclient.data.l[2],
- pEvent->xclient.data.l[3],
- pEvent->xclient.data.l[4] );
- break;
-
- case MappingNotify:
- fprintf( stderr, "\t\tr=%sd\n",
- MappingModifier == pEvent->xmapping.request
- ? "MappingModifier"
- : MappingKeyboard == pEvent->xmapping.request
- ? "MappingKeyboard"
- : "MappingPointer" );
-
- break;
- }
- }
- else
- fprintf( stderr, "[%s] %d s=%d w=%ld\n",
- rComment.GetBuffer(),
- pEvent->type,
- pEvent->xany.send_event,
- pEvent->xany.window );
-}
-
-// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-void SalDisplay::PrintInfo() const
-{
- if( IsDisplay() )
- {
- fprintf( stderr, "\n" );
- fprintf( stderr, "Environment\n" );
- fprintf( stderr, "\t$XENVIRONMENT \t\"%s\"\n",
- GetEnv( "XENVIRONMENT" ) );
- fprintf( stderr, "\t$DISPLAY \t\"%s\"\n",
- GetEnv( "DISPLAY" ) );
- fprintf( stderr, "\t$SAL_VISUAL \t\"%s\"\n",
- GetEnv( "SAL_VISUAL" ) );
- fprintf( stderr, "\t$SAL_FONTPATH \t\"%s\"\n",
- GetEnv( "SAL_FONTPATH" ) );
- fprintf( stderr, "\t$SAL_NOSEGV \t\"%s\"\n",
- GetEnv( "SAL_NOSEGV" ) );
- fprintf( stderr, "\t$SAL_IGNOREXERRORS\t\"%s\"\n",
- GetEnv( "SAL_IGNOREXERRORS" ) );
- fprintf( stderr, "\t$SAL_PROPERTIES \t\"%s\"\n",
- GetEnv( "SAL_PROPERTIES" ) );
- fprintf( stderr, "\t$SAL_WM \t\"%s\"\n",
- GetEnv( "SAL_WM" ) );
- fprintf( stderr, "\t$SAL_SYNCHRONIZE \t\"%s\"\n",
- GetEnv( "SAL_SYNCHRONIZE" ) );
-
- char sHostname[ 120 ];
- gethostname (sHostname, 120 );
- fprintf( stderr, "Client\n" );
- fprintf( stderr, "\tHost \t\"%s\"\n",
- sHostname );
-
- fprintf( stderr, "Display\n" );
- fprintf( stderr, "\tHost \t\"%s\"\n",
- DisplayString(pDisp_) );
- fprintf( stderr, "\tVendor (Release) \t\"%s (%d)\"\n",
- ServerVendor(pDisp_), VendorRelease(pDisp_) );
- fprintf( stderr, "\tProtocol \t%d.%d\n",
- ProtocolVersion(pDisp_), ProtocolRevision(pDisp_) );
- fprintf( stderr, "\tScreen (count,def)\t%d (%d,%d)\n",
- m_nDefaultScreen, ScreenCount(pDisp_), DefaultScreen(pDisp_) );
- fprintf( stderr, "\tshift ctrl alt \t%s (0x%X) %s (0x%X) %s (0x%X)\n",
- KeyStr( nShiftKeySym_ ), sal::static_int_cast< unsigned int >(nShiftKeySym_),
- KeyStr( nCtrlKeySym_ ), sal::static_int_cast< unsigned int >(nCtrlKeySym_),
- KeyStr( nMod1KeySym_ ), sal::static_int_cast< unsigned int >(nMod1KeySym_) );
- if( XExtendedMaxRequestSize(pDisp_) * 4 )
- fprintf( stderr, "\tXMaxRequestSize \t%ld %ld [bytes]\n",
- XMaxRequestSize(pDisp_) * 4, XExtendedMaxRequestSize(pDisp_) * 4 );
- if( GetProperties() != PROPERTY_DEFAULT )
- fprintf( stderr, "\tProperties \t0x%lX\n", GetProperties() );
- if( eWindowManager_ != otherwm )
- fprintf( stderr, "\tWindowmanager \t%d\n", eWindowManager_ );
- fprintf( stderr, "\tWMName \t%s\n", rtl::OUStringToOString( getWMAdaptor()->getWindowManagerName(), osl_getThreadTextEncoding() ).getStr() );
- }
- fprintf( stderr, "Screen\n" );
- fprintf( stderr, "\tResolution/Size \t%ld*%ld %ld*%ld %.1lf\"\n",
- aResolution_.A(), aResolution_.B(),
- m_aScreens[m_nDefaultScreen].m_aSize.Width(), m_aScreens[m_nDefaultScreen].m_aSize.Height(),
- Hypothenuse( DisplayWidthMM ( pDisp_, m_nDefaultScreen ),
- DisplayHeightMM( pDisp_, m_nDefaultScreen ) ) / 25.4 );
- fprintf( stderr, "\tBlack&White \t%lu %lu\n",
- GetColormap(m_nDefaultScreen).GetBlackPixel(), GetColormap(m_nDefaultScreen).GetWhitePixel() );
- fprintf( stderr, "\tRGB \t0x%lx 0x%lx 0x%lx\n",
- GetVisual(m_nDefaultScreen).red_mask, GetVisual(m_nDefaultScreen).green_mask, GetVisual(m_nDefaultScreen).blue_mask );
- fprintf( stderr, "\tVisual \t%d-bit %s ID=0x%x\n",
- GetVisual(m_nDefaultScreen).GetDepth(),
- VisualClassName[ GetVisual(m_nDefaultScreen).GetClass() ],
- sal::static_int_cast< unsigned int >(GetVisual(m_nDefaultScreen).GetVisualId()) );
-}
-
-int SalDisplay::addXineramaScreenUnique( long i_nX, long i_nY, long i_nWidth, long i_nHeight )
-{
- // see if any frame buffers are at the same coordinates
- // this can happen with weird configuration e.g. on
- // XFree86 and Clone displays
- const size_t nScreens = m_aXineramaScreens.size();
- for( size_t n = 0; n < nScreens; n++ )
- {
- if( m_aXineramaScreens[n].Left() == i_nX &&
- m_aXineramaScreens[n].Top() == i_nY )
- {
- if( m_aXineramaScreens[n].GetWidth() < i_nWidth ||
- m_aXineramaScreens[n].GetHeight() < i_nHeight )
- {
- m_aXineramaScreens[n].SetSize( Size( i_nWidth, i_nHeight ) );
- }
- return (int)n;
- }
- }
- m_aXineramaScreens.push_back( Rectangle( Point( i_nX, i_nY ), Size( i_nWidth, i_nHeight ) ) );
- return (int)m_aXineramaScreens.size()-1;
-}
-
-void SalDisplay::InitXinerama()
-{
- if( m_aScreens.size() > 1 )
- {
- m_bXinerama = false;
- return; // multiple screens mean no xinerama
- }
-#ifdef USE_XINERAMA
-#if defined(USE_XINERAMA_XSUN)
- int nFramebuffers = 1;
- if( XineramaGetState( pDisp_, m_nDefaultScreen ) )
- {
- XRectangle pFramebuffers[MAXFRAMEBUFFERS];
- unsigned char hints[MAXFRAMEBUFFERS];
- int result = XineramaGetInfo( pDisp_,
- m_nDefaultScreen,
- pFramebuffers,
- hints,
- &nFramebuffers );
- if( result > 0 && nFramebuffers > 1 )
- {
- m_bXinerama = true;
- m_aXineramaScreens = std::vector<Rectangle>();
- for( int i = 0; i < nFramebuffers; i++ )
- addXineramaScreenUnique( pFramebuffers[i].x,
- pFramebuffers[i].y,
- pFramebuffers[i].width,
- pFramebuffers[i].height );
- }
- }
-#elif defined(USE_XINERAMA_XORG)
-if( XineramaIsActive( pDisp_ ) )
-{
- int nFramebuffers = 1;
- XineramaScreenInfo* pScreens = XineramaQueryScreens( pDisp_, &nFramebuffers );
- if( pScreens )
- {
- if( nFramebuffers > 1 )
- {
- m_aXineramaScreens = std::vector<Rectangle>();
- for( int i = 0; i < nFramebuffers; i++ )
- {
- addXineramaScreenUnique( pScreens[i].x_org,
- pScreens[i].y_org,
- pScreens[i].width,
- pScreens[i].height );
- }
- m_bXinerama = m_aXineramaScreens.size() > 1;
- }
- XFree( pScreens );
- }
-}
-#endif
-#if OSL_DEBUG_LEVEL > 1
- if( m_bXinerama )
- {
- for( std::vector< Rectangle >::const_iterator it = m_aXineramaScreens.begin(); it != m_aXineramaScreens.end(); ++it )
- fprintf( stderr, "Xinerama screen: %ldx%ld+%ld+%ld\n", it->GetWidth(), it->GetHeight(), it->Left(), it->Top() );
- }
-#endif
-#endif // USE_XINERAMA
-}
-
-void SalDisplay::registerFrame( SalFrame* pFrame )
-{
- m_aFrames.push_front( pFrame );
-}
-
-void SalDisplay::deregisterFrame( SalFrame* pFrame )
-{
- if( osl_acquireMutex( hEventGuard_ ) )
- {
- std::list< SalUserEvent >::iterator it = m_aUserEvents.begin();
- while ( it != m_aUserEvents.end() )
- {
- if( it->m_pFrame == pFrame )
- it = m_aUserEvents.erase( it );
- else
- ++it;
- }
- osl_releaseMutex( hEventGuard_ );
- }
- else {
- DBG_ERROR( "SalDisplay::deregisterFrame !acquireMutex\n" );
- }
-
- m_aFrames.remove( pFrame );
-}
-
-
-extern "C"
-{
- static Bool timestamp_predicate( Display*, XEvent* i_pEvent, XPointer i_pArg )
- {
- SalDisplay* pSalDisplay = reinterpret_cast<SalDisplay*>(i_pArg);
- if( i_pEvent->type == PropertyNotify &&
- i_pEvent->xproperty.window == pSalDisplay->GetDrawable( pSalDisplay->GetDefaultScreenNumber() ) &&
- i_pEvent->xproperty.atom == pSalDisplay->getWMAdaptor()->getAtom( WMAdaptor::SAL_GETTIMEEVENT )
- )
- return True;
-
- return False;
- }
-}
-
-XLIB_Time SalDisplay::GetLastUserEventTime( bool i_bAlwaysReget ) const
-{
- if( m_nLastUserEventTime == CurrentTime || i_bAlwaysReget )
- {
- // get current server time
- unsigned char c = 0;
- XEvent aEvent;
- Atom nAtom = getWMAdaptor()->getAtom( WMAdaptor::SAL_GETTIMEEVENT );
- XChangeProperty( GetDisplay(), GetDrawable( GetDefaultScreenNumber() ),
- nAtom, nAtom, 8, PropModeReplace, &c, 1 );
- XFlush( GetDisplay() );
-
- if( ! XIfEventWithTimeout( &aEvent, (XPointer)this, timestamp_predicate ) )
- {
- // this should not happen at all; still sometimes it happens
- aEvent.xproperty.time = CurrentTime;
- }
-
- m_nLastUserEventTime = aEvent.xproperty.time;
- }
- return m_nLastUserEventTime;
-}
-
-bool SalDisplay::XIfEventWithTimeout( XEvent* o_pEvent, XPointer i_pPredicateData,
- X_if_predicate i_pPredicate, long i_nTimeout ) const
-{
- /* #i99360# ugly workaround an X11 library bug
- this replaces the following call:
- XIfEvent( GetDisplay(), o_pEvent, i_pPredicate, i_pPredicateData );
- */
- bool bRet = true;
-
- if( ! XCheckIfEvent( GetDisplay(), o_pEvent, i_pPredicate, i_pPredicateData ) )
- {
- // wait for some event to arrive
- struct pollfd aFD;
- aFD.fd = ConnectionNumber(GetDisplay());
- aFD.events = POLLIN;
- aFD.revents = 0;
- poll( &aFD, 1, i_nTimeout );
- if( ! XCheckIfEvent( GetDisplay(), o_pEvent, i_pPredicate, i_pPredicateData ) )
- {
- poll( &aFD, 1, i_nTimeout ); // try once more for a packet of events from the Xserver
- if( ! XCheckIfEvent( GetDisplay(), o_pEvent, i_pPredicate, i_pPredicateData ) )
- {
- bRet = false;
- }
- }
- }
- return bRet;
-}
-
-// -=-= SalVisual -=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-SalVisual::SalVisual()
-{
- rtl_zeroMemory( this, sizeof( SalVisual ) );
-}
-
-SalVisual::SalVisual( const XVisualInfo* pXVI )
-{
- *(XVisualInfo*)this = *pXVI;
- if( GetClass() == TrueColor )
- {
- nRedShift_ = sal_Shift( red_mask );
- nGreenShift_ = sal_Shift( green_mask );
- nBlueShift_ = sal_Shift( blue_mask );
-
- nRedBits_ = sal_significantBits( red_mask );
- nGreenBits_ = sal_significantBits( green_mask );
- nBlueBits_ = sal_significantBits( blue_mask );
-
- if( GetDepth() == 24 )
- if( red_mask == 0xFF0000 )
- if( green_mask == 0xFF00 )
- if( blue_mask == 0xFF )
- eRGBMode_ = RGB;
- else
- eRGBMode_ = other;
- else if( blue_mask == 0xFF00 )
- if( green_mask == 0xFF )
- eRGBMode_ = RBG;
- else
- eRGBMode_ = other;
- else
- eRGBMode_ = other;
- else if( green_mask == 0xFF0000 )
- if( red_mask == 0xFF00 )
- if( blue_mask == 0xFF )
- eRGBMode_ = GRB;
- else
- eRGBMode_ = other;
- else if( blue_mask == 0xFF00 )
- if( red_mask == 0xFF )
- eRGBMode_ = GBR;
- else
- eRGBMode_ = other;
- else
- eRGBMode_ = other;
- else if( blue_mask == 0xFF0000 )
- if( red_mask == 0xFF00 )
- if( green_mask == 0xFF )
- eRGBMode_ = BRG;
- else
- eRGBMode_ = other;
- else if( green_mask == 0xFF00 )
- if( red_mask == 0xFF )
- eRGBMode_ = BGR;
- else
- eRGBMode_ = other;
- else
- eRGBMode_ = other;
- else
- eRGBMode_ = other;
- else
- eRGBMode_ = other;
- }
-}
-
-// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-SalVisual::~SalVisual()
-{
- if( -1 == screen && VisualID(-1) == visualid ) delete visual;
-}
-
-// Konvertiert die Reihenfolge der Bytes eines Pixel in Bytes eines SalColors
-// fuer die 6 XXXA ist das nicht reversibel
-// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-// SalColor is RGB (ABGR) a=0xFF000000, r=0xFF0000, g=0xFF00, b=0xFF
-
-#define SALCOLOR RGB
-#define SALCOLORREVERSE BGR
-
-BOOL SalVisual::Convert( int &n0, int &n1, int &n2, int &n3 )
-{
- int n;
-
- switch( GetMode() )
- {
- case other:
- return FALSE;
- case SALCOLOR:
- break;
- case SALCOLORREVERSE:
- case RBG:
- case BRG:
- case GBR:
- case GRB:
- return Convert( n0, n1, n2 );
- case RGBA:
- n = n0;
- n0 = n1;
- n1 = n2;
- n2 = n3;
- n3 = n;
- break;
- case BGRA:
- case RBGA:
- case BRGA:
- case GBRA:
- case GRBA:
- default:
- fprintf( stderr, "SalVisual::Convert %d\n", GetMode() );
- abort();
- }
- return TRUE;
-}
-
-BOOL SalVisual::Convert( int &n0, int &n1, int &n2 )
-{
- int n;
-
- switch( GetMode() )
- {
- case other:
- return FALSE;
- case SALCOLOR:
- break;
- case RBG:
- n = n0;
- n0 = n1;
- n1 = n;
- break;
- case GRB:
- n = n1;
- n1 = n2;
- n2 = n;
- break;
- case SALCOLORREVERSE:
- n = n0;
- n0 = n2;
- n2 = n;
- break;
- case BRG:
- n = n0;
- n0 = n1;
- n1 = n2;
- n2 = n;
- break;
- case GBR:
- n = n2;
- n2 = n1;
- n1 = n0;
- n0 = n;
- break;
- default:
- fprintf( stderr, "SalVisual::Convert %d\n", GetMode() );
- abort();
- }
- return TRUE;
-}
-
-// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-SalColor SalVisual::GetTCColor( Pixel nPixel ) const
-{
- if( SALCOLOR == eRGBMode_ )
- return (SalColor)nPixel;
-
- if( SALCOLORREVERSE == eRGBMode_ )
- return MAKE_SALCOLOR( (nPixel & 0x0000FF),
- (nPixel & 0x00FF00) >> 8,
- (nPixel & 0xFF0000) >> 16);
-
- Pixel r = nPixel & red_mask;
- Pixel g = nPixel & green_mask;
- Pixel b = nPixel & blue_mask;
-
- if( other != eRGBMode_ ) // 8+8+8=24
- return MAKE_SALCOLOR( r >> nRedShift_,
- g >> nGreenShift_,
- b >> nBlueShift_ );
-
- if( nRedShift_ > 0 ) r >>= nRedShift_; else r <<= -nRedShift_;
- if( nGreenShift_ > 0 ) g >>= nGreenShift_; else g <<= -nGreenShift_;
- if( nBlueShift_ > 0 ) b >>= nBlueShift_; else b <<= -nBlueShift_;
-
- if( nRedBits_ != 8 )
- r |= (r & 0xff) >> (8-nRedBits_);
- if( nGreenBits_ != 8 )
- g |= (g & 0xff) >> (8-nGreenBits_);
- if( nBlueBits_ != 8 )
- b |= (b & 0xff) >> (8-nBlueBits_);
-
- return MAKE_SALCOLOR( r, g, b );
-}
-
-Pixel SalVisual::GetTCPixel( SalColor nSalColor ) const
-{
- if( SALCOLOR == eRGBMode_ )
- return (Pixel)nSalColor;
-
- Pixel r = (Pixel)SALCOLOR_RED( nSalColor );
- Pixel g = (Pixel)SALCOLOR_GREEN( nSalColor );
- Pixel b = (Pixel)SALCOLOR_BLUE( nSalColor );
-
- if( SALCOLORREVERSE == eRGBMode_ )
- return (b << 16) | (g << 8) | (r);
-
- if( other != eRGBMode_ ) // 8+8+8=24
- return (r << nRedShift_) | (g << nGreenShift_) | (b << nBlueShift_);
-
- if( nRedShift_ > 0 ) r <<= nRedShift_; else r >>= -nRedShift_;
- if( nGreenShift_ > 0 ) g <<= nGreenShift_; else g >>= -nGreenShift_;
- if( nBlueShift_ > 0 ) b <<= nBlueShift_; else b >>= -nBlueShift_;
-
- return (r&red_mask) | (g&green_mask) | (b&blue_mask);
-}
-
-// -=-= SalColormap -=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-SalColormap::SalColormap( const SalDisplay *pDisplay, Colormap hColormap, int nScreen )
- : m_pDisplay( pDisplay ),
- m_hColormap( hColormap ),
- m_nScreen( nScreen )
-{
- m_aVisual = m_pDisplay->GetVisual( m_nScreen );
-
- XColor aColor;
-
- GetXPixel( aColor, 0x00, 0x00, 0x00 );
- m_nBlackPixel = aColor.pixel;
-
- GetXPixel( aColor, 0xFF, 0xFF, 0xFF );
- m_nWhitePixel = aColor.pixel;
-
- m_nUsed = 1 << m_aVisual.GetDepth();
-
- if( m_aVisual.GetClass() == PseudoColor )
- {
- int r, g, b;
-
- // black, white, gray, ~gray = 4
- GetXPixels( aColor, 0xC0, 0xC0, 0xC0 );
-
- // light colors: 3 * 2 = 6
-// GetXPixels( aColor, 0x00, 0x00, 0x00 );
- GetXPixels( aColor, 0x00, 0x00, 0xFF );
- GetXPixels( aColor, 0x00, 0xFF, 0x00 );
- GetXPixels( aColor, 0x00, 0xFF, 0xFF );
-// GetXPixels( aColor, 0xFF, 0x00, 0x00 );
-// GetXPixels( aColor, 0xFF, 0x00, 0xFF );
-// GetXPixels( aColor, 0xFF, 0xFF, 0x00 );
-// GetXPixels( aColor, 0xFF, 0xFF, 0xFF );
-
- // standard colors: 7 * 2 = 14
-// GetXPixels( aColor, 0x00, 0x00, 0x00 );
- GetXPixels( aColor, 0x00, 0x00, 0x80 );
- GetXPixels( aColor, 0x00, 0x80, 0x00 );
- GetXPixels( aColor, 0x00, 0x80, 0x80 );
- GetXPixels( aColor, 0x80, 0x00, 0x00 );
- GetXPixels( aColor, 0x80, 0x00, 0x80 );
- GetXPixels( aColor, 0x80, 0x80, 0x00 );
- GetXPixels( aColor, 0x80, 0x80, 0x80 );
- GetXPixels( aColor, 0x00, 0xB8, 0xFF ); // Blau 7
-
- // cube: 6*6*6 - 8 = 208
- for( r = 0; r < 0x100; r += 0x33 ) // 0x33, 0x66, 0x99, 0xCC, 0xFF
- for( g = 0; g < 0x100; g += 0x33 )
- for( b = 0; b < 0x100; b += 0x33 )
- GetXPixels( aColor, r, g, b );
-
- // gray: 16 - 6 = 10
- for( g = 0x11; g < 0xFF; g += 0x11 )
- GetXPixels( aColor, g, g, g );
-
- // green: 16 - 6 = 10
- for( g = 0x11; g < 0xFF; g += 0x11 )
- GetXPixels( aColor, 0, g, 0 );
-
- // red: 16 - 6 = 10
- for( r = 0x11; r < 0xFF; r += 0x11 )
- GetXPixels( aColor, r, 0, 0 );
-
- // blue: 16 - 6 = 10
- for( b = 0x11; b < 0xFF; b += 0x11 )
- GetXPixels( aColor, 0, 0, b );
- }
-}
-
-// PseudoColor
-SalColormap::SalColormap( const BitmapPalette &rPalette )
- : m_pDisplay( GetX11SalData()->GetDisplay() ),
- m_hColormap( None ),
- m_nWhitePixel( SALCOLOR_NONE ),
- m_nBlackPixel( SALCOLOR_NONE ),
- m_nUsed( rPalette.GetEntryCount() ),
- m_nScreen( GetX11SalData()->GetDisplay()->GetDefaultScreenNumber() )
-{
- m_aPalette = std::vector<SalColor>(m_nUsed);
-
- for( unsigned int i = 0; i < m_nUsed; i++ )
- {
- const BitmapColor &rColor = rPalette[i];
- m_aPalette[i] = MAKE_SALCOLOR( rColor.GetRed(),
- rColor.GetGreen(),
- rColor.GetBlue() );
- if( (m_nBlackPixel == SALCOLOR_NONE) && (SALCOLOR_BLACK == m_aPalette[i]) )
- m_nBlackPixel = i;
- else if( (m_nWhitePixel == SALCOLOR_NONE) && (SALCOLOR_WHITE == m_aPalette[i]) )
- m_nWhitePixel = i;
- }
-}
-
-// MonoChrome
-SalColormap::SalColormap()
- : m_pDisplay( GetX11SalData()->GetDisplay() ),
- m_hColormap( None ),
- m_nWhitePixel( 1 ),
- m_nBlackPixel( 0 ),
- m_nUsed( 2 ),
- m_nScreen( 0 )
-{
- if( m_pDisplay )
- m_nScreen = m_pDisplay->GetDefaultScreenNumber();
- m_aPalette = std::vector<SalColor>(m_nUsed);
-
- m_aPalette[m_nBlackPixel] = SALCOLOR_BLACK;
- m_aPalette[m_nWhitePixel] = SALCOLOR_WHITE;
-}
-
-// TrueColor
-SalColormap::SalColormap( USHORT nDepth )
- : m_pDisplay( GetX11SalData()->GetDisplay() ),
- m_hColormap( None ),
- m_nWhitePixel( (1 << nDepth) - 1 ),
- m_nBlackPixel( 0x00000000 ),
- m_nUsed( 1 << nDepth ),
- m_nScreen( GetX11SalData()->GetDisplay()->GetDefaultScreenNumber() )
-{
- const SalVisual *pVisual = &m_pDisplay->GetVisual( m_nScreen );
-
- if( pVisual->GetClass() == TrueColor && pVisual->GetDepth() == nDepth )
- m_aVisual = *pVisual;
- else
- {
- XVisualInfo aVI;
-
- if( !XMatchVisualInfo( m_pDisplay->GetDisplay(),
- m_pDisplay->GetDefaultScreenNumber(),
- nDepth,
- TrueColor,
- &aVI ) )
- {
- aVI.visual = new Visual();
- aVI.visualid = (VisualID)0; // beware of temporary destructor below
- aVI.screen = 0;
- aVI.depth = nDepth;
- aVI.c_class = TrueColor;
- if( 24 == nDepth ) // 888
- {
- aVI.red_mask = 0xFF0000;
- aVI.green_mask = 0x00FF00;
- aVI.blue_mask = 0x0000FF;
- }
- else if( 16 == nDepth ) // 565
- {
- aVI.red_mask = 0x00F800;
- aVI.green_mask = 0x0007E0;
- aVI.blue_mask = 0x00001F;
- }
- else if( 15 == nDepth ) // 555
- {
- aVI.red_mask = 0x007C00;
- aVI.green_mask = 0x0003E0;
- aVI.blue_mask = 0x00001F;
- }
- else if( 12 == nDepth ) // 444
- {
- aVI.red_mask = 0x000F00;
- aVI.green_mask = 0x0000F0;
- aVI.blue_mask = 0x00000F;
- }
- else if( 8 == nDepth ) // 332
- {
- aVI.red_mask = 0x0000E0;
- aVI.green_mask = 0x00001C;
- aVI.blue_mask = 0x000003;
- }
- else
- {
- aVI.red_mask = 0x000000;
- aVI.green_mask = 0x000000;
- aVI.blue_mask = 0x000000;
- }
- aVI.colormap_size = 0;
- aVI.bits_per_rgb = 8;
-
- aVI.visual->ext_data = NULL;
- aVI.visual->visualid = aVI.visualid;
- aVI.visual->c_class = aVI.c_class;
- aVI.visual->red_mask = aVI.red_mask;
- aVI.visual->green_mask = aVI.green_mask;
- aVI.visual->blue_mask = aVI.blue_mask;
- aVI.visual->bits_per_rgb = aVI.bits_per_rgb;
- aVI.visual->map_entries = aVI.colormap_size;
-
- m_aVisual = SalVisual( &aVI );
- // give ownership of constructed Visual() to m_aVisual
- // see SalVisual destructor
- m_aVisual.visualid = (VisualID)-1;
- m_aVisual.screen = -1;
- }
- else
- m_aVisual = SalVisual( &aVI );
- }
-}
-
-SalColormap::~SalColormap()
-{
-#ifdef DBG_UTIL
- m_hColormap = (Colormap)ILLEGAL_POINTER;
- m_pDisplay = (SalDisplay*)ILLEGAL_POINTER;
-#endif
-}
-
-// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-void SalColormap::SetPalette( const BitmapPalette &rPalette )
-{
- if( this != &GetX11SalData()->GetDisplay()->GetColormap(m_nScreen) )
- {
- m_nBlackPixel = SALCOLOR_NONE;
- m_nWhitePixel = SALCOLOR_NONE;
- }
-
- if( rPalette.GetEntryCount() > m_nUsed )
- {
- m_nBlackPixel = SALCOLOR_NONE;
- m_nWhitePixel = SALCOLOR_NONE;
- m_nUsed = rPalette.GetEntryCount();
- m_aPalette = std::vector<SalColor>(m_nUsed);
- }
-
- for( int i = 0; i < rPalette.GetEntryCount(); i++ )
- {
- const BitmapColor &rColor = rPalette[i];
- m_aPalette[i] = MAKE_SALCOLOR( rColor.GetRed(),
- rColor.GetGreen(),
- rColor.GetBlue() );
- if( (m_nBlackPixel == SALCOLOR_NONE) && (SALCOLOR_BLACK == m_aPalette[i]) )
- m_nBlackPixel = i;
- else if( (m_nWhitePixel == SALCOLOR_NONE) && (SALCOLOR_WHITE == m_aPalette[i]) )
- m_nWhitePixel = i;
- }
-}
-
-void SalColormap::GetPalette()
-{
- Pixel i;
- m_aPalette = std::vector<SalColor>(m_nUsed);
-
- XColor *aColor = new XColor[m_nUsed];
-
- for( i = 0; i < m_nUsed; i++ )
- {
- aColor[i].red = aColor[i].green = aColor[i].blue = 0;
- aColor[i].pixel = i;
- }
-
- XQueryColors( m_pDisplay->GetDisplay(), m_hColormap, aColor, m_nUsed );
-
- for( i = 0; i < m_nUsed; i++ )
- {
- m_aPalette[i] = MAKE_SALCOLOR( aColor[i].red >> 8,
- aColor[i].green >> 8,
- aColor[i].blue >> 8 );
- }
-
- delete [] aColor;
-}
-
-// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-static USHORT sal_Lookup( const std::vector<SalColor>& rPalette,
- int r, int g, int b,
- Pixel nUsed )
-{
- USHORT nPixel = 0;
- int nBest = ColorDiff( rPalette[0], r, g, b );
-
- for( USHORT i = 1; i < nUsed; i++ )
- {
- int n = ColorDiff( rPalette[i], r, g, b );
-
- if( n < nBest )
- {
- if( !n )
- return i;
-
- nPixel = i;
- nBest = n;
- }
- }
- return nPixel;
-}
-
-void SalColormap::GetLookupTable()
-{
- m_aLookupTable = std::vector<USHORT>(16*16*16);
-
- int i = 0;
- for( int r = 0; r < 256; r += 17 )
- for( int g = 0; g < 256; g += 17 )
- for( int b = 0; b < 256; b += 17 )
- m_aLookupTable[i++] = sal_Lookup( m_aPalette, r, g, b, m_nUsed );
-}
-
-// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-SalColor SalColormap::GetColor( Pixel nPixel ) const
-{
- if( m_nBlackPixel == nPixel ) return SALCOLOR_BLACK;
- if( m_nWhitePixel == nPixel ) return SALCOLOR_WHITE;
-
- if( m_aVisual.GetVisual() )
- {
- if( m_aVisual.GetClass() == TrueColor )
- return m_aVisual.GetTCColor( nPixel );
-
- if( m_aPalette.empty()
- && m_hColormap
-#ifdef PSEUDOCOLOR12
- && m_aVisual.GetDepth() <= 12
-#else
- && m_aVisual.GetDepth() <= 8
-#endif
- && m_aVisual.GetClass() == PseudoColor )
- ((SalColormap*)this)->GetPalette();
- }
-
- if( !m_aPalette.empty() && nPixel < m_nUsed )
- return m_aPalette[nPixel];
-
- if( m_hColormap )
- {
- DBG_ASSERT( 1, "SalColormap::GetColor() !hColormap_\n" );
- return nPixel;
- }
-
- // DirectColor, StaticColor, StaticGray, GrayScale
- XColor aColor;
-
- aColor.pixel = nPixel;
-
- XQueryColor( m_pDisplay->GetDisplay(), m_hColormap, &aColor );
-
- return MAKE_SALCOLOR( aColor.red>>8, aColor.green>>8, aColor.blue>>8 );
-}
-
-inline BOOL SalColormap::GetXPixel( XColor &rColor,
- int r,
- int g,
- int b ) const
-{
- rColor.red = r * 257;
- rColor.green = g * 257;
- rColor.blue = b * 257;
- return XAllocColor( GetXDisplay(), m_hColormap, &rColor );
-}
-
-BOOL SalColormap::GetXPixels( XColor &rColor,
- int r,
- int g,
- int b ) const
-{
- if( !GetXPixel( rColor, r, g, b ) )
- return FALSE;
- if( rColor.pixel & 1 )
- return TRUE;
- return GetXPixel( rColor, r^0xFF, g^0xFF, b^0xFF );
-}
-
-Pixel SalColormap::GetPixel( SalColor nSalColor ) const
-{
- if( SALCOLOR_NONE == nSalColor ) return 0;
- if( SALCOLOR_BLACK == nSalColor ) return m_nBlackPixel;
- if( SALCOLOR_WHITE == nSalColor ) return m_nWhitePixel;
-
- if( m_aVisual.GetClass() == TrueColor )
- return m_aVisual.GetTCPixel( nSalColor );
-
- if( m_aLookupTable.empty() )
- {
- if( m_aPalette.empty()
- && m_hColormap
-#ifdef PSEUDOCOLOR12
- && m_aVisual.GetDepth() <= 12
-#else
- && m_aVisual.GetDepth() <= 8
-#endif
- && m_aVisual.GetClass() == PseudoColor ) // what else ???
- ((SalColormap*)this)->GetPalette();
-
- if( !m_aPalette.empty() )
- for( Pixel i = 0; i < m_nUsed; i++ )
- if( m_aPalette[i] == nSalColor )
- return i;
-
- if( m_hColormap )
- {
- // DirectColor, StaticColor, StaticGray, GrayScale (PseudoColor)
- XColor aColor;
-
- if( GetXPixel( aColor,
- SALCOLOR_RED ( nSalColor ),
- SALCOLOR_GREEN( nSalColor ),
- SALCOLOR_BLUE ( nSalColor ) ) )
- {
- if( !m_aPalette.empty() && !m_aPalette[aColor.pixel] )
- {
- const_cast<SalColormap*>(this)->m_aPalette[aColor.pixel] = nSalColor;
-
- if( !(aColor.pixel & 1) && !m_aPalette[aColor.pixel+1] )
- {
- XColor aInversColor;
-
- SalColor nInversColor = nSalColor ^ 0xFFFFFF;
-
- GetXPixel( aInversColor,
- SALCOLOR_RED ( nInversColor ),
- SALCOLOR_GREEN( nInversColor ),
- SALCOLOR_BLUE ( nInversColor ) );
-
- if( !m_aPalette[aInversColor.pixel] )
- const_cast<SalColormap*>(this)->m_aPalette[aInversColor.pixel] = nInversColor;
-#ifdef DBG_UTIL
- else
- fprintf( stderr, "SalColormap::GetPixel() 0x%06lx=%lu 0x%06lx=%lu\n",
- static_cast< unsigned long >(nSalColor), aColor.pixel,
- static_cast< unsigned long >(nInversColor), aInversColor.pixel);
-#endif
- }
- }
-
- return aColor.pixel;
- }
-
-#ifdef DBG_UTIL
- fprintf( stderr, "SalColormap::GetPixel() !XAllocColor %lx\n",
- static_cast< unsigned long >(nSalColor) );
-#endif
- }
-
- if( m_aPalette.empty() )
- {
-#ifdef DBG_UTIL
- fprintf( stderr, "SalColormap::GetPixel() Palette empty %lx\n",
- static_cast< unsigned long >(nSalColor));
-#endif
- return nSalColor;
- }
-
- ((SalColormap*)this)->GetLookupTable();
- }
-
- // Colormatching ueber Palette
- USHORT r = SALCOLOR_RED ( nSalColor );
- USHORT g = SALCOLOR_GREEN( nSalColor );
- USHORT b = SALCOLOR_BLUE ( nSalColor );
- return m_aLookupTable[ (((r+8)/17) << 8)
- + (((g+8)/17) << 4)
- + ((b+8)/17) ];
-}
-