MyPixmap::MyPixmap(Pixmap pp, int w, int h) : QPixmap(w, h) { data->uninit = false; #if QT_VERSION >= 300 Screen *screen = XDefaultScreenOfDisplay(dd); int scr = XScreenNumberOfScreen(screen); x11SetScreen(scr); GC gc = qt_xget_temp_gc( scr, FALSE ); #else GC gc = qt_xget_temp_gc( FALSE ); #endif XSetSubwindowMode( dd, gc, IncludeInferiors ); XCopyArea( dd, pp, handle(), gc, 0, 0, w, h, 0, 0 ); XSetSubwindowMode( dd, gc, ClipByChildren ); }
QPixmap KWM::icon(Window w, int width, int height){ QPixmap result; Pixmap p = None; Pixmap p_mask = None; XWMHints *hints = XGetWMHints(qt_xdisplay(), w); if (hints && (hints->flags & IconPixmapHint)){ p = hints->icon_pixmap; } if (hints && (hints->flags & IconMaskHint)){ p_mask = hints->icon_mask; } if (hints) XFree((char*)hints); if (p != None){ Window root; int x, y; unsigned int w = 0; unsigned int h = 0; unsigned int border_w, depth; XGetGeometry(qt_xdisplay(), p, &root, &x, &y, &w, &h, &border_w, &depth); if (w > 0 && h > 0){ QPixmap pm(w, h, depth); XCopyArea(qt_xdisplay(), p, pm.handle(), qt_xget_temp_gc(depth==1), 0, 0, w, h, 0, 0); if (p_mask != None){ QBitmap bm(w, h); XCopyArea(qt_xdisplay(), p_mask, bm.handle(), qt_xget_temp_gc(TRUE), 0, 0, w, h, 0, 0); pm.setMask(bm); } if (width > 0 && height > 0 && (w > (unsigned int)width || h > (unsigned int) height)){ // scale QWMatrix m; m.scale(width/(float)w, height/(float)h); result = pm.xForm(m); } else result = pm; } } else { XWMHints *hints = XGetWMHints(qt_xdisplay(), w); if (hints && (hints->flags & WindowGroupHint) && hints->window_group != None && hints->window_group != w){ XFree((char*)hints); return icon(hints->window_group, width, height); } if (hints) XFree((char*)hints); Window trans = None; if (XGetTransientForHint(qt_xdisplay(), w, &trans)){ if (trans != w) return icon(trans, width, height); } } return result; }
QPixmap KWM::miniIcon(Window w, int width, int height){ static Atom a = 0; if (!a) a = XInternAtom(qt_xdisplay(), "KWM_WIN_ICON", False); QPixmap result; Pixmap p = None; Pixmap p_mask = None; long tmp[2] = {None, None}; if (!getDoubleProperty(w, a, tmp[0], tmp[1])){ XWMHints *hints = XGetWMHints(qt_xdisplay(), w); if (hints && (hints->flags & IconPixmapHint)){ p = hints->icon_pixmap; } if (hints && (hints->flags & IconMaskHint)){ p_mask = hints->icon_mask; } if (hints) XFree((char*)hints); } else { p = (Pixmap) tmp[0]; p_mask = (Pixmap) tmp[1]; } if (p != None){ Window root; int x, y; unsigned int w = 0; unsigned int h = 0; unsigned int border_w, depth; XGetGeometry(qt_xdisplay(), p, &root, &x, &y, &w, &h, &border_w, &depth); if (w > 0 && h > 0){ QPixmap pm(w, h, depth); XCopyArea(qt_xdisplay(), p, pm.handle(), qt_xget_temp_gc(depth==1), 0, 0, w, h, 0, 0); if (p_mask != None){ QBitmap bm(w, h); XCopyArea(qt_xdisplay(), p_mask, bm.handle(), qt_xget_temp_gc(TRUE), 0, 0, w, h, 0, 0); pm.setMask(bm); } if (width > 0 && height > 0 && (w > (unsigned int)width || h > (unsigned int) height)){ // scale QWMatrix m; m.scale(width/(float)w, height/(float)h); result = pm.xForm(m); } else result = pm; } } else { XWMHints *hints = XGetWMHints(qt_xdisplay(), w); if (hints && (hints->flags & WindowGroupHint) && hints->window_group != None && hints->window_group != w){ Window wg = hints->window_group; XFree((char*)hints); return miniIcon(wg, width, height); } if (hints) XFree((char*)hints); Window trans = None; if (XGetTransientForHint(qt_xdisplay(), w, &trans)){ if (trans != w) return miniIcon(trans, width, height); } } return result; }
bool KSharedPixmap::x11Event(XEvent *event) { if (event->type != SelectionNotify) return false; XSelectionEvent *ev = &event->xselection; if (ev->selection != d->selection) return false; if ((ev->target != d->pixmap) || (ev->property == None)) { kdWarning(270) << k_funcinfo << "illegal selection notify event.\n"; d->selection = None; emit done(false); return true; } // Read pixmap handle from ev->property int dummy, format; unsigned long nitems, ldummy; unsigned char *pixmap_id = 0; Atom type; XGetWindowProperty(qt_xdisplay(), winId(), ev->property, 0, 1, false, d->pixmap, &type, &format, &nitems, &ldummy, &pixmap_id); if (nitems != 1 || !pixmap_id) { kdWarning(270) << k_funcinfo << "could not read property, nitems = " << nitems << "\n"; emit done(false); return true; } Window root; unsigned int width, height, udummy; void *drawable_id = (void *) pixmap_id; Drawable pixmap = *(Drawable*) drawable_id; Status status = XGetGeometry(qt_xdisplay(), pixmap, &root, &dummy, &dummy, &width, &height, &udummy, &udummy); if (status == BadDrawable) return false; if (d->rect.isEmpty()) { QPixmap::resize(width, height); XCopyArea(qt_xdisplay(), pixmap, ((KPixmap*)this)->handle(), qt_xget_temp_gc(qt_xscreen(), false), 0, 0, width, height, 0, 0); XFree(pixmap_id); XDeleteProperty(qt_xdisplay(), winId(), ev->property); d->selection = None; emit done(true); return true; } // Do some more processing here: Generate a tile that can be used as a // background tile for the rectangle "rect". //Check for origin off screen QPoint origin(0, 0); if( d->rect.topLeft().x() < 0 || d->rect.topLeft().y() < 0 ) { //Save the offset and relocate the rect corners QPoint tl = d->rect.topLeft(); QPoint br = d->rect.bottomRight(); if( tl.x() < 0 ) { origin.setX( abs( tl.x() ) ); tl.setX( 0 ); } if( tl.y() < 0 ) { origin.setY( abs( tl.y() ) ); tl.setY( 0 ); } QRect adjustedRect( tl, br ); d->rect = adjustedRect; } unsigned w = d->rect.width(), h = d->rect.height(); unsigned tw = QMIN(width, w), th = QMIN(height, h); unsigned xa = d->rect.x() % width, ya = d->rect.y() % height; unsigned t1w = QMIN(width-xa,tw), t1h = QMIN(height-ya,th); QPixmap::resize( tw+origin.x(), th+origin.y() ); XCopyArea(qt_xdisplay(), pixmap, ((KPixmap*)this)->handle(), qt_xget_temp_gc(qt_xscreen(), false), xa, ya, t1w+origin.x(), t1h+origin.y(), origin.x(), origin.y() ); XCopyArea(qt_xdisplay(), pixmap, ((KPixmap*)this)->handle(), qt_xget_temp_gc(qt_xscreen(), false), 0, ya, tw-t1w, t1h, t1w, 0); XCopyArea(qt_xdisplay(), pixmap, ((KPixmap*)this)->handle(), qt_xget_temp_gc(qt_xscreen(), false), xa, 0, t1w, th-t1h, 0, t1h); XCopyArea(qt_xdisplay(), pixmap, ((KPixmap*)this)->handle(), qt_xget_temp_gc(qt_xscreen(), false), 0, 0, tw-t1w, th-t1h, t1w, t1h); XFree(pixmap_id); d->selection = None; XDeleteProperty(qt_xdisplay(), winId(), ev->property); emit done(true); return true; }