/* Copyright (C) 2010 Timothy Pearson This library is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #ifdef USE_QT4 // the following is necessary to work around breakage in many versions // of XFree86's Xlib.h still in use // ### which versions? #if defined(_XLIB_H_) // crude hack, but... #error "cannot include before this file" #endif #define XRegisterIMInstantiateCallback qt_XRegisterIMInstantiateCallback #define XUnregisterIMInstantiateCallback qt_XUnregisterIMInstantiateCallback #define XSetIMValues qt_XSetIMValues #include #undef XRegisterIMInstantiateCallback #undef XUnregisterIMInstantiateCallback #undef XSetIMValues #include #include #include #include /*! Returns the window system handle of the paint device for XRender support. Use of this function is not portable. This function will return 0 if XRender support is not compiled into Qt, if the XRender extension is not supported on the X11 display, or if the handle could not be created. */ Qt::HANDLE QPaintDevice::x11RenderHandle() const { // #ifndef TQT_NO_XFTFREETYPE // return rendhd ? XftDrawPicture( (XftDraw *) rendhd ) : 0; // #else return 0; // #endif // TQT_NO_XFTFREETYPE } static GC* app_gc_tmp = 0; // temporary GC static GC* app_gc_tmp_m = 0; // temporary GC (monochrome) static GC create_gc( int scrn, bool monochrome ) { GC gc; Display *appDpy = QX11Info::display(); if ( monochrome ) { Pixmap pm = XCreatePixmap( appDpy, RootWindow( appDpy, scrn ), 8, 8, 1 ); gc = XCreateGC( appDpy, pm, 0, 0 ); XFreePixmap( appDpy, pm ); } else { if ( QPaintDevice::x11AppDefaultVisual( scrn ) ) { gc = XCreateGC( appDpy, RootWindow( appDpy, scrn ), 0, 0 ); } else { Window w; XSetWindowAttributes a; QColormap cmap_background = QColormap::instance( scrn ); QColormap cmap_border = QColormap::instance( scrn ); a.background_pixel = cmap_background.pixel( Qt::black ); a.border_pixel = cmap_border.pixel( Qt::black ); a.colormap = QPaintDevice::x11AppColormap( scrn ); w = XCreateWindow( appDpy, RootWindow( appDpy, scrn ), 0, 0, 100, 100, 0, QPaintDevice::x11AppDepth( scrn ), InputOutput, (Visual*)QPaintDevice::x11AppVisual( scrn ), CWBackPixel|CWBorderPixel|CWColormap, &a ); gc = XCreateGC( appDpy, w, 0, 0 ); XDestroyWindow( appDpy, w ); } } XSetGraphicsExposures( appDpy, gc, False ); return gc; } GC qt_xget_temp_gc( int scrn, bool monochrome ) // get temporary GC { int appScreenCount = QApplication::desktop()->numScreens(); if ( scrn < 0 || scrn >= appScreenCount ) { qDebug("invalid screen (tmp) %d %d", scrn, appScreenCount ); QWidget* bla = 0; bla->setName("hello"); } GC gc; if ( monochrome ) { if ( !app_gc_tmp_m ) // create GC for bitmap memset( (app_gc_tmp_m = new GC[appScreenCount]), 0, appScreenCount * sizeof( GC ) ); if ( !app_gc_tmp_m[scrn] ) app_gc_tmp_m[scrn] = create_gc( scrn, TRUE ); gc = app_gc_tmp_m[scrn]; } else { // create standard GC if ( !app_gc_tmp ) memset( (app_gc_tmp = new GC[appScreenCount]), 0, appScreenCount * sizeof( GC ) ); if ( !app_gc_tmp[scrn] ) app_gc_tmp[scrn] = create_gc( scrn, FALSE ); gc = app_gc_tmp[scrn]; } return gc; } #endif // USE_QT4