2034 lines
64 KiB
Diff
2034 lines
64 KiB
Diff
diff -Nru qt-x11-free-3.3.4.orig/include/qdragobject.h qt-x11-free-3.3.4/include/qdragobject.h
|
|
--- qt-x11-free-3.3.4.orig/include/qdragobject.h 2005-03-19 19:57:36.000000000 +0100
|
|
+++ qt-x11-free-3.3.4/include/qdragobject.h 2005-03-19 20:00:47.000000000 +0100
|
|
@@ -245,10 +245,11 @@
|
|
void move( const QPoint & );
|
|
void drop();
|
|
void updatePixmap();
|
|
+ void updatePixmap( const QPoint& cursorPos );
|
|
|
|
private:
|
|
QDragObject * object;
|
|
- void updateMode( ButtonState newstate );
|
|
+ bool updateMode( ButtonState newstate );
|
|
void updateCursor();
|
|
|
|
QWidget * dragSource;
|
|
diff -Nru qt-x11-free-3.3.4.orig/include/qiconview.h qt-x11-free-3.3.4/include/qiconview.h
|
|
--- qt-x11-free-3.3.4.orig/include/qiconview.h 2005-03-19 19:57:36.000000000 +0100
|
|
+++ qt-x11-free-3.3.4/include/qiconview.h 2005-03-19 20:02:20.000000000 +0100
|
|
@@ -496,6 +496,8 @@
|
|
const QPoint &relativeTo,
|
|
const QIconViewItem *item ) const;
|
|
QBitmap mask( QPixmap *pix ) const;
|
|
+ int visibleWidthSB() const;
|
|
+ int visibleHeightSB() const;
|
|
|
|
QIconViewPrivate *d;
|
|
|
|
diff -Nru qt-x11-free-3.3.4.orig/include/qprogressbar.h qt-x11-free-3.3.4/include/qprogressbar.h
|
|
--- qt-x11-free-3.3.4.orig/include/qprogressbar.h 2005-03-19 19:57:36.000000000 +0100
|
|
+++ qt-x11-free-3.3.4/include/qprogressbar.h 2005-03-19 20:01:42.000000000 +0100
|
|
@@ -61,6 +61,7 @@
|
|
public:
|
|
QProgressBar( QWidget* parent=0, const char* name=0, WFlags f=0 );
|
|
QProgressBar( int totalSteps, QWidget* parent=0, const char* name=0, WFlags f=0 );
|
|
+ virtual ~QProgressBar();
|
|
|
|
int totalSteps() const;
|
|
int progress() const;
|
|
@@ -91,6 +92,7 @@
|
|
virtual bool setIndicator( QString & progress_str, int progress,
|
|
int totalSteps );
|
|
void styleChange( QStyle& );
|
|
+ bool requireRepaint( int newProgress ) const;
|
|
|
|
private:
|
|
int total_steps;
|
|
diff -Nru qt-x11-free-3.3.4.orig/include/qvaluelist.h qt-x11-free-3.3.4/include/qvaluelist.h
|
|
--- qt-x11-free-3.3.4.orig/include/qvaluelist.h 2005-03-19 19:57:36.000000000 +0100
|
|
+++ qt-x11-free-3.3.4/include/qvaluelist.h 2005-03-19 20:01:36.000000000 +0100
|
|
@@ -638,13 +638,11 @@
|
|
l.clear();
|
|
Q_UINT32 c;
|
|
s >> c;
|
|
- for( Q_UINT32 i = 0; i < c; ++i )
|
|
+ for( Q_UINT32 i = 0; i < c && !s.atEnd(); ++i )
|
|
{
|
|
T t;
|
|
s >> t;
|
|
l.append( t );
|
|
- if ( s.atEnd() )
|
|
- break;
|
|
}
|
|
return s;
|
|
}
|
|
diff -Nru qt-x11-free-3.3.4.orig/mkspecs/linux-g++/qplatformdefs.h qt-x11-free-3.3.4/mkspecs/linux-g++/qplatformdefs.h
|
|
--- qt-x11-free-3.3.4.orig/mkspecs/linux-g++/qplatformdefs.h 2005-03-19 19:57:36.000000000 +0100
|
|
+++ qt-x11-free-3.3.4/mkspecs/linux-g++/qplatformdefs.h 2005-03-19 20:00:53.000000000 +0100
|
|
@@ -102,5 +102,6 @@
|
|
#define QT_VSNPRINTF ::vsnprintf
|
|
#endif
|
|
|
|
+#define QT_MITSHM
|
|
|
|
#endif // QPLATFORMDEFS_H
|
|
diff -Nru qt-x11-free-3.3.4.orig/src/iconview/qiconview.cpp qt-x11-free-3.3.4/src/iconview/qiconview.cpp
|
|
--- qt-x11-free-3.3.4.orig/src/iconview/qiconview.cpp 2005-03-19 19:57:36.000000000 +0100
|
|
+++ qt-x11-free-3.3.4/src/iconview/qiconview.cpp 2005-03-19 20:02:35.000000000 +0100
|
|
@@ -236,6 +236,7 @@
|
|
QPoint dragStartPos;
|
|
QFontMetrics *fm;
|
|
int minLeftBearing, minRightBearing;
|
|
+ int rubberStartX, rubberStartY;
|
|
|
|
uint mousePressed :1;
|
|
uint cleared :1;
|
|
@@ -255,9 +256,11 @@
|
|
uint firstSizeHint : 1;
|
|
uint showTips :1;
|
|
uint pressedSelected :1;
|
|
+ uint canStartRubber :1;
|
|
uint dragging :1;
|
|
uint drawActiveSelection :1;
|
|
uint inMenuMode :1;
|
|
+ uint controlPressed :1;
|
|
|
|
QIconViewToolTip *toolTip;
|
|
QPixmapCache maskCache;
|
|
@@ -1060,7 +1063,7 @@
|
|
|
|
if ( view ) {
|
|
if ( QRect( view->contentsX(), view->contentsY(),
|
|
- view->visibleWidth(), view->visibleHeight() ).
|
|
+ view->visibleWidthSB(), view->visibleHeightSB() ).
|
|
intersects( oR ) )
|
|
view->repaintContents( oR.x() - 1, oR.y() - 1,
|
|
oR.width() + 2, oR.height() + 2, FALSE );
|
|
@@ -1104,7 +1107,7 @@
|
|
|
|
if ( view ) {
|
|
if ( QRect( view->contentsX(), view->contentsY(),
|
|
- view->visibleWidth(), view->visibleHeight() ).
|
|
+ view->visibleWidthSB(), view->visibleHeightSB() ).
|
|
intersects( oR ) )
|
|
view->repaintContents( oR.x() - 1, oR.y() - 1,
|
|
oR.width() + 2, oR.height() + 2, FALSE );
|
|
@@ -1140,7 +1143,7 @@
|
|
|
|
if ( view ) {
|
|
if ( QRect( view->contentsX(), view->contentsY(),
|
|
- view->visibleWidth(), view->visibleHeight() ).
|
|
+ view->visibleWidthSB(), view->visibleHeightSB() ).
|
|
intersects( oR ) )
|
|
view->repaintContents( oR.x() - 1, oR.y() - 1,
|
|
oR.width() + 2, oR.height() + 2, FALSE );
|
|
@@ -1200,7 +1203,7 @@
|
|
|
|
if ( view ) {
|
|
if ( QRect( view->contentsX(), view->contentsY(),
|
|
- view->visibleWidth(), view->visibleHeight() ).
|
|
+ view->visibleWidthSB(), view->visibleHeightSB() ).
|
|
intersects( oR ) )
|
|
view->repaintContents( oR.x() - 1, oR.y() - 1,
|
|
oR.width() + 2, oR.height() + 2, FALSE );
|
|
@@ -2729,10 +2732,12 @@
|
|
d->lastItem = 0;
|
|
d->count = 0;
|
|
d->mousePressed = FALSE;
|
|
+ d->controlPressed = FALSE;
|
|
d->selectionMode = Single;
|
|
d->currentItem = 0;
|
|
d->highlightedItem = 0;
|
|
d->rubber = 0;
|
|
+ d->canStartRubber = FALSE;
|
|
d->scrollTimer = 0;
|
|
d->startDragItem = 0;
|
|
d->tmpCurrentItem = 0;
|
|
@@ -3294,9 +3299,18 @@
|
|
alreadyIntersected = TRUE;
|
|
QIconViewItem *item = c->items.first();
|
|
for ( ; item; item = c->items.next() ) {
|
|
- if ( d->selectedItems.find( item ) )
|
|
- continue;
|
|
- if ( !item->intersects( nr ) ) {
|
|
+ if ( d->selectedItems.find( item ) ) {
|
|
+ if ( item->intersects( nr ) && item->isSelected() && d->controlPressed ) {
|
|
+ item->setSelected( FALSE );
|
|
+ changed = TRUE;
|
|
+ rr = rr.unite( item->rect() );
|
|
+ } else if ( !item->intersects( nr ) && !item->isSelected() && d->controlPressed ) {
|
|
+ item->setSelected( TRUE, TRUE );
|
|
+ changed = TRUE;
|
|
+ rr = rr.unite( item->rect() );
|
|
+ } else
|
|
+ continue;
|
|
+ } else if ( !item->intersects( nr ) ) {
|
|
if ( item->isSelected() ) {
|
|
item->setSelected( FALSE );
|
|
changed = TRUE;
|
|
@@ -4487,34 +4501,25 @@
|
|
}
|
|
}
|
|
} else if ( ( d->selectionMode != Single || e->button() == RightButton )
|
|
- && !( e->state() & ControlButton ) )
|
|
+ && !( e->state() & ControlButton ) && !( e->state() & ShiftButton ) )
|
|
selectAll( FALSE );
|
|
|
|
setCurrentItem( item );
|
|
|
|
+ d->canStartRubber = FALSE;
|
|
if ( e->button() == LeftButton ) {
|
|
- if ( !item && ( d->selectionMode == Multi ||
|
|
- d->selectionMode == Extended ) ) {
|
|
- d->tmpCurrentItem = d->currentItem;
|
|
- d->currentItem = 0;
|
|
- repaintItem( d->tmpCurrentItem );
|
|
- if ( d->rubber )
|
|
- delete d->rubber;
|
|
- d->rubber = 0;
|
|
- d->rubber = new QRect( e->x(), e->y(), 0, 0 );
|
|
- d->selectedItems.clear();
|
|
- if ( ( e->state() & ControlButton ) == ControlButton ) {
|
|
- for ( QIconViewItem *i = firstItem(); i; i = i->nextItem() )
|
|
- if ( i->isSelected() )
|
|
- d->selectedItems.insert( i, i );
|
|
- }
|
|
+ if ( !item && ( d->selectionMode == Multi || d->selectionMode == Extended ) )
|
|
+ {
|
|
+ d->canStartRubber = TRUE;
|
|
+ d->rubberStartX = e->x();
|
|
+ d->rubberStartY = e->y();
|
|
}
|
|
-
|
|
d->mousePressed = TRUE;
|
|
+ d->controlPressed = ( ( e->state() & ControlButton ) == ControlButton );
|
|
}
|
|
|
|
emit_signals:
|
|
- if ( !d->rubber ) {
|
|
+ if ( !d->canStartRubber ) {
|
|
emit mouseButtonPressed( e->button(), item, e->globalPos() );
|
|
emit pressed( item );
|
|
emit pressed( item, e->globalPos() );
|
|
@@ -4558,6 +4563,7 @@
|
|
d->mousePressed = FALSE;
|
|
d->startDragItem = 0;
|
|
|
|
+ d->canStartRubber = FALSE;
|
|
if ( d->rubber ) {
|
|
QPainter p;
|
|
p.begin( viewport() );
|
|
@@ -4647,7 +4653,22 @@
|
|
if ( d->tmpCurrentItem )
|
|
repaintItem( d->tmpCurrentItem );
|
|
}
|
|
- } else if ( d->mousePressed && !d->currentItem && d->rubber ) {
|
|
+ } else if ( d->mousePressed && ((!d->currentItem && d->rubber) || d->canStartRubber) ) {
|
|
+ if ( d->canStartRubber ) {
|
|
+ d->canStartRubber = FALSE;
|
|
+ d->tmpCurrentItem = d->currentItem;
|
|
+ d->currentItem = 0;
|
|
+ repaintItem( d->tmpCurrentItem );
|
|
+ delete d->rubber;
|
|
+ d->rubber = new QRect( d->rubberStartX, d->rubberStartY, 0, 0 );
|
|
+ d->selectedItems.clear();
|
|
+ if ( ( e->state() & ControlButton ) == ControlButton ||
|
|
+ ( e->state() & ShiftButton ) == ShiftButton ) {
|
|
+ for ( QIconViewItem *i = firstItem(); i; i = i->nextItem() )
|
|
+ if ( i->isSelected() )
|
|
+ d->selectedItems.insert( i, i );
|
|
+ }
|
|
+ }
|
|
doAutoScroll();
|
|
}
|
|
}
|
|
@@ -5224,11 +5245,11 @@
|
|
d->findContainers( dir, relativeTo, searchRect);
|
|
|
|
cList->first();
|
|
- while ( cList->current() && !centerMatch ) {
|
|
+ while ( cList->current() ) {
|
|
QPtrList<QIconViewItem> &list = (cList->current())->items;
|
|
for ( item = list.first(); item; item = list.next() ) {
|
|
if ( neighbourItem( dir, relativeTo, item ) &&
|
|
- searchRect.contains( item->rect().center() ) &&
|
|
+ searchRect.intersects( item->rect() ) &&
|
|
item != currentItem() ) {
|
|
int ml = (relativeTo - item->rect().center()).manhattanLength();
|
|
if ( centerMatch ) {
|
|
@@ -5451,8 +5472,8 @@
|
|
}
|
|
item->dirty = FALSE;
|
|
} else {
|
|
- QRegion r( QRect( 0, 0, QMAX( contentsWidth(), visibleWidth() ),
|
|
- QMAX( contentsHeight(), visibleHeight() ) ) );
|
|
+ QRegion r( QRect( 0, 0, QMAX( contentsWidth(), visibleWidthSB() ),
|
|
+ QMAX( contentsHeight(), visibleHeightSB() ) ) );
|
|
|
|
QIconViewItem *i = d->firstItem;
|
|
int y = -1;
|
|
@@ -5710,7 +5731,7 @@
|
|
QIconViewItem *item = begin;
|
|
for (;;) {
|
|
x += d->spacing + item->width();
|
|
- if ( x > visibleWidth() && item != begin ) {
|
|
+ if ( x > visibleWidthSB() && item != begin ) {
|
|
item = item->prev;
|
|
break;
|
|
}
|
|
@@ -5735,7 +5756,7 @@
|
|
int x;
|
|
if ( item == begin ) {
|
|
if ( reverse )
|
|
- x = visibleWidth() - d->spacing - item->width();
|
|
+ x = visibleWidthSB() - d->spacing - item->width();
|
|
else
|
|
x = d->spacing;
|
|
} else {
|
|
@@ -5771,7 +5792,7 @@
|
|
i += r;
|
|
x = i * d->rastX + sp * d->spacing;
|
|
}
|
|
- if ( x > visibleWidth() && item != begin ) {
|
|
+ if ( x > visibleWidthSB() && item != begin ) {
|
|
item = item->prev;
|
|
break;
|
|
}
|
|
@@ -5834,7 +5855,7 @@
|
|
QIconViewItem *item = begin;
|
|
for (;;) {
|
|
y += d->spacing + item->height();
|
|
- if ( y > visibleHeight() && item != begin ) {
|
|
+ if ( y > visibleHeightSB() && item != begin ) {
|
|
item = item->prev;
|
|
break;
|
|
}
|
|
@@ -6148,7 +6169,9 @@
|
|
item->d->container2 = 0;
|
|
c->items.append( item );
|
|
item = item->next;
|
|
- } else if ( c->rect.intersects( item->rect() ) ) {
|
|
+ } else if ( c->rect.intersects( item->rect() ) && (
|
|
+ ( d->arrangement == LeftToRight && item->y() >= c->rect.y() ) ||
|
|
+ ( d->arrangement == TopToBottom && item->x() >= c->rect.x() ) ) ) {
|
|
item->d->container1 = c;
|
|
c->items.append( item );
|
|
c = c->n;
|
|
@@ -6381,4 +6404,24 @@
|
|
#endif
|
|
}
|
|
|
|
+int QIconView::visibleWidthSB() const
|
|
+{
|
|
+ if ( vScrollBarMode() != Auto )
|
|
+ return visibleWidth();
|
|
+
|
|
+ int offset = verticalScrollBar()->isVisible() ? 0
|
|
+ : style().pixelMetric( QStyle::PM_ScrollBarExtent, verticalScrollBar() );
|
|
+ return QMAX( 0, visibleWidth() - offset );
|
|
+}
|
|
+
|
|
+int QIconView::visibleHeightSB() const
|
|
+{
|
|
+ if ( hScrollBarMode() != Auto )
|
|
+ return visibleHeight();
|
|
+
|
|
+ int offset = horizontalScrollBar()->isVisible() ? 0
|
|
+ : style().pixelMetric( QStyle::PM_ScrollBarExtent, horizontalScrollBar() );
|
|
+ return QMAX( 0, visibleHeight() - offset );
|
|
+}
|
|
+
|
|
#endif // QT_NO_ICONVIEW
|
|
diff -Nru qt-x11-free-3.3.4.orig/src/iconview/qiconview.h qt-x11-free-3.3.4/src/iconview/qiconview.h
|
|
--- qt-x11-free-3.3.4.orig/src/iconview/qiconview.h 2005-03-19 19:57:36.000000000 +0100
|
|
+++ qt-x11-free-3.3.4/src/iconview/qiconview.h 2005-03-19 20:02:20.000000000 +0100
|
|
@@ -496,6 +496,8 @@
|
|
const QPoint &relativeTo,
|
|
const QIconViewItem *item ) const;
|
|
QBitmap mask( QPixmap *pix ) const;
|
|
+ int visibleWidthSB() const;
|
|
+ int visibleHeightSB() const;
|
|
|
|
QIconViewPrivate *d;
|
|
|
|
diff -Nru qt-x11-free-3.3.4.orig/src/kernel/qapplication_x11.cpp qt-x11-free-3.3.4/src/kernel/qapplication_x11.cpp
|
|
--- qt-x11-free-3.3.4.orig/src/kernel/qapplication_x11.cpp 2005-03-19 19:57:36.000000000 +0100
|
|
+++ qt-x11-free-3.3.4/src/kernel/qapplication_x11.cpp 2005-03-19 20:02:50.000000000 +0100
|
|
@@ -3405,10 +3405,23 @@
|
|
|
|
// update the size for desktop widget
|
|
int scr = XRRRootToScreen( appDpy, event->xany.window );
|
|
+
|
|
+ // Determine if we're at right-angles & thus DisplayWidth/DisplayHeight should be switched
|
|
+ XRRScreenConfiguration* xrrconfig;
|
|
+ xrrconfig = XRRGetScreenInfo( appDpy, event->xany.window );
|
|
+ Rotation rotation;
|
|
+ XRRConfigCurrentConfiguration( xrrconfig, &rotation );
|
|
+ XRRFreeScreenConfigInfo( xrrconfig );
|
|
+
|
|
QWidget *w = desktop()->screen( scr );
|
|
QSize oldSize( w->size() );
|
|
- w->crect.setWidth( DisplayWidth( appDpy, scr ) );
|
|
- w->crect.setHeight( DisplayHeight( appDpy, scr ) );
|
|
+ if (rotation & (RR_Rotate_90 | RR_Rotate_270)) {
|
|
+ w->crect.setWidth( DisplayHeight( appDpy, scr ) );
|
|
+ w->crect.setHeight( DisplayWidth( appDpy, scr ) );
|
|
+ } else {
|
|
+ w->crect.setWidth( DisplayWidth( appDpy, scr ) );
|
|
+ w->crect.setHeight( DisplayHeight( appDpy, scr ) );
|
|
+ }
|
|
if ( w->size() != oldSize ) {
|
|
QResizeEvent e( w->size(), oldSize );
|
|
QApplication::sendEvent( w, &e );
|
|
@@ -3967,7 +3980,7 @@
|
|
// Keyboard event translation
|
|
//
|
|
|
|
-static int translateButtonState( int s )
|
|
+int qt_x11_translateButtonState( int s )
|
|
{
|
|
int bst = 0;
|
|
if ( s & Button1Mask )
|
|
@@ -4033,7 +4046,7 @@
|
|
pos.ry() = lastMotion.y;
|
|
globalPos.rx() = lastMotion.x_root;
|
|
globalPos.ry() = lastMotion.y_root;
|
|
- state = translateButtonState( lastMotion.state );
|
|
+ state = qt_x11_translateButtonState( lastMotion.state );
|
|
if ( qt_button_down && (state & (LeftButton |
|
|
MidButton |
|
|
RightButton ) ) == 0 )
|
|
@@ -4057,7 +4070,7 @@
|
|
pos.ry() = xevent->xcrossing.y;
|
|
globalPos.rx() = xevent->xcrossing.x_root;
|
|
globalPos.ry() = xevent->xcrossing.y_root;
|
|
- state = translateButtonState( xevent->xcrossing.state );
|
|
+ state = qt_x11_translateButtonState( xevent->xcrossing.state );
|
|
if ( qt_button_down && (state & (LeftButton |
|
|
MidButton |
|
|
RightButton ) ) == 0 )
|
|
@@ -4069,7 +4082,7 @@
|
|
pos.ry() = event->xbutton.y;
|
|
globalPos.rx() = event->xbutton.x_root;
|
|
globalPos.ry() = event->xbutton.y_root;
|
|
- state = translateButtonState( event->xbutton.state );
|
|
+ state = qt_x11_translateButtonState( event->xbutton.state );
|
|
switch ( event->xbutton.button ) {
|
|
case Button1: button = LeftButton; break;
|
|
case Button2: button = MidButton; break;
|
|
@@ -5013,7 +5026,7 @@
|
|
XKeyEvent xkeyevent = event->xkey;
|
|
|
|
// save the modifier state, we will use the keystate uint later by passing
|
|
- // it to translateButtonState
|
|
+ // it to qt_x11_translateButtonState
|
|
uint keystate = event->xkey.state;
|
|
// remove the modifiers where mode_switch exists... HPUX machines seem
|
|
// to have alt *AND* mode_switch both in Mod1Mask, which causes
|
|
@@ -5127,7 +5140,7 @@
|
|
}
|
|
#endif // !QT_NO_XIM
|
|
|
|
- state = translateButtonState( keystate );
|
|
+ state = qt_x11_translateButtonState( keystate );
|
|
|
|
static int directionKeyEvent = 0;
|
|
if ( qt_use_rtl_extensions && type == QEvent::KeyRelease ) {
|
|
@@ -5289,8 +5302,10 @@
|
|
qt_auto_repeat_data *d = (qt_auto_repeat_data *) arg;
|
|
if (d->error ||
|
|
event->xkey.window != d->window ||
|
|
- event->xkey.keycode != d->keycode)
|
|
+ event->xkey.keycode != d->keycode) {
|
|
+ d->error = TRUE;
|
|
return FALSE;
|
|
+ }
|
|
|
|
if (event->type == XKeyPress) {
|
|
d->error = (! d->release || event->xkey.time - d->timestamp > 10);
|
|
diff -Nru qt-x11-free-3.3.4.orig/src/kernel/qclipboard_x11.cpp qt-x11-free-3.3.4/src/kernel/qclipboard_x11.cpp
|
|
--- qt-x11-free-3.3.4.orig/src/kernel/qclipboard_x11.cpp 2005-03-19 19:57:36.000000000 +0100
|
|
+++ qt-x11-free-3.3.4/src/kernel/qclipboard_x11.cpp 2005-03-19 20:02:30.000000000 +0100
|
|
@@ -109,6 +109,7 @@
|
|
static bool pending_clipboard_changed = FALSE;
|
|
static bool pending_selection_changed = FALSE;
|
|
|
|
+Q_EXPORT bool qt_qclipboard_bailout_hack = false;
|
|
|
|
// event capture mechanism for qt_xclb_wait_for_event
|
|
static bool waiting_for_data = FALSE;
|
|
@@ -453,6 +454,15 @@
|
|
return 0;
|
|
}
|
|
|
|
+static bool selection_request_pending = false;
|
|
+
|
|
+static Bool check_selection_request_pending( Display*, XEvent* e, XPointer )
|
|
+ {
|
|
+ if( e->type == SelectionRequest && e->xselectionrequest.owner == owner->winId())
|
|
+ selection_request_pending = true;
|
|
+ return False;
|
|
+ }
|
|
+
|
|
bool qt_xclb_wait_for_event( Display *dpy, Window win, int type, XEvent *event,
|
|
int timeout )
|
|
{
|
|
@@ -504,6 +514,14 @@
|
|
do {
|
|
if ( XCheckTypedWindowEvent(dpy,win,type,event) )
|
|
return TRUE;
|
|
+ if( qt_qclipboard_bailout_hack ) {
|
|
+ XEvent dummy;
|
|
+ selection_request_pending = false;
|
|
+ if ( owner != NULL )
|
|
+ XCheckIfEvent(dpy,&dummy,check_selection_request_pending,NULL);
|
|
+ if( selection_request_pending )
|
|
+ return TRUE;
|
|
+ }
|
|
|
|
now = QTime::currentTime();
|
|
if ( started > now ) // crossed midnight
|
|
diff -Nru qt-x11-free-3.3.4.orig/src/kernel/qdesktopwidget_x11.cpp qt-x11-free-3.3.4/src/kernel/qdesktopwidget_x11.cpp
|
|
--- qt-x11-free-3.3.4.orig/src/kernel/qdesktopwidget_x11.cpp 2005-03-19 19:57:36.000000000 +0100
|
|
+++ qt-x11-free-3.3.4/src/kernel/qdesktopwidget_x11.cpp 2005-03-19 20:01:30.000000000 +0100
|
|
@@ -44,6 +44,9 @@
|
|
// defined in qapplication_x11.cpp
|
|
extern Atom qt_net_workarea;
|
|
extern bool qt_net_supports(Atom atom);
|
|
+#ifndef QT_NO_XRANDR
|
|
+extern bool qt_use_xrandr;
|
|
+#endif
|
|
|
|
// function to update the workarea of the screen
|
|
static bool qt_desktopwidget_workarea_dirty = TRUE;
|
|
@@ -154,6 +157,22 @@
|
|
y = 0;
|
|
w = WidthOfScreen(ScreenOfDisplay(QPaintDevice::x11AppDisplay(), i));
|
|
h = HeightOfScreen(ScreenOfDisplay(QPaintDevice::x11AppDisplay(), i));
|
|
+
|
|
+#ifndef QT_NO_XRANDR
|
|
+ if (qt_use_xrandr) {
|
|
+ XRRScreenConfiguration* xrrconfig;
|
|
+ xrrconfig = XRRGetScreenInfo(QPaintDevice::x11AppDisplay(), QPaintDevice::x11AppRootWindow( i ));
|
|
+ Rotation rotation;
|
|
+ XRRConfigCurrentConfiguration(xrrconfig, &rotation);
|
|
+ XRRFreeScreenConfigInfo(xrrconfig);
|
|
+
|
|
+ if (rotation & (RR_Rotate_90 | RR_Rotate_270)) {
|
|
+ int tmp = h;
|
|
+ h = w;
|
|
+ w = tmp;
|
|
+ }
|
|
+ }
|
|
+#endif
|
|
}
|
|
|
|
rects[i].setRect(x, y, w, h);
|
|
diff -Nru qt-x11-free-3.3.4.orig/src/kernel/qdnd_x11.cpp qt-x11-free-3.3.4/src/kernel/qdnd_x11.cpp
|
|
--- qt-x11-free-3.3.4.orig/src/kernel/qdnd_x11.cpp 2005-03-19 19:57:36.000000000 +0100
|
|
+++ qt-x11-free-3.3.4/src/kernel/qdnd_x11.cpp 2005-03-19 20:01:47.000000000 +0100
|
|
@@ -49,13 +49,15 @@
|
|
#include "qdragobject.h"
|
|
#include "qobjectlist.h"
|
|
#include "qcursor.h"
|
|
+#include "qbitmap.h"
|
|
+#include "qpainter.h"
|
|
|
|
#include "qt_x11_p.h"
|
|
|
|
// conflict resolution
|
|
|
|
-// unused, may be used again later: const int XKeyPress = KeyPress;
|
|
-// unused, may be used again later: const int XKeyRelease = KeyRelease;
|
|
+const int XKeyPress = KeyPress;
|
|
+const int XKeyRelease = KeyRelease;
|
|
#undef KeyPress
|
|
#undef KeyRelease
|
|
|
|
@@ -79,6 +81,7 @@
|
|
extern Window qt_x11_findClientWindow( Window, Atom, bool );
|
|
extern Atom qt_wm_state;
|
|
extern Time qt_x_time;
|
|
+extern Time qt_x_user_time;
|
|
|
|
// this stuff is copied from qclb_x11.cpp
|
|
|
|
@@ -112,6 +115,8 @@
|
|
Atom qt_xdnd_type_list;
|
|
const int qt_xdnd_version = 4;
|
|
|
|
+extern int qt_x11_translateButtonState( int s );
|
|
+
|
|
// Actions
|
|
//
|
|
// The Xdnd spec allows for user-defined actions. This could be implemented
|
|
@@ -196,6 +201,8 @@
|
|
static int qt_xdnd_current_screen = -1;
|
|
// state of dragging... true if dragging, false if not
|
|
bool qt_xdnd_dragging = FALSE;
|
|
+// need to check state of keyboard modifiers
|
|
+static bool need_modifiers_check = FALSE;
|
|
|
|
// dict of payload data, sorted by type atom
|
|
static QIntDict<QByteArray> * qt_xdnd_target_data = 0;
|
|
@@ -251,20 +258,47 @@
|
|
public:
|
|
QShapedPixmapWidget(int screen = -1) :
|
|
QWidget(QApplication::desktop()->screen( screen ),
|
|
- 0, WStyle_Customize | WStyle_Tool | WStyle_NoBorder | WX11BypassWM )
|
|
+ 0, WStyle_Customize | WStyle_Tool | WStyle_NoBorder | WX11BypassWM ), oldpmser( 0 ), oldbmser( 0 )
|
|
{
|
|
}
|
|
|
|
- void setPixmap(QPixmap pm)
|
|
+ void setPixmap(QPixmap pm, QPoint hot)
|
|
{
|
|
- if ( pm.mask() ) {
|
|
+ int bmser = pm.mask() ? pm.mask()->serialNumber() : 0;
|
|
+ if( oldpmser == pm.serialNumber() && oldbmser == bmser
|
|
+ && oldhot == hot )
|
|
+ return;
|
|
+ oldpmser = pm.serialNumber();
|
|
+ oldbmser = bmser;
|
|
+ oldhot = hot;
|
|
+ bool hotspot_in = !(hot.x() < 0 || hot.y() < 0 || hot.x() >= pm.width() || hot.y() >= pm.height());
|
|
+// if the pixmap has hotspot in its area, make a "hole" in it at that position
|
|
+// this will allow XTranslateCoordinates() to find directly the window below the cursor instead
|
|
+// of finding this pixmap, and therefore there won't be needed any (slow) search for the window
|
|
+// using findRealWindow()
|
|
+ if( hotspot_in ) {
|
|
+ QBitmap mask = pm.mask() ? *pm.mask() : QBitmap( pm.width(), pm.height());
|
|
+ if( !pm.mask())
|
|
+ mask.fill( Qt::color1 );
|
|
+ QPainter p( &mask );
|
|
+ p.setPen( Qt::color0 );
|
|
+ p.drawPoint( hot.x(), hot.y());
|
|
+ p.end();
|
|
+ pm.setMask( mask );
|
|
+ setMask( mask );
|
|
+ } else if ( pm.mask() ) {
|
|
setMask( *pm.mask() );
|
|
} else {
|
|
clearMask();
|
|
}
|
|
resize(pm.width(),pm.height());
|
|
setErasePixmap(pm);
|
|
+ erase();
|
|
}
|
|
+private:
|
|
+ int oldpmser;
|
|
+ int oldbmser;
|
|
+ QPoint oldhot;
|
|
};
|
|
|
|
static QShapedPixmapWidget * qt_xdnd_deco = 0;
|
|
@@ -801,6 +835,9 @@
|
|
// l[0], qt_xdnd_dragsource_xid );
|
|
return;
|
|
}
|
|
+
|
|
+ if( l[2] != 0 )
|
|
+ qt_x_user_time = l[2];
|
|
if ( qt_xdnd_source_object )
|
|
qt_xdnd_source_object->setTarget( qt_xdnd_current_widget );
|
|
|
|
@@ -851,8 +888,59 @@
|
|
|
|
void QDragManager::timerEvent( QTimerEvent* e )
|
|
{
|
|
- if ( e->timerId() == heartbeat && qt_xdnd_source_sameanswer.isNull() )
|
|
- move( QCursor::pos() );
|
|
+ if ( e->timerId() == heartbeat ) {
|
|
+ if( need_modifiers_check ) {
|
|
+ Window root, child;
|
|
+ int root_x, root_y, win_x, win_y;
|
|
+ unsigned int mask;
|
|
+ XQueryPointer( qt_xdisplay(), qt_xrootwin( qt_xdnd_current_screen ),
|
|
+ &root, &child, &root_x, &root_y, &win_x, &win_y, &mask );
|
|
+ if( updateMode( (ButtonState)qt_x11_translateButtonState( mask )))
|
|
+ qt_xdnd_source_sameanswer = QRect(); // force move
|
|
+ }
|
|
+ need_modifiers_check = TRUE;
|
|
+ if( qt_xdnd_source_sameanswer.isNull() )
|
|
+ move( QCursor::pos() );
|
|
+ }
|
|
+}
|
|
+
|
|
+static bool qt_xdnd_was_move = false;
|
|
+static bool qt_xdnd_found = false;
|
|
+// check whole incoming X queue for move events
|
|
+// checking whole queue is done by always returning False in the predicate
|
|
+// if there's another move event in the queue, and there's not a mouse button
|
|
+// or keyboard or ClientMessage event before it, the current move event
|
|
+// may be safely discarded
|
|
+// this helps avoiding being overloaded by being flooded from many events
|
|
+// from the XServer
|
|
+static
|
|
+Bool qt_xdnd_predicate( Display*, XEvent* ev, XPointer )
|
|
+{
|
|
+ if( qt_xdnd_found )
|
|
+ return False;
|
|
+ if( ev->type == MotionNotify )
|
|
+ {
|
|
+ qt_xdnd_was_move = true;
|
|
+ qt_xdnd_found = true;
|
|
+ }
|
|
+ if( ev->type == ButtonPress || ev->type == ButtonRelease
|
|
+ || ev->type == XKeyPress || ev->type == XKeyRelease
|
|
+ || ev->type == ClientMessage )
|
|
+ {
|
|
+ qt_xdnd_was_move = false;
|
|
+ qt_xdnd_found = true;
|
|
+ }
|
|
+ return False;
|
|
+}
|
|
+
|
|
+static
|
|
+bool qt_xdnd_another_movement()
|
|
+{
|
|
+ qt_xdnd_was_move = false;
|
|
+ qt_xdnd_found = false;
|
|
+ XEvent dummy;
|
|
+ XCheckIfEvent( qt_xdisplay(), &dummy, qt_xdnd_predicate, NULL );
|
|
+ return qt_xdnd_was_move;
|
|
}
|
|
|
|
bool QDragManager::eventFilter( QObject * o, QEvent * e)
|
|
@@ -877,8 +965,11 @@
|
|
|
|
if ( e->type() == QEvent::MouseMove ) {
|
|
QMouseEvent* me = (QMouseEvent *)e;
|
|
- updateMode(me->stateAfter());
|
|
- move( me->globalPos() );
|
|
+ if( !qt_xdnd_another_movement()) {
|
|
+ updateMode(me->stateAfter());
|
|
+ move( me->globalPos() );
|
|
+ }
|
|
+ need_modifiers_check = FALSE;
|
|
return TRUE;
|
|
} else if ( e->type() == QEvent::MouseButtonRelease ) {
|
|
qApp->removeEventFilter( this );
|
|
@@ -917,9 +1008,11 @@
|
|
beingCancelled = FALSE;
|
|
qApp->exit_loop();
|
|
} else {
|
|
- updateMode(ke->stateAfter());
|
|
- qt_xdnd_source_sameanswer = QRect(); // force move
|
|
- move( QCursor::pos() );
|
|
+ if( updateMode(ke->stateAfter())) {
|
|
+ qt_xdnd_source_sameanswer = QRect(); // force move
|
|
+ move( QCursor::pos() );
|
|
+ }
|
|
+ need_modifiers_check = FALSE;
|
|
}
|
|
return TRUE; // Eat all key events
|
|
}
|
|
@@ -946,10 +1039,10 @@
|
|
|
|
|
|
static Qt::ButtonState oldstate;
|
|
-void QDragManager::updateMode( ButtonState newstate )
|
|
+bool QDragManager::updateMode( ButtonState newstate )
|
|
{
|
|
if ( newstate == oldstate )
|
|
- return;
|
|
+ return false;
|
|
const int both = ShiftButton|ControlButton;
|
|
if ( (newstate & both) == both ) {
|
|
global_requested_action = QDropEvent::Link;
|
|
@@ -973,6 +1066,7 @@
|
|
}
|
|
}
|
|
oldstate = newstate;
|
|
+ return true;
|
|
}
|
|
|
|
|
|
@@ -1109,7 +1203,7 @@
|
|
qt_xdnd_deco->grabMouse();
|
|
}
|
|
}
|
|
- updatePixmap();
|
|
+ updatePixmap( globalPos );
|
|
|
|
if ( qt_xdnd_source_sameanswer.contains( globalPos ) &&
|
|
qt_xdnd_source_sameanswer.isValid() ) {
|
|
@@ -1281,9 +1375,9 @@
|
|
drop.format = 32;
|
|
drop.message_type = qt_xdnd_drop;
|
|
drop.data.l[0] = object->source()->winId();
|
|
- drop.data.l[1] = 1 << 24; // flags
|
|
- drop.data.l[2] = 0; // ###
|
|
- drop.data.l[3] = qt_x_time;
|
|
+ drop.data.l[1] = 0; // flags
|
|
+ drop.data.l[2] = qt_x_time;
|
|
+ drop.data.l[3] = 0;
|
|
drop.data.l[4] = 0;
|
|
|
|
QWidget * w = QWidget::find( qt_xdnd_current_proxy_target );
|
|
@@ -1637,6 +1731,7 @@
|
|
qt_xdnd_source_sameanswer = QRect();
|
|
move(QCursor::pos());
|
|
heartbeat = startTimer(200);
|
|
+ need_modifiers_check = FALSE;
|
|
|
|
#ifndef QT_NO_CURSOR
|
|
qApp->setOverrideCursor( arrowCursor );
|
|
@@ -1670,7 +1765,7 @@
|
|
// qt_xdnd_source_object persists until we get an xdnd_finish message
|
|
}
|
|
|
|
-void QDragManager::updatePixmap()
|
|
+void QDragManager::updatePixmap( const QPoint& cursorPos )
|
|
{
|
|
if ( qt_xdnd_deco ) {
|
|
QPixmap pm;
|
|
@@ -1685,9 +1780,8 @@
|
|
defaultPm = new QPixmap(default_pm);
|
|
pm = *defaultPm;
|
|
}
|
|
- qt_xdnd_deco->setPixmap(pm);
|
|
- qt_xdnd_deco->move(QCursor::pos()-pm_hot);
|
|
- qt_xdnd_deco->repaint(FALSE);
|
|
+ qt_xdnd_deco->setPixmap(pm, pm_hot);
|
|
+ qt_xdnd_deco->move(cursorPos-pm_hot);
|
|
//if ( willDrop ) {
|
|
qt_xdnd_deco->show();
|
|
//} else {
|
|
@@ -1696,4 +1790,9 @@
|
|
}
|
|
}
|
|
|
|
+void QDragManager::updatePixmap()
|
|
+{
|
|
+ updatePixmap( QCursor::pos());
|
|
+}
|
|
+
|
|
#endif // QT_NO_DRAGANDDROP
|
|
diff -Nru qt-x11-free-3.3.4.orig/src/kernel/qdragobject.cpp qt-x11-free-3.3.4/src/kernel/qdragobject.cpp
|
|
--- qt-x11-free-3.3.4.orig/src/kernel/qdragobject.cpp 2005-03-19 19:57:36.000000000 +0100
|
|
+++ qt-x11-free-3.3.4/src/kernel/qdragobject.cpp 2005-03-19 20:01:52.000000000 +0100
|
|
@@ -891,6 +891,16 @@
|
|
if(!e)
|
|
return FALSE;
|
|
|
|
+ // when subtype is not specified, try text/plain first, otherwise this may read
|
|
+ // things like text/x-moz-url even though better targets are available
|
|
+ if( subtype.isNull()) {
|
|
+ QCString subtmp = "plain";
|
|
+ if( decode( e, str, subtmp )) {
|
|
+ subtype = subtmp;
|
|
+ return true;
|
|
+ }
|
|
+ }
|
|
+
|
|
if ( e->cacheType == QMimeSource::Text ) {
|
|
str = *e->cache.txt.str;
|
|
subtype = *e->cache.txt.subtype;
|
|
diff -Nru qt-x11-free-3.3.4.orig/src/kernel/qdragobject.h qt-x11-free-3.3.4/src/kernel/qdragobject.h
|
|
--- qt-x11-free-3.3.4.orig/src/kernel/qdragobject.h 2005-03-19 19:57:36.000000000 +0100
|
|
+++ qt-x11-free-3.3.4/src/kernel/qdragobject.h 2005-03-19 20:00:47.000000000 +0100
|
|
@@ -245,10 +245,11 @@
|
|
void move( const QPoint & );
|
|
void drop();
|
|
void updatePixmap();
|
|
+ void updatePixmap( const QPoint& cursorPos );
|
|
|
|
private:
|
|
QDragObject * object;
|
|
- void updateMode( ButtonState newstate );
|
|
+ bool updateMode( ButtonState newstate );
|
|
void updateCursor();
|
|
|
|
QWidget * dragSource;
|
|
diff -Nru qt-x11-free-3.3.4.orig/src/kernel/qpixmap_x11.cpp qt-x11-free-3.3.4/src/kernel/qpixmap_x11.cpp
|
|
--- qt-x11-free-3.3.4.orig/src/kernel/qpixmap_x11.cpp 2005-03-19 19:57:36.000000000 +0100
|
|
+++ qt-x11-free-3.3.4/src/kernel/qpixmap_x11.cpp 2005-03-19 20:00:59.000000000 +0100
|
|
@@ -37,7 +37,19 @@
|
|
|
|
// NOT REVISED
|
|
|
|
+#include "qplatformdefs.h"
|
|
+
|
|
+#if defined(Q_OS_WIN32) && defined(QT_MITSHM)
|
|
+#undef QT_MITSHM
|
|
+#endif
|
|
+
|
|
+#ifdef QT_MITSHM
|
|
+
|
|
+// Use the MIT Shared Memory extension for pixmap<->image conversions
|
|
+#define QT_MITSHM_CONVERSIONS
|
|
+
|
|
// Uncomment the next line to enable the MIT Shared Memory extension
|
|
+// for QPixmap::xForm()
|
|
//
|
|
// WARNING: This has some problems:
|
|
//
|
|
@@ -45,14 +57,13 @@
|
|
// 2. Qt does not handle the ShmCompletion message, so you will
|
|
// get strange effects if you xForm() repeatedly.
|
|
//
|
|
-// #define QT_MITSHM
|
|
+// #define QT_MITSHM_XFORM
|
|
|
|
-#if defined(Q_OS_WIN32) && defined(QT_MITSHM)
|
|
-#undef QT_MITSHM
|
|
+#else
|
|
+#undef QT_MITSHM_CONVERSIONS
|
|
+#undef QT_MITSHM_XFORM
|
|
#endif
|
|
|
|
-#include "qplatformdefs.h"
|
|
-
|
|
#include "qbitmap.h"
|
|
#include "qpaintdevicemetrics.h"
|
|
#include "qimage.h"
|
|
@@ -91,7 +102,7 @@
|
|
MIT Shared Memory Extension support: makes xForm noticeably (~20%) faster.
|
|
*****************************************************************************/
|
|
|
|
-#if defined(QT_MITSHM)
|
|
+#if defined(QT_MITSHM_XFORM)
|
|
|
|
static bool xshminit = FALSE;
|
|
static XShmSegmentInfo xshminfo;
|
|
@@ -173,8 +184,100 @@
|
|
// return FALSE;
|
|
// }
|
|
|
|
-#endif // QT_MITSHM
|
|
+#endif // QT_MITSHM_XFORM
|
|
|
|
+#ifdef QT_MITSHM_CONVERSIONS
|
|
+
|
|
+static bool qt_mitshm_error = false;
|
|
+static int qt_mitshm_errorhandler( Display*, XErrorEvent* )
|
|
+{
|
|
+ qt_mitshm_error = true;
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+static XImage* qt_XShmCreateImage( Display* dpy, Visual* visual, unsigned int depth,
|
|
+ int format, int /*offset*/, char* /*data*/, unsigned int width, unsigned int height,
|
|
+ int /*bitmap_pad*/, int /*bytes_per_line*/, XShmSegmentInfo* shminfo )
|
|
+{
|
|
+ if( width * height * depth < 100*100*32 )
|
|
+ return NULL;
|
|
+ static int shm_inited = -1;
|
|
+ if( shm_inited == -1 ) {
|
|
+ if( XShmQueryExtension( dpy ))
|
|
+ shm_inited = 1;
|
|
+ else
|
|
+ shm_inited = 0;
|
|
+ }
|
|
+ if( shm_inited == 0 )
|
|
+ return NULL;
|
|
+ XImage* xi = XShmCreateImage( dpy, visual, depth, format, NULL, shminfo, width,
|
|
+ height );
|
|
+ if( xi == NULL )
|
|
+ return NULL;
|
|
+ shminfo->shmid = shmget( IPC_PRIVATE, xi->bytes_per_line * xi->height,
|
|
+ IPC_CREAT|0600);
|
|
+ if( shminfo->shmid < 0 ) {
|
|
+ XDestroyImage( xi );
|
|
+ return NULL;
|
|
+ }
|
|
+ shminfo->readOnly = False;
|
|
+ shminfo->shmaddr = (char*)shmat( shminfo->shmid, 0, 0 );
|
|
+ if( shminfo->shmaddr == (char*)-1 ) {
|
|
+ XDestroyImage( xi );
|
|
+ shmctl( shminfo->shmid, IPC_RMID, 0 );
|
|
+ return NULL;
|
|
+ }
|
|
+ xi->data = shminfo->shmaddr;
|
|
+#ifndef QT_MITSHM_RMID_IGNORES_REFCOUNT
|
|
+ // mark as deleted to automatically free the memory in case
|
|
+ // of a crash (but this doesn't work e.g. on Solaris)
|
|
+ shmctl( shminfo->shmid, IPC_RMID, 0 );
|
|
+#endif
|
|
+ if( shm_inited == 1 ) { // first time
|
|
+ XErrorHandler old_h = XSetErrorHandler( qt_mitshm_errorhandler );
|
|
+ XShmAttach( dpy, shminfo );
|
|
+ shm_inited = 2;
|
|
+ XSync( dpy, False );
|
|
+ XSetErrorHandler( old_h );
|
|
+ if( qt_mitshm_error ) { // oops ... perhaps we are remote?
|
|
+ shm_inited = 0;
|
|
+ XDestroyImage( xi );
|
|
+ shmdt( shminfo->shmaddr );
|
|
+#ifdef QT_MITSHM_RMID_IGNORES_REFCOUNT
|
|
+ shmctl( shminfo->shmid, IPC_RMID, 0 );
|
|
+#endif
|
|
+ return NULL;
|
|
+ }
|
|
+ } else
|
|
+ XShmAttach( dpy, shminfo );
|
|
+ return xi;
|
|
+}
|
|
+
|
|
+static void qt_XShmDestroyImage( XImage* xi, XShmSegmentInfo* shminfo )
|
|
+{
|
|
+ XShmDetach( QPaintDevice::x11AppDisplay(), shminfo );
|
|
+ XDestroyImage( xi );
|
|
+ shmdt( shminfo->shmaddr );
|
|
+#ifdef QT_MITSHM_RMID_IGNORES_REFCOUNT
|
|
+ shmctl( shminfo->shmid, IPC_RMID, 0 );
|
|
+#endif
|
|
+}
|
|
+
|
|
+static XImage* qt_XShmGetImage( const QPixmap* pix, int format,
|
|
+ XShmSegmentInfo* shminfo )
|
|
+{
|
|
+ XImage* xi = qt_XShmCreateImage( pix->x11Display(), (Visual*)pix->x11Visual(),
|
|
+ pix->depth(), format, 0, 0, pix->width(), pix->height(), 32, 0, shminfo );
|
|
+ if( xi == NULL )
|
|
+ return NULL;
|
|
+ if( XShmGetImage( pix->x11Display(), pix->handle(), xi, 0, 0, AllPlanes ) == False ) {
|
|
+ qt_XShmDestroyImage( xi, shminfo );
|
|
+ return NULL;
|
|
+ }
|
|
+ return xi;
|
|
+}
|
|
+
|
|
+#endif // QT_MITSHM_CONVERSIONS
|
|
|
|
/*****************************************************************************
|
|
Internal functions
|
|
@@ -624,9 +727,20 @@
|
|
d = 32; // > 8 ==> 32
|
|
|
|
XImage *xi = (XImage *)data->ximage; // any cached ximage?
|
|
- if ( !xi ) // fetch data from X server
|
|
- xi = XGetImage( x11Display(), hd, 0, 0, w, h, AllPlanes,
|
|
+#ifdef QT_MITSHM_CONVERSIONS
|
|
+ bool mitshm_ximage = false;
|
|
+ XShmSegmentInfo shminfo;
|
|
+#endif
|
|
+ if ( !xi ) { // fetch data from X server
|
|
+#ifdef QT_MITSHM_CONVERSIONS
|
|
+ xi = qt_XShmGetImage( this, mono ? XYPixmap : ZPixmap, &shminfo );
|
|
+ if( xi ) {
|
|
+ mitshm_ximage = true;
|
|
+ } else
|
|
+#endif
|
|
+ xi = XGetImage( x11Display(), hd, 0, 0, w, h, AllPlanes,
|
|
mono ? XYPixmap : ZPixmap );
|
|
+ }
|
|
Q_CHECK_PTR( xi );
|
|
|
|
QImage::Endian bitOrder = QImage::IgnoreEndian;
|
|
@@ -635,15 +749,31 @@
|
|
QImage::LittleEndian : QImage::BigEndian;
|
|
}
|
|
image.create( w, h, d, 0, bitOrder );
|
|
- if ( image.isNull() ) // could not create image
|
|
+ if ( image.isNull() ) { // could not create image
|
|
+#ifdef QT_MITSHM_CONVERSIONS
|
|
+ if( mitshm_ximage )
|
|
+ qt_XShmDestroyImage( xi, &shminfo );
|
|
+ else
|
|
+#endif
|
|
+ qSafeXDestroyImage( xi );
|
|
return image;
|
|
+ }
|
|
|
|
const QPixmap* msk = mask();
|
|
const QPixmap *alf = data->alphapm;
|
|
|
|
QImage alpha;
|
|
if (alf) {
|
|
- XImage *axi = XGetImage(x11Display(), alf->hd, 0, 0, w, h, AllPlanes, ZPixmap);
|
|
+ XImage* axi;
|
|
+#ifdef QT_MITSHM_CONVERSIONS
|
|
+ bool mitshm_aximage = false;
|
|
+ XShmSegmentInfo ashminfo;
|
|
+ axi = qt_XShmGetImage( alf, ZPixmap, &ashminfo );
|
|
+ if( axi ) {
|
|
+ mitshm_aximage = true;
|
|
+ } else
|
|
+#endif
|
|
+ axi = XGetImage(x11Display(), alf->hd, 0, 0, w, h, AllPlanes, ZPixmap);
|
|
|
|
if (axi) {
|
|
image.setAlphaBuffer( TRUE );
|
|
@@ -657,7 +787,12 @@
|
|
src += axi->bytes_per_line;
|
|
}
|
|
|
|
- qSafeXDestroyImage( axi );
|
|
+#ifdef QT_MITSHM_CONVERSIONS
|
|
+ if( mitshm_aximage )
|
|
+ qt_XShmDestroyImage( axi, &ashminfo );
|
|
+ else
|
|
+#endif
|
|
+ qSafeXDestroyImage( axi );
|
|
}
|
|
} else if (msk) {
|
|
image.setAlphaBuffer( TRUE );
|
|
@@ -799,6 +934,12 @@
|
|
xi->bits_per_pixel );
|
|
#endif
|
|
image.reset();
|
|
+#ifdef QT_MITSHM_CONVERSIONS
|
|
+ if( mitshm_ximage )
|
|
+ qt_XShmDestroyImage( xi, &shminfo );
|
|
+ else
|
|
+#endif
|
|
+ qSafeXDestroyImage( xi );
|
|
return image;
|
|
}
|
|
|
|
@@ -904,10 +1045,22 @@
|
|
delete [] carr;
|
|
}
|
|
if ( data->optim != BestOptim ) { // throw away image data
|
|
- qSafeXDestroyImage( xi );
|
|
+#ifdef QT_MITSHM_CONVERSIONS
|
|
+ if( mitshm_ximage )
|
|
+ qt_XShmDestroyImage( xi, &shminfo );
|
|
+ else
|
|
+#endif
|
|
+ qSafeXDestroyImage( xi );
|
|
((QPixmap*)this)->data->ximage = 0;
|
|
- } else // keep ximage data
|
|
+ } else { // keep ximage data
|
|
+#ifdef QT_MITSHM_CONVERSIONS
|
|
+ if( mitshm_ximage ) { // copy the XImage?
|
|
+ qt_XShmDestroyImage( xi, &shminfo );
|
|
+ xi = 0;
|
|
+ }
|
|
+#endif
|
|
((QPixmap*)this)->data->ximage = xi;
|
|
+ }
|
|
|
|
return image;
|
|
}
|
|
@@ -1077,6 +1230,11 @@
|
|
bool trucol = (visual->c_class == TrueColor);
|
|
int nbytes = image.numBytes();
|
|
uchar *newbits= 0;
|
|
+ int newbits_size = 0;
|
|
+#ifdef QT_MITSHM_CONVERSIONS
|
|
+ bool mitshm_ximage = false;
|
|
+ XShmSegmentInfo shminfo;
|
|
+#endif
|
|
|
|
if ( trucol ) { // truecolor display
|
|
QRgb pix[256]; // pixel translation table
|
|
@@ -1105,17 +1263,23 @@
|
|
}
|
|
}
|
|
|
|
- xi = XCreateImage( dpy, visual, dd, ZPixmap, 0, 0, w, h, 32, 0 );
|
|
+#ifdef QT_MITSHM_CONVERSIONS
|
|
+ xi = qt_XShmCreateImage( dpy, visual, dd, ZPixmap, 0, 0, w, h, 32, 0, &shminfo );
|
|
+ if( xi != NULL ) {
|
|
+ mitshm_ximage = true;
|
|
+ newbits = (uchar*)xi->data;
|
|
+ }
|
|
+ else
|
|
+#endif
|
|
+ xi = XCreateImage( dpy, visual, dd, ZPixmap, 0, 0, w, h, 32, 0 );
|
|
Q_CHECK_PTR( xi );
|
|
- newbits = (uchar *)malloc( xi->bytes_per_line*h );
|
|
+ if( newbits == NULL )
|
|
+ newbits = (uchar *)malloc( xi->bytes_per_line*h );
|
|
Q_CHECK_PTR( newbits );
|
|
if ( !newbits ) // no memory
|
|
return FALSE;
|
|
int bppc = xi->bits_per_pixel;
|
|
|
|
- if ( bppc > 8 && xi->byte_order == LSBFirst )
|
|
- bppc++;
|
|
-
|
|
bool contig_bits = n_bits(red_mask) == rbits &&
|
|
n_bits(green_mask) == gbits &&
|
|
n_bits(blue_mask) == bbits;
|
|
@@ -1165,31 +1329,69 @@
|
|
init=TRUE;
|
|
}
|
|
|
|
- for ( uint y=0; y<h; y++ ) {
|
|
- uchar* src = image.scanLine( y );
|
|
- uchar* dst = newbits + xi->bytes_per_line*y;
|
|
- QRgb* p = (QRgb *)src;
|
|
+ enum { BPP8,
|
|
+ BPP16_8_3_M3, BPP16_7_2_M3, BPP16_MSB, BPP16_LSB,
|
|
+ BPP24_MSB, BPP24_LSB,
|
|
+ BPP32_16_8_0, BPP32_MSB, BPP32_LSB
|
|
+ } mode = BPP8;
|
|
|
|
-#define GET_RGB \
|
|
- int r = qRed ( *p ); \
|
|
- int g = qGreen( *p ); \
|
|
- int b = qBlue ( *p++ ); \
|
|
- r = red_shift > 0 \
|
|
- ? r << red_shift : r >> -red_shift; \
|
|
- g = green_shift > 0 \
|
|
- ? g << green_shift : g >> -green_shift; \
|
|
- b = blue_shift > 0 \
|
|
- ? b << blue_shift : b >> -blue_shift;
|
|
+ if ( bppc > 8 && xi->byte_order == LSBFirst )
|
|
+ bppc++;
|
|
+
|
|
+ int wordsize;
|
|
+ bool bigendian;
|
|
+ qSysInfo( &wordsize, &bigendian );
|
|
+ bool same_msb_lsb = ( xi->byte_order == MSBFirst ) == ( bigendian );
|
|
+
|
|
+ if( bppc == 8 ) // 8 bit
|
|
+ mode = BPP8;
|
|
+ else if( bppc == 16 || bppc == 17 ) { // 16 bit MSB/LSB
|
|
+ if( red_shift == 8 && green_shift == 3 && blue_shift == -3
|
|
+ && !d8 && same_msb_lsb )
|
|
+ mode = BPP16_8_3_M3;
|
|
+ else if( red_shift == 7 && green_shift == 2 && blue_shift == -3
|
|
+ && !d8 && same_msb_lsb )
|
|
+ mode = BPP16_7_2_M3;
|
|
+ else
|
|
+ mode = bppc == 17 ? BPP16_LSB : BPP16_MSB;
|
|
+ } else if( bppc == 24 || bppc == 25 ) { // 24 bit MSB/LSB
|
|
+ mode = bppc == 25 ? BPP24_LSB : BPP24_MSB;
|
|
+ } else if( bppc == 32 || bppc == 33 ) { // 32 bit MSB/LSB
|
|
+ if( red_shift == 16 && green_shift == 8 && blue_shift == 0
|
|
+ && !d8 && same_msb_lsb )
|
|
+ mode = BPP32_16_8_0;
|
|
+ else
|
|
+ mode = bppc == 33 ? BPP32_LSB : BPP32_MSB;
|
|
+ } else
|
|
+ qFatal("Logic error 3");
|
|
|
|
#define GET_PIXEL \
|
|
int pixel; \
|
|
if ( d8 ) pixel = pix[*src++]; \
|
|
else { \
|
|
- GET_RGB \
|
|
- pixel = (b & blue_mask)|(g & green_mask) | (r & red_mask) \
|
|
+ int r = qRed ( *p ); \
|
|
+ int g = qGreen( *p ); \
|
|
+ int b = qBlue ( *p++ ); \
|
|
+ r = red_shift > 0 \
|
|
+ ? r << red_shift : r >> -red_shift; \
|
|
+ g = green_shift > 0 \
|
|
+ ? g << green_shift : g >> -green_shift; \
|
|
+ b = blue_shift > 0 \
|
|
+ ? b << blue_shift : b >> -blue_shift; \
|
|
+ pixel = (r & red_mask)|(g & green_mask) | (b & blue_mask) \
|
|
| ~(blue_mask | green_mask | red_mask); \
|
|
}
|
|
|
|
+// optimized case - no d8 case, shift only once instead of twice, mask only once instead of twice,
|
|
+// use direct values instead of variables, and use only one statement
|
|
+// (*p >> 16), (*p >> 8 ) and (*p) are qRed(),qGreen() and qBlue() without masking
|
|
+// shifts have to be passed including the shift operator (e.g. '>>3'), because of the direction
|
|
+#define GET_PIXEL_OPT(red_shift,green_shift,blue_shift,red_mask,green_mask,blue_mask) \
|
|
+ int pixel = ((( *p >> 16 ) red_shift ) & red_mask ) \
|
|
+ | ((( *p >> 8 ) green_shift ) & green_mask ) \
|
|
+ | ((( *p ) blue_shift ) & blue_mask ); \
|
|
+ ++p;
|
|
+
|
|
#define GET_PIXEL_DITHER_TC \
|
|
int r = qRed ( *p ); \
|
|
int g = qGreen( *p ); \
|
|
@@ -1210,91 +1412,177 @@
|
|
? g << green_shift : g >> -green_shift; \
|
|
b = blue_shift > 0 \
|
|
? b << blue_shift : b >> -blue_shift; \
|
|
- int pixel = (b & blue_mask)|(g & green_mask) | (r & red_mask);
|
|
+ int pixel = (r & red_mask)|(g & green_mask) | (b & blue_mask);
|
|
|
|
- if ( dither_tc ) {
|
|
- uint x;
|
|
- switch ( bppc ) {
|
|
- case 16: // 16 bit MSB
|
|
- for ( x=0; x<w; x++ ) {
|
|
- GET_PIXEL_DITHER_TC
|
|
- *dst++ = (pixel >> 8);
|
|
- *dst++ = pixel;
|
|
- }
|
|
+// again, optimized case
|
|
+// can't be optimized that much :(
|
|
+#define GET_PIXEL_DITHER_TC_OPT(red_shift,green_shift,blue_shift,red_mask,green_mask,blue_mask, \
|
|
+ rbits,gbits,bbits) \
|
|
+ const int thres = D[x%16][y%16]; \
|
|
+ int r = qRed ( *p ); \
|
|
+ if ( r <= (255-(1<<(8-rbits))) && ((r<<rbits) & 255) \
|
|
+ > thres) \
|
|
+ r += (1<<(8-rbits)); \
|
|
+ int g = qGreen( *p ); \
|
|
+ if ( g <= (255-(1<<(8-gbits))) && ((g<<gbits) & 255) \
|
|
+ > thres) \
|
|
+ g += (1<<(8-gbits)); \
|
|
+ int b = qBlue ( *p++ ); \
|
|
+ if ( b <= (255-(1<<(8-bbits))) && ((b<<bbits) & 255) \
|
|
+ > thres) \
|
|
+ b += (1<<(8-bbits)); \
|
|
+ int pixel = (( r red_shift ) & red_mask ) \
|
|
+ | (( g green_shift ) & green_mask ) \
|
|
+ | (( b blue_shift ) & blue_mask );
|
|
+
|
|
+#define CYCLE(body) \
|
|
+ for ( uint y=0; y<h; y++ ) { \
|
|
+ uchar* src = image.scanLine( y ); \
|
|
+ uchar* dst = newbits + xi->bytes_per_line*y; \
|
|
+ QRgb* p = (QRgb *)src; \
|
|
+ body \
|
|
+ }
|
|
+
|
|
+ if ( dither_tc ) {
|
|
+ switch ( mode ) {
|
|
+ case BPP16_8_3_M3:
|
|
+ CYCLE(
|
|
+ Q_INT16* dst16 = (Q_INT16*)dst;
|
|
+ for ( uint x=0; x<w; x++ ) {
|
|
+ GET_PIXEL_DITHER_TC_OPT(<<8,<<3,>>3,0xf800,0x7e0,0x1f,5,6,5)
|
|
+ *dst16++ = pixel;
|
|
+ }
|
|
+ )
|
|
break;
|
|
- case 17: // 16 bit LSB
|
|
- for ( x=0; x<w; x++ ) {
|
|
- GET_PIXEL_DITHER_TC
|
|
- *dst++ = pixel;
|
|
- *dst++ = pixel >> 8;
|
|
- }
|
|
+ case BPP16_7_2_M3:
|
|
+ CYCLE(
|
|
+ Q_INT16* dst16 = (Q_INT16*)dst;
|
|
+ for ( uint x=0; x<w; x++ ) {
|
|
+ GET_PIXEL_DITHER_TC_OPT(<<7,<<2,>>3,0x7c00,0x3e0,0x1f,5,5,5)
|
|
+ *dst16++ = pixel;
|
|
+ }
|
|
+ )
|
|
+ break;
|
|
+ case BPP16_MSB: // 16 bit MSB
|
|
+ CYCLE(
|
|
+ for ( uint x=0; x<w; x++ ) {
|
|
+ GET_PIXEL_DITHER_TC
|
|
+ *dst++ = (pixel >> 8);
|
|
+ *dst++ = pixel;
|
|
+ }
|
|
+ )
|
|
+ break;
|
|
+ case BPP16_LSB: // 16 bit LSB
|
|
+ CYCLE(
|
|
+ for ( uint x=0; x<w; x++ ) {
|
|
+ GET_PIXEL_DITHER_TC
|
|
+ *dst++ = pixel;
|
|
+ *dst++ = pixel >> 8;
|
|
+ }
|
|
+ )
|
|
break;
|
|
default:
|
|
qFatal("Logic error");
|
|
}
|
|
- } else {
|
|
- uint x;
|
|
- switch ( bppc ) {
|
|
- case 8: // 8 bit
|
|
- for ( x=0; x<w; x++ ) {
|
|
- int pixel = pix[*src++];
|
|
- *dst++ = pixel;
|
|
- }
|
|
+ } else {
|
|
+ switch ( mode ) {
|
|
+ case BPP8: // 8 bit
|
|
+ CYCLE(
|
|
+ Q_UNUSED(p);
|
|
+ for ( uint x=0; x<w; x++ ) {
|
|
+ int pixel = pix[*src++];
|
|
+ *dst++ = pixel;
|
|
+ }
|
|
+ )
|
|
break;
|
|
- case 16: // 16 bit MSB
|
|
- for ( x=0; x<w; x++ ) {
|
|
- GET_PIXEL
|
|
- *dst++ = (pixel >> 8);
|
|
- *dst++ = pixel;
|
|
- }
|
|
+ case BPP16_8_3_M3:
|
|
+ CYCLE(
|
|
+ Q_INT16* dst16 = (Q_INT16*)dst;
|
|
+ for ( uint x=0; x<w; x++ ) {
|
|
+ GET_PIXEL_OPT(<<8,<<3,>>3,0xf800,0x7e0,0x1f)
|
|
+ *dst16++ = pixel;
|
|
+ }
|
|
+ )
|
|
break;
|
|
- case 17: // 16 bit LSB
|
|
- for ( x=0; x<w; x++ ) {
|
|
- GET_PIXEL
|
|
- *dst++ = pixel;
|
|
- *dst++ = pixel >> 8;
|
|
- }
|
|
+ case BPP16_7_2_M3:
|
|
+ CYCLE(
|
|
+ Q_INT16* dst16 = (Q_INT16*)dst;
|
|
+ for ( uint x=0; x<w; x++ ) {
|
|
+ GET_PIXEL_OPT(<<7,<<2,>>3,0x7c00,0x3e0,0x1f)
|
|
+ *dst16++ = pixel;
|
|
+ }
|
|
+ )
|
|
break;
|
|
- case 24: // 24 bit MSB
|
|
- for ( x=0; x<w; x++ ) {
|
|
- GET_PIXEL
|
|
- *dst++ = pixel >> 16;
|
|
- *dst++ = pixel >> 8;
|
|
- *dst++ = pixel;
|
|
- }
|
|
+ case BPP16_MSB: // 16 bit MSB
|
|
+ CYCLE(
|
|
+ for ( uint x=0; x<w; x++ ) {
|
|
+ GET_PIXEL
|
|
+ *dst++ = (pixel >> 8);
|
|
+ *dst++ = pixel;
|
|
+ }
|
|
+ )
|
|
break;
|
|
- case 25: // 24 bit LSB
|
|
- for ( x=0; x<w; x++ ) {
|
|
- GET_PIXEL
|
|
- *dst++ = pixel;
|
|
- *dst++ = pixel >> 8;
|
|
- *dst++ = pixel >> 16;
|
|
- }
|
|
+ case BPP16_LSB: // 16 bit LSB
|
|
+ CYCLE(
|
|
+ for ( uint x=0; x<w; x++ ) {
|
|
+ GET_PIXEL
|
|
+ *dst++ = pixel;
|
|
+ *dst++ = pixel >> 8;
|
|
+ }
|
|
+ )
|
|
break;
|
|
- case 32: // 32 bit MSB
|
|
- for ( x=0; x<w; x++ ) {
|
|
- GET_PIXEL
|
|
- *dst++ = pixel >> 24;
|
|
- *dst++ = pixel >> 16;
|
|
- *dst++ = pixel >> 8;
|
|
- *dst++ = pixel;
|
|
- }
|
|
+ case BPP24_MSB: // 24 bit MSB
|
|
+ CYCLE(
|
|
+ for ( uint x=0; x<w; x++ ) {
|
|
+ GET_PIXEL
|
|
+ *dst++ = pixel >> 16;
|
|
+ *dst++ = pixel >> 8;
|
|
+ *dst++ = pixel;
|
|
+ }
|
|
+ )
|
|
break;
|
|
- case 33: // 32 bit LSB
|
|
- for ( x=0; x<w; x++ ) {
|
|
- GET_PIXEL
|
|
- *dst++ = pixel;
|
|
- *dst++ = pixel >> 8;
|
|
- *dst++ = pixel >> 16;
|
|
- *dst++ = pixel >> 24;
|
|
- }
|
|
+ case BPP24_LSB: // 24 bit LSB
|
|
+ CYCLE(
|
|
+ for ( uint x=0; x<w; x++ ) {
|
|
+ GET_PIXEL
|
|
+ *dst++ = pixel;
|
|
+ *dst++ = pixel >> 8;
|
|
+ *dst++ = pixel >> 16;
|
|
+ }
|
|
+ )
|
|
break;
|
|
- default:
|
|
- qFatal("Logic error 2");
|
|
- }
|
|
- }
|
|
- }
|
|
- xi->data = (char *)newbits;
|
|
+ case BPP32_16_8_0:
|
|
+ CYCLE(
|
|
+ memcpy( dst, p, w * 4 );
|
|
+ )
|
|
+ break;
|
|
+ case BPP32_MSB: // 32 bit MSB
|
|
+ CYCLE(
|
|
+ for ( uint x=0; x<w; x++ ) {
|
|
+ GET_PIXEL
|
|
+ *dst++ = pixel >> 24;
|
|
+ *dst++ = pixel >> 16;
|
|
+ *dst++ = pixel >> 8;
|
|
+ *dst++ = pixel;
|
|
+ }
|
|
+ )
|
|
+ break;
|
|
+ case BPP32_LSB: // 32 bit LSB
|
|
+ CYCLE(
|
|
+ for ( uint x=0; x<w; x++ ) {
|
|
+ GET_PIXEL
|
|
+ *dst++ = pixel;
|
|
+ *dst++ = pixel >> 8;
|
|
+ *dst++ = pixel >> 16;
|
|
+ *dst++ = pixel >> 24;
|
|
+ }
|
|
+ )
|
|
+ break;
|
|
+ default:
|
|
+ qFatal("Logic error 2");
|
|
+ }
|
|
+ }
|
|
+ xi->data = (char *)newbits;
|
|
}
|
|
|
|
if ( d == 8 && !trucol ) { // 8 bit pixmap
|
|
@@ -1313,6 +1601,7 @@
|
|
}
|
|
|
|
newbits = (uchar *)malloc( nbytes ); // copy image into newbits
|
|
+ newbits_size = nbytes;
|
|
Q_CHECK_PTR( newbits );
|
|
if ( !newbits ) // no memory
|
|
return FALSE;
|
|
@@ -1430,11 +1719,18 @@
|
|
}
|
|
|
|
if ( !xi ) { // X image not created
|
|
- xi = XCreateImage( dpy, visual, dd, ZPixmap, 0, 0, w, h, 32, 0 );
|
|
+#ifdef QT_MITSHM_CONVERSIONS
|
|
+ xi = qt_XShmCreateImage( dpy, visual, dd, ZPixmap, 0, 0, w, h, 32, 0, &shminfo );
|
|
+ if( xi != NULL )
|
|
+ mitshm_ximage = true;
|
|
+ else
|
|
+#endif
|
|
+ xi = XCreateImage( dpy, visual, dd, ZPixmap, 0, 0, w, h, 32, 0 );
|
|
if ( xi->bits_per_pixel == 16 ) { // convert 8 bpp ==> 16 bpp
|
|
ushort *p2;
|
|
int p2inc = xi->bytes_per_line/sizeof(ushort);
|
|
ushort *newerbits = (ushort *)malloc( xi->bytes_per_line * h );
|
|
+ newbits_size = xi->bytes_per_line * h;
|
|
Q_CHECK_PTR( newerbits );
|
|
if ( !newerbits ) // no memory
|
|
return FALSE;
|
|
@@ -1452,7 +1748,15 @@
|
|
"(bpp=%d)", xi->bits_per_pixel );
|
|
#endif
|
|
}
|
|
- xi->data = (char *)newbits;
|
|
+#ifdef QT_MITSHM_CONVERSIONS
|
|
+ if( newbits_size > 0 && mitshm_ximage ) { // need to copy to shared memory
|
|
+ memcpy( xi->data, newbits, newbits_size );
|
|
+ free( newbits );
|
|
+ newbits = (uchar*)xi->data;
|
|
+ }
|
|
+ else
|
|
+#endif
|
|
+ xi->data = (char *)newbits;
|
|
}
|
|
|
|
if ( hd && (width() != (int)w || height() != (int)h || this->depth() != dd) ) {
|
|
@@ -1485,19 +1789,24 @@
|
|
|
|
}
|
|
|
|
- XPutImage( dpy, hd, qt_xget_readonly_gc( x11Screen(), FALSE ),
|
|
- xi, 0, 0, 0, 0, w, h );
|
|
+#ifdef QT_MITSHM_CONVERSIONS
|
|
+ if( mitshm_ximage )
|
|
+ XShmPutImage( dpy, hd, qt_xget_readonly_gc( x11Screen(), FALSE ),
|
|
+ xi, 0, 0, 0, 0, w, h, False );
|
|
+ else
|
|
+#endif
|
|
+ XPutImage( dpy, hd, qt_xget_readonly_gc( x11Screen(), FALSE ),
|
|
+ xi, 0, 0, 0, 0, w, h );
|
|
|
|
- if ( data->optim != BestOptim ) { // throw away image
|
|
- qSafeXDestroyImage( xi );
|
|
- data->ximage = 0;
|
|
- } else { // keep ximage that we created
|
|
- data->ximage = xi;
|
|
- }
|
|
data->w = w;
|
|
data->h = h;
|
|
data->d = dd;
|
|
|
|
+ XImage* axi = NULL;
|
|
+#ifdef QT_MITSHM_CONVERSIONS
|
|
+ bool mitshm_aximage = false;
|
|
+ XShmSegmentInfo ashminfo;
|
|
+#endif
|
|
if ( image.hasAlphaBuffer() ) {
|
|
QBitmap m;
|
|
m = image.createAlphaMask( conversion_flags );
|
|
@@ -1533,38 +1842,90 @@
|
|
data->alphapm->rendhd =
|
|
(HANDLE) XftDrawCreateAlpha( x11Display(), data->alphapm->hd, 8 );
|
|
|
|
- XImage *axi = XCreateImage(x11Display(), (Visual *) x11Visual(),
|
|
- 8, ZPixmap, 0, 0, w, h, 8, 0);
|
|
+#ifdef QT_MITSHM_CONVERSIONS
|
|
+ axi = qt_XShmCreateImage( x11Display(), (Visual*)x11Visual(),
|
|
+ 8, ZPixmap, 0, 0, w, h, 8, 0, &ashminfo );
|
|
+ if( axi != NULL )
|
|
+ mitshm_aximage = true;
|
|
+ else
|
|
+#endif
|
|
+ axi = XCreateImage(x11Display(), (Visual *) x11Visual(),
|
|
+ 8, ZPixmap, 0, 0, w, h, 8, 0);
|
|
|
|
if (axi) {
|
|
- // the data is deleted by qSafeXDestroyImage
|
|
- axi->data = (char *) malloc(h * axi->bytes_per_line);
|
|
- Q_CHECK_PTR( axi->data );
|
|
+ if( axi->data==NULL ) {
|
|
+ // the data is deleted by qSafeXDestroyImage
|
|
+ axi->data = (char *) malloc(h * axi->bytes_per_line);
|
|
+ Q_CHECK_PTR( axi->data );
|
|
+ }
|
|
char *aptr = axi->data;
|
|
|
|
if (image.depth() == 32) {
|
|
const int *iptr = (const int *) image.bits();
|
|
- int max = w * h;
|
|
- while (max--)
|
|
- *aptr++ = *iptr++ >> 24; // squirt
|
|
+ if( axi->bytes_per_line == (int)w ) {
|
|
+ int max = w * h;
|
|
+ while (max--)
|
|
+ *aptr++ = *iptr++ >> 24; // squirt
|
|
+ } else {
|
|
+ for (uint i = 0; i < h; ++i ) {
|
|
+ for (uint j = 0; j < w; ++j )
|
|
+ *aptr++ = *iptr++ >> 24; // squirt
|
|
+ aptr += ( axi->bytes_per_line - w );
|
|
+ }
|
|
+ }
|
|
} else if (image.depth() == 8) {
|
|
const QRgb * const rgb = image.colorTable();
|
|
for (uint y = 0; y < h; ++y) {
|
|
const uchar *iptr = image.scanLine(y);
|
|
for (uint x = 0; x < w; ++x)
|
|
*aptr++ = qAlpha(rgb[*iptr++]);
|
|
+ aptr += ( axi->bytes_per_line - w );
|
|
}
|
|
}
|
|
|
|
GC gc = XCreateGC(x11Display(), data->alphapm->hd, 0, 0);
|
|
- XPutImage(dpy, data->alphapm->hd, gc, axi, 0, 0, 0, 0, w, h);
|
|
+#ifdef QT_MITSHM_CONVERSIONS
|
|
+ if( mitshm_aximage )
|
|
+ XShmPutImage( dpy, data->alphapm->hd, gc, axi, 0, 0, 0, 0, w, h, False );
|
|
+ else
|
|
+#endif
|
|
+ XPutImage(dpy, data->alphapm->hd, gc, axi, 0, 0, 0, 0, w, h);
|
|
XFreeGC(x11Display(), gc);
|
|
- qSafeXDestroyImage(axi);
|
|
}
|
|
}
|
|
#endif // QT_NO_XFTFREETYPE
|
|
}
|
|
|
|
+#ifdef QT_MITSHM_CONVERSIONS
|
|
+ if( mitshm_ximage || mitshm_aximage )
|
|
+ XSync( x11Display(), False ); // wait until processed
|
|
+#endif
|
|
+
|
|
+ if ( data->optim != BestOptim ) { // throw away image
|
|
+#ifdef QT_MITSHM_CONVERSIONS
|
|
+ if( mitshm_ximage )
|
|
+ qt_XShmDestroyImage( xi, &shminfo );
|
|
+ else
|
|
+#endif
|
|
+ qSafeXDestroyImage( xi );
|
|
+ data->ximage = 0;
|
|
+ } else { // keep ximage that we created
|
|
+#ifdef QT_MITSHM_CONVERSIONS
|
|
+ if( mitshm_ximage ) { // copy the XImage?
|
|
+ qt_XShmDestroyImage( xi, &shminfo );
|
|
+ xi = 0;
|
|
+ }
|
|
+#endif
|
|
+ data->ximage = xi;
|
|
+ }
|
|
+ if( axi ) {
|
|
+#ifdef QT_MITSHM_CONVERSIONS
|
|
+ if( mitshm_aximage )
|
|
+ qt_XShmDestroyImage( axi, &ashminfo );
|
|
+ else
|
|
+#endif
|
|
+ qSafeXDestroyImage(axi);
|
|
+ }
|
|
return TRUE;
|
|
}
|
|
|
|
@@ -1721,7 +2082,7 @@
|
|
return pm;
|
|
}
|
|
|
|
-#if defined(QT_MITSHM)
|
|
+#if defined(QT_MITSHM_XFORM)
|
|
static bool try_once = TRUE;
|
|
if (try_once) {
|
|
try_once = FALSE;
|
|
@@ -1754,7 +2115,7 @@
|
|
dbpl = ((w*bpp+31)/32)*4;
|
|
dbytes = dbpl*h;
|
|
|
|
-#if defined(QT_MITSHM)
|
|
+#if defined(QT_MITSHM_XFORM)
|
|
if ( use_mitshm ) {
|
|
dptr = (uchar *)xshmimg->data;
|
|
uchar fillbyte = bpp == 8 ? white.pixel() : 0xff;
|
|
@@ -1770,7 +2131,7 @@
|
|
memset( dptr, Qt::white.pixel( x11Screen() ), dbytes );
|
|
else
|
|
memset( dptr, 0xff, dbytes );
|
|
-#if defined(QT_MITSHM)
|
|
+#if defined(QT_MITSHM_XFORM)
|
|
}
|
|
#endif
|
|
|
|
@@ -1801,7 +2162,7 @@
|
|
} else {
|
|
xbpl = (w*bpp)/8;
|
|
p_inc = dbpl - xbpl;
|
|
-#if defined(QT_MITSHM)
|
|
+#if defined(QT_MITSHM_XFORM)
|
|
if ( use_mitshm )
|
|
p_inc = xshmimg->bytes_per_line - xbpl;
|
|
#endif
|
|
@@ -1838,7 +2199,7 @@
|
|
QPixmap pm( w, h );
|
|
pm.data->uninit = FALSE;
|
|
pm.x11SetScreen( x11Screen() );
|
|
-#if defined(QT_MITSHM)
|
|
+#if defined(QT_MITSHM_XFORM)
|
|
if ( use_mitshm ) {
|
|
XCopyArea( dpy, xshmpm, pm.handle(), gc, 0, 0, w, h, 0, 0 );
|
|
} else {
|
|
@@ -1847,7 +2208,7 @@
|
|
ZPixmap, 0, (char *)dptr, w, h, 32, 0 );
|
|
XPutImage( dpy, pm.handle(), gc, xi, 0, 0, 0, 0, w, h);
|
|
qSafeXDestroyImage( xi );
|
|
-#if defined(QT_MITSHM)
|
|
+#if defined(QT_MITSHM_XFORM)
|
|
}
|
|
#endif
|
|
|
|
diff -Nru qt-x11-free-3.3.4.orig/src/kernel/qpngio.cpp qt-x11-free-3.3.4/src/kernel/qpngio.cpp
|
|
--- qt-x11-free-3.3.4.orig/src/kernel/qpngio.cpp 2005-03-19 19:57:36.000000000 +0100
|
|
+++ qt-x11-free-3.3.4/src/kernel/qpngio.cpp 2005-03-19 20:02:45.000000000 +0100
|
|
@@ -110,10 +110,18 @@
|
|
static
|
|
void setup_qt( QImage& image, png_structp png_ptr, png_infop info_ptr, float screen_gamma=0.0 )
|
|
{
|
|
- if ( screen_gamma != 0.0 && png_get_valid(png_ptr, info_ptr, PNG_INFO_gAMA) ) {
|
|
+ if ( 0.0 == screen_gamma )
|
|
+ // PNG docs say this is a good guess for a PC monitor
|
|
+ // in a dark room
|
|
+ screen_gamma = 2.2;
|
|
+ if ( png_get_valid(png_ptr, info_ptr, PNG_INFO_gAMA) ) {
|
|
+ // the file has a gAMA attribute
|
|
double file_gamma;
|
|
- png_get_gAMA(png_ptr, info_ptr, &file_gamma);
|
|
- png_set_gamma( png_ptr, screen_gamma, file_gamma );
|
|
+ if ( png_get_gAMA(png_ptr, info_ptr, &file_gamma))
|
|
+ png_set_gamma( png_ptr, screen_gamma, file_gamma );
|
|
+ } else {
|
|
+ // no file gamma, use a reasonable default
|
|
+ png_set_gamma( png_ptr, screen_gamma, 0.45455 );
|
|
}
|
|
|
|
png_uint_32 width;
|
|
diff -Nru qt-x11-free-3.3.4.orig/src/tools/qvaluelist.h qt-x11-free-3.3.4/src/tools/qvaluelist.h
|
|
--- qt-x11-free-3.3.4.orig/src/tools/qvaluelist.h 2005-03-19 19:57:36.000000000 +0100
|
|
+++ qt-x11-free-3.3.4/src/tools/qvaluelist.h 2005-03-19 20:01:36.000000000 +0100
|
|
@@ -638,13 +638,11 @@
|
|
l.clear();
|
|
Q_UINT32 c;
|
|
s >> c;
|
|
- for( Q_UINT32 i = 0; i < c; ++i )
|
|
+ for( Q_UINT32 i = 0; i < c && !s.atEnd(); ++i )
|
|
{
|
|
T t;
|
|
s >> t;
|
|
l.append( t );
|
|
- if ( s.atEnd() )
|
|
- break;
|
|
}
|
|
return s;
|
|
}
|
|
diff -Nru qt-x11-free-3.3.4.orig/src/widgets/qpopupmenu.cpp qt-x11-free-3.3.4/src/widgets/qpopupmenu.cpp
|
|
--- qt-x11-free-3.3.4.orig/src/widgets/qpopupmenu.cpp 2005-03-19 19:57:36.000000000 +0100
|
|
+++ qt-x11-free-3.3.4/src/widgets/qpopupmenu.cpp 2005-03-19 20:03:02.000000000 +0100
|
|
@@ -253,6 +253,8 @@
|
|
} scroll;
|
|
QSize calcSize;
|
|
QRegion mouseMoveBuffer;
|
|
+ uint hasmouse : 1;
|
|
+ QPoint ignoremousepos;
|
|
};
|
|
|
|
static QPopupMenu* active_popup_menu = 0;
|
|
@@ -272,6 +274,7 @@
|
|
d->scroll.scrollableSize = d->scroll.topScrollableIndex = 0;
|
|
d->scroll.scrollable = QPopupMenuPrivate::Scroll::ScrollNone;
|
|
d->scroll.scrolltimer = 0;
|
|
+ d->hasmouse = 0;
|
|
isPopupMenu = TRUE;
|
|
#ifndef QT_NO_ACCEL
|
|
autoaccel = 0;
|
|
@@ -1354,6 +1357,7 @@
|
|
popupActive = -1;
|
|
if(style().styleHint(QStyle::SH_PopupMenu_SubMenuPopupDelay, this))
|
|
d->mouseMoveBuffer = QRegion();
|
|
+ d->ignoremousepos = QCursor::pos();
|
|
}
|
|
|
|
/*!
|
|
@@ -1701,6 +1705,11 @@
|
|
|
|
void QPopupMenu::mouseMoveEvent( QMouseEvent *e )
|
|
{
|
|
+ if( e->globalPos() == d->ignoremousepos ) {
|
|
+ return;
|
|
+ }
|
|
+ d->ignoremousepos = QPoint();
|
|
+
|
|
motion++;
|
|
|
|
if ( parentMenu && parentMenu->isPopupMenu ) {
|
|
@@ -1741,6 +1750,11 @@
|
|
|
|
int item = itemAtPos( e->pos() );
|
|
if ( item == -1 ) { // no valid item
|
|
+ if( !d->hasmouse ) {
|
|
+ tryMenuBar( e );
|
|
+ return;
|
|
+ }
|
|
+ d->hasmouse = 0;
|
|
int lastActItem = actItem;
|
|
actItem = -1;
|
|
if ( lastActItem >= 0 )
|
|
@@ -1752,6 +1766,7 @@
|
|
}
|
|
} else { // mouse on valid item
|
|
// but did not register mouse press
|
|
+ d->hasmouse = 1;
|
|
if ( (e->state() & Qt::MouseButtonMask) && !mouseBtDn )
|
|
mouseBtDn = TRUE; // so mouseReleaseEvent will pop down
|
|
|
|
@@ -2160,6 +2175,7 @@
|
|
*/
|
|
void QPopupMenu::leaveEvent( QEvent * )
|
|
{
|
|
+ d->hasmouse = 0;
|
|
if ( testWFlags( WStyle_Tool ) && style().styleHint(QStyle::SH_PopupMenu_MouseTracking, this) ) {
|
|
int lastActItem = actItem;
|
|
actItem = -1;
|
|
@@ -2530,7 +2546,7 @@
|
|
constPolish();
|
|
QPopupMenu* that = (QPopupMenu*) this;
|
|
//We do not need a resize here, just the sizeHint..
|
|
- return that->updateSize(FALSE, FALSE).expandedTo( QApplication::globalStrut() );
|
|
+ return that->updateSize(FALSE).expandedTo( QApplication::globalStrut() );
|
|
}
|
|
|
|
|
|
diff -Nru qt-x11-free-3.3.4.orig/src/widgets/qprogressbar.cpp qt-x11-free-3.3.4/src/widgets/qprogressbar.cpp
|
|
--- qt-x11-free-3.3.4.orig/src/widgets/qprogressbar.cpp 2005-03-19 19:57:36.000000000 +0100
|
|
+++ qt-x11-free-3.3.4/src/widgets/qprogressbar.cpp 2005-03-19 20:01:42.000000000 +0100
|
|
@@ -47,6 +47,14 @@
|
|
#endif
|
|
#include <limits.h>
|
|
|
|
+class QProgressBarPrivate
|
|
+{
|
|
+ public:
|
|
+ QProgressBarPrivate() : last_painted_progress( 0 ) { }
|
|
+
|
|
+ int last_painted_progress;
|
|
+};
|
|
+
|
|
/*!
|
|
\class QProgressBar qprogressbar.h
|
|
\brief The QProgressBar widget provides a horizontal progress bar.
|
|
@@ -99,7 +107,7 @@
|
|
center_indicator( TRUE ),
|
|
auto_indicator( TRUE ),
|
|
percentage_visible( TRUE ),
|
|
- d( 0 )
|
|
+ d( new QProgressBarPrivate )
|
|
{
|
|
setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
|
|
initFrame();
|
|
@@ -130,12 +138,20 @@
|
|
center_indicator( TRUE ),
|
|
auto_indicator( TRUE ),
|
|
percentage_visible( TRUE ),
|
|
- d( 0 )
|
|
+ d( new QProgressBarPrivate )
|
|
{
|
|
setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
|
|
initFrame();
|
|
}
|
|
|
|
+/*!
|
|
+ Destroys the object and frees any allocated ressources.
|
|
+*/
|
|
+
|
|
+QProgressBar::~QProgressBar()
|
|
+{
|
|
+ delete d;
|
|
+}
|
|
|
|
/*!
|
|
Reset the progress bar. The progress bar "rewinds" and shows no
|
|
@@ -188,11 +204,16 @@
|
|
progress < 0 || ( ( progress > total_steps ) && total_steps ) )
|
|
return;
|
|
|
|
+ const bool needRepaint = isVisible() && requireRepaint( progress );
|
|
+
|
|
progress_val = progress;
|
|
|
|
setIndicator( progress_str, progress_val, total_steps );
|
|
|
|
- repaint( FALSE );
|
|
+ if ( needRepaint ) {
|
|
+ repaint( FALSE );
|
|
+ d->last_painted_progress = progress;
|
|
+ }
|
|
|
|
#if defined(QT_ACCESSIBILITY_SUPPORT)
|
|
QAccessible::updateAccessibility( this, 0, QAccessible::ValueChanged );
|
|
@@ -318,6 +339,31 @@
|
|
QFrame::styleChange( old );
|
|
}
|
|
|
|
+/*!
|
|
+ This method returns whether changing the progress to the \a newValue
|
|
+ would require a repaint of the progress bar. This allows efficient
|
|
+ repainting.
|
|
+*/
|
|
+bool QProgressBar::requireRepaint( int newProgress ) const
|
|
+{
|
|
+ if ( newProgress == progress_val ||
|
|
+ newProgress == d->last_painted_progress ) {
|
|
+ return false;
|
|
+ }
|
|
+
|
|
+ const int width = contentsRect().width();
|
|
+ if ( width == 0 ) {
|
|
+ return false;
|
|
+ }
|
|
+
|
|
+ float progressPerPixel = 1.0;
|
|
+ if ( total_steps > width ) {
|
|
+ progressPerPixel = float( total_steps ) / float( width );
|
|
+ }
|
|
+
|
|
+ const int delta = d->last_painted_progress - newProgress;
|
|
+ return QABS( delta ) >= progressPerPixel;
|
|
+}
|
|
|
|
/*!
|
|
This method is called to generate the text displayed in the center
|
|
diff -Nru qt-x11-free-3.3.4.orig/src/widgets/qprogressbar.h qt-x11-free-3.3.4/src/widgets/qprogressbar.h
|
|
--- qt-x11-free-3.3.4.orig/src/widgets/qprogressbar.h 2005-03-19 19:57:36.000000000 +0100
|
|
+++ qt-x11-free-3.3.4/src/widgets/qprogressbar.h 2005-03-19 20:01:42.000000000 +0100
|
|
@@ -61,6 +61,7 @@
|
|
public:
|
|
QProgressBar( QWidget* parent=0, const char* name=0, WFlags f=0 );
|
|
QProgressBar( int totalSteps, QWidget* parent=0, const char* name=0, WFlags f=0 );
|
|
+ virtual ~QProgressBar();
|
|
|
|
int totalSteps() const;
|
|
int progress() const;
|
|
@@ -91,6 +92,7 @@
|
|
virtual bool setIndicator( QString & progress_str, int progress,
|
|
int totalSteps );
|
|
void styleChange( QStyle& );
|
|
+ bool requireRepaint( int newProgress ) const;
|
|
|
|
private:
|
|
int total_steps;
|
|
diff -Nru qt-x11-free-3.3.4.orig/src/widgets/qscrollview.cpp qt-x11-free-3.3.4/src/widgets/qscrollview.cpp
|
|
--- qt-x11-free-3.3.4.orig/src/widgets/qscrollview.cpp 2005-03-19 19:57:36.000000000 +0100
|
|
+++ qt-x11-free-3.3.4/src/widgets/qscrollview.cpp 2005-03-19 20:03:06.000000000 +0100
|
|
@@ -1180,7 +1180,7 @@
|
|
void QScrollView::wheelEvent( QWheelEvent *e )
|
|
{
|
|
QWheelEvent ce( viewport()->mapFromGlobal( e->globalPos() ),
|
|
- e->globalPos(), e->delta(), e->state());
|
|
+ e->globalPos(), e->delta(), e->state(), e->orientation() );
|
|
viewportWheelEvent(&ce);
|
|
if ( !ce.isAccepted() ) {
|
|
if ( e->orientation() == Horizontal && horizontalScrollBar() )
|
|
@@ -1551,6 +1551,9 @@
|
|
case QEvent::LayoutHint:
|
|
d->autoResizeHint(this);
|
|
break;
|
|
+ case QEvent::WindowActivate:
|
|
+ case QEvent::WindowDeactivate:
|
|
+ return TRUE;
|
|
default:
|
|
break;
|
|
}
|
|
@@ -1863,7 +1866,7 @@
|
|
the event itself.
|
|
*/
|
|
QWheelEvent ce( viewportToContents(e->pos()),
|
|
- e->globalPos(), e->delta(), e->state());
|
|
+ e->globalPos(), e->delta(), e->state(), e->orientation());
|
|
contentsWheelEvent(&ce);
|
|
if ( ce.isAccepted() )
|
|
e->accept();
|
|
diff -Nru qt-x11-free-3.3.4.orig/src/widgets/qtoolbar.cpp qt-x11-free-3.3.4/src/widgets/qtoolbar.cpp
|
|
--- qt-x11-free-3.3.4.orig/src/widgets/qtoolbar.cpp 2005-03-19 19:57:36.000000000 +0100
|
|
+++ qt-x11-free-3.3.4/src/widgets/qtoolbar.cpp 2005-03-19 20:02:41.000000000 +0100
|
|
@@ -648,7 +648,7 @@
|
|
QString s = b->textLabel();
|
|
if ( s.isEmpty() )
|
|
s = b->text();
|
|
- if ( b->popup() && b->popupDelay() == 0 )
|
|
+ if ( b->popup() && b->popupDelay() <= 0 )
|
|
id = d->extensionPopup->insertItem( b->iconSet(), s, b->popup() );
|
|
else
|
|
id = d->extensionPopup->insertItem( b->iconSet(), s, b, SLOT( emulateClick() ) ) ;
|
|
diff -Nru qt-x11-free-3.3.4.orig/tools/designer/designer/hierarchyview.cpp qt-x11-free-3.3.4/tools/designer/designer/hierarchyview.cpp
|
|
--- qt-x11-free-3.3.4.orig/tools/designer/designer/hierarchyview.cpp 2005-03-19 19:57:36.000000000 +0100
|
|
+++ qt-x11-free-3.3.4/tools/designer/designer/hierarchyview.cpp 2005-03-19 20:01:25.000000000 +0100
|
|
@@ -605,6 +605,7 @@
|
|
formWindow->mainWindow()->setupTabWidgetHierarchyMenu(
|
|
this, SLOT( addTabPage() ),
|
|
SLOT( removeTabPage() ) );
|
|
+ tabWidgetMenu->setItemEnabled(MainWindow::POPUP_REMOVE_PAGE_ID, ((QDesignerTabWidget*)w )->count() > 1);
|
|
tabWidgetMenu->popup( p );
|
|
}
|
|
}
|
|
diff -Nru qt-x11-free-3.3.4.orig/tools/designer/designer/mainwindow.cpp qt-x11-free-3.3.4/tools/designer/designer/mainwindow.cpp
|
|
--- qt-x11-free-3.3.4.orig/tools/designer/designer/mainwindow.cpp 2005-03-19 19:57:36.000000000 +0100
|
|
+++ qt-x11-free-3.3.4/tools/designer/designer/mainwindow.cpp 2005-03-19 20:01:25.000000000 +0100
|
|
@@ -2457,8 +2457,8 @@
|
|
{
|
|
QPopupMenu *menu = new QPopupMenu( parent );
|
|
|
|
- menu->insertItem( tr( "Add Page" ), parent, addSlot );
|
|
- menu->insertItem( tr( "Delete Page" ), parent, removeSlot );
|
|
+ menu->insertItem( tr( "Add Page" ), parent, addSlot, 0, POPUP_REMOVE_PAGE_ID+1 );
|
|
+ menu->insertItem( tr( "Delete Page" ), parent, removeSlot, 0, POPUP_REMOVE_PAGE_ID );
|
|
menu->insertSeparator();
|
|
actionEditCut->addTo( menu );
|
|
actionEditCopy->addTo( menu );
|
|
diff -Nru qt-x11-free-3.3.4.orig/tools/designer/designer/mainwindow.h qt-x11-free-3.3.4/tools/designer/designer/mainwindow.h
|
|
--- qt-x11-free-3.3.4.orig/tools/designer/designer/mainwindow.h 2005-03-19 19:57:36.000000000 +0100
|
|
+++ qt-x11-free-3.3.4/tools/designer/designer/mainwindow.h 2005-03-19 20:01:25.000000000 +0100
|
|
@@ -107,6 +107,7 @@
|
|
|
|
QPopupMenu *setupNormalHierarchyMenu( QWidget *parent );
|
|
QPopupMenu *setupTabWidgetHierarchyMenu( QWidget *parent, const char *addSlot, const char *removeSlot );
|
|
+ static const int POPUP_REMOVE_PAGE_ID = 1;
|
|
|
|
FormWindow *openFormWindow( const QString &fn, bool validFileName = TRUE, FormFile *ff = 0 );
|
|
bool isCustomWidgetUsed( MetaDataBase::CustomWidget *w );
|