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.
123 lines
4.0 KiB
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
|