~oif-team/ubuntu/natty/qt4-x11/xi2.1

« back to all changes in this revision

Viewing changes to src/gui/kernel/qdnd_x11.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Alessandro Ghersi
  • Date: 2009-11-02 18:30:08 UTC
  • mfrom: (1.2.2 upstream)
  • mto: (15.2.5 experimental)
  • mto: This revision was merged to the branch mainline in revision 88.
  • Revision ID: james.westby@ubuntu.com-20091102183008-b6a4gcs128mvfb3m
Tags: upstream-4.6.0~beta1
ImportĀ upstreamĀ versionĀ 4.6.0~beta1

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
/****************************************************************************
2
2
**
3
3
** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
 
4
** All rights reserved.
4
5
** Contact: Nokia Corporation (qt-info@nokia.com)
5
6
**
6
7
** This file is part of the QtGui module of the Qt Toolkit.
7
8
**
8
9
** $QT_BEGIN_LICENSE:LGPL$
9
 
** Commercial Usage
10
 
** Licensees holding valid Qt Commercial licenses may use this file in
11
 
** accordance with the Qt Commercial License Agreement provided with the
12
 
** Software or, alternatively, in accordance with the terms contained in
13
 
** a written agreement between you and Nokia.
 
10
** No Commercial Usage
 
11
** This file contains pre-release code and may not be distributed.
 
12
** You may use this file in accordance with the terms and conditions
 
13
** contained in the Technology Preview License Agreement accompanying
 
14
** this package.
14
15
**
15
16
** GNU Lesser General Public License Usage
16
17
** Alternatively, this file may be used under the terms of the GNU Lesser
20
21
** ensure the GNU Lesser General Public License version 2.1 requirements
21
22
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
22
23
**
23
 
** In addition, as a special exception, Nokia gives you certain
24
 
** additional rights. These rights are described in the Nokia Qt LGPL
25
 
** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
26
 
** package.
27
 
**
28
 
** GNU General Public License Usage
29
 
** Alternatively, this file may be used under the terms of the GNU
30
 
** General Public License version 3.0 as published by the Free Software
31
 
** Foundation and appearing in the file LICENSE.GPL included in the
32
 
** packaging of this file.  Please review the following information to
33
 
** ensure the GNU General Public License version 3.0 requirements will be
34
 
** met: http://www.gnu.org/copyleft/gpl.html.
35
 
**
36
 
** If you are unsure which license is appropriate for your use, please
37
 
** contact the sales department at http://www.qtsoftware.com/contact.
 
24
** In addition, as a special exception, Nokia gives you certain additional
 
25
** rights.  These rights are described in the Nokia Qt LGPL Exception
 
26
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
 
27
**
 
28
** If you have questions regarding the use of this file, please contact
 
29
** Nokia at qt-info@nokia.com.
 
30
**
 
31
**
 
32
**
 
33
**
 
34
**
 
35
**
 
36
**
 
37
**
38
38
** $QT_END_LICENSE$
39
39
**
40
40
****************************************************************************/
506
506
                    *atomFormat = textprop.encoding;
507
507
                    *dataFormat = textprop.format;
508
508
                    *data = QByteArray((const char *) textprop.value, textprop.nitems * textprop.format / 8);
 
509
                    ret = true;
509
510
 
510
511
                    DEBUG("    textprop type %lx\n"
511
512
                    "    textprop name '%s'\n"
541
542
                dm->xdndMimeTransferedPixmap[dm->xdndMimeTransferedPixmapIndex] = pm;
542
543
                dm->xdndMimeTransferedPixmapIndex =
543
544
                            (dm->xdndMimeTransferedPixmapIndex + 1) % 2;
 
545
                ret = true;
544
546
            }
 
547
        } else {
 
548
            DEBUG("QClipboard: xdndMimeDataForAtom(): converting to type '%s' is not supported", qPrintable(atomName));
545
549
        }
546
550
    }
547
 
    return data;
 
551
    return ret && data != 0;
548
552
}
549
553
 
