You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tqtinterface/qtinterface/tqpaintdevice.cpp

123 lines
4.0 KiB

/*
Copyright (C) 2010 Timothy Pearson <kb9vqf@pearsoncomputing.net>
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 <tqt.h>
#include <tqpaintdevice.h>
#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 <X11/Xlib.h> before this file"
#endif
#define XRegisterIMInstantiateCallback qt_XRegisterIMInstantiateCallback
#define XUnregisterIMInstantiateCallback qt_XUnregisterIMInstantiateCallback
#define XSetIMValues qt_XSetIMValues
#include <X11/Xlib.h>
#undef XRegisterIMInstantiateCallback
#undef XUnregisterIMInstantiateCallback
#undef XSetIMValues
#include <X11/Xutil.h>
#include <X11/Xos.h>
#include <X11/Xatom.h>
#include <Qt/qcolormap.h>
/*!
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 QT_NO_XFTFREETYPE
// return rendhd ? XftDrawPicture( (XftDraw *) rendhd ) : 0;
// #else
return 0;
// #endif // QT_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