550
554
//$$$
622
626
    if (format == QLatin1String("image/ppm")) {
623
627
        if (a == XA_PIXMAP && data.size() == sizeof(Pixmap)) {
624
628
            Pixmap xpm = *((Pixmap*)data.data());
625
 
            Display *dpy = display;
626
 
            Window r;
627
 
            int x,y;
628
 
            uint w,h,bw,d;
629
629
            if (!xpm)
630
630
                return QByteArray();
631
 
            XGetGeometry(dpy,xpm, &r,&x,&y,&w,&h,&bw,&d);
 
631
            QPixmap qpm = QPixmap::fromX11Pixmap(xpm);
632
632
            QImageWriter imageWriter;
633
 
            GC gc = XCreateGC(dpy, xpm, 0, 0);
634
 
            QImage imageToWrite;
635
 
            if (d == 1) {
636
 
                QBitmap qbm(w,h);
637
 
                XCopyArea(dpy,xpm,qbm.handle(),gc,0,0,w,h,0,0);
638
 
                imageWriter.setFormat("PBMRAW");
639
 
                imageToWrite = qbm.toImage();
640
 
            } else {
641
 
                QPixmap qpm(w,h);
642
 
                XCopyArea(dpy,xpm,qpm.handle(),gc,0,0,w,h,0,0);
643
 
                imageWriter.setFormat("PPMRAW");
644
 
                imageToWrite = qpm.toImage();
645
 
            }
646
 
            XFreeGC(dpy,gc);
 
633
            imageWriter.setFormat("PPMRAW");
 
634
            QImage imageToWrite = qpm.toImage();
647
635
            QBuffer buf;
648
636
            buf.open(QIODevice::WriteOnly);
649
637
            imageWriter.setDevice(&buf);
825
813
        Atom   type = XNone;
826
814
        int f;
827
815
        unsigned long n, a;
828
 
        unsigned char *retval;
 
816
        unsigned char *retval = 0;
829
817
        XGetWindowProperty(X11->display, qt_xdnd_dragsource_xid, ATOM(XdndTypelist), 0,
830
818
                           qt_xdnd_max_type, False, XA_ATOM, &type, &f,&n,&a,&retval);
831
 
        Atom *data = (Atom *)retval;
832
 
        for (; j<qt_xdnd_max_type && j < (int)n; j++) {
833
 
            qt_xdnd_types[j] = data[j];
834
 
        }
835
 
        if (data)
 
819
        if (retval) {
 
820
            Atom *data = (Atom *)retval;
 
821
            for (; j<qt_xdnd_max_type && j < (int)n; j++) {
 
822
                qt_xdnd_types[j] = data[j];
 
823
            }
836
824
            XFree((uchar*)data);
 
825
        }
837
826
    } else {
838
827
        // get the types from the message
839
828
        int i;
1086
1075
    if (!qt_xdnd_current_target)
1087
1076
        return;
1088
1077
 
 
1078
    QDragManager *manager = QDragManager::self();
 
1079
 
1089
1080
    XClientMessageEvent leave;
1090
1081
    leave.type = ClientMessage;
1091
1082
    leave.window = qt_xdnd_current_target;
1092
1083
    leave.format = 32;
1093
1084
    leave.message_type = ATOM(XdndLeave);
1094
 
    leave.data.l[0] = qt_xdnd_dragsource_xid;
 
1085
    leave.data.l[0] = manager->dragPrivate()->source->effectiveWinId();
1095
1086
    leave.data.l[1] = 0; // flags
1096
1087
    leave.data.l[2] = 0; // x, y
1097
1088
    leave.data.l[3] = 0; // w, h
1107
1098
    else
1108
1099
        XSendEvent(X11->display, qt_xdnd_current_proxy_target, False,
1109
1100
                    NoEventMask, (XEvent*)&leave);
 
1101
 
1110
1102
    // reset the drag manager state
1111
 
    QDragManager *manager = QDragManager::self();
1112
1103
    manager->willDrop = false;
1113
1104
    if (global_accepted_action != Qt::IgnoreAction)
1114
1105
        manager->emitActionChanged(Qt::IgnoreAction);