annotate dwt/dnd/ClipboardProxy.d @ 240:ce446666f5a2

Update to SWT 3.4M7
author Frank Benoit <benoit@tionex.de>
date Mon, 12 May 2008 19:13:01 +0200
parents 380bad9f6852
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
124
11b0a1324732 Fix various stack access from anon-class
Frank Benoit <benoit@tionex.de>
parents: 108
diff changeset
1 /*******************************************************************************
92
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2 * Copyright (c) 2000, 2005 IBM Corporation and others.
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
3 * All rights reserved. This program and the accompanying materials
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
4 * are made available under the terms of the Eclipse Public License v1.0
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
5 * which accompanies this distribution, and is available at
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
6 * http://www.eclipse.org/legal/epl-v10.html
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
7 *
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
8 * Contributors:
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
9 * IBM Corporation - initial API and implementation
108
0f12f6bb9739 author notice
Frank Benoit <benoit@tionex.de>
parents: 92
diff changeset
10 * Port to the D programming language:
0f12f6bb9739 author notice
Frank Benoit <benoit@tionex.de>
parents: 92
diff changeset
11 * Frank Benoit <benoit@tionex.de>
92
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
12 *******************************************************************************/
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
13 module dwt.dnd.ClipboardProxy;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
14
238
380bad9f6852 reverted char[] to String
Frank Benoit <benoit@tionex.de>
parents: 169
diff changeset
15 import dwt.dwthelper.utils;
380bad9f6852 reverted char[] to String
Frank Benoit <benoit@tionex.de>
parents: 169
diff changeset
16
92
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
17
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
18
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
19 import dwt.DWT;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
20 import dwt.internal.gtk.OS;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
21 import dwt.widgets.Display;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
22 import dwt.widgets.Event;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
23 import dwt.widgets.Listener;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
24 import dwt.dnd.Transfer;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
25 import dwt.dnd.Clipboard;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
26 import dwt.dnd.DND;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
27 import dwt.dnd.TransferData;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
28
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
29 import dwt.dwthelper.System;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
30 static import tango.stdc.string;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
31
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
32
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
33 class ClipboardProxy {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
34 /* Data is not flushed to the clipboard immediately.
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
35 * This class will remember the data and provide it when requested.
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
36 */
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
37 Object[] clipboardData;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
38 Transfer[] clipboardDataTypes;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
39 Object[] primaryClipboardData;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
40 Transfer[] primaryClipboardDataTypes;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
41
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
42 Display display;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
43 Clipboard activeClipboard = null;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
44 Clipboard activePrimaryClipboard = null;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
45
238
380bad9f6852 reverted char[] to String
Frank Benoit <benoit@tionex.de>
parents: 169
diff changeset
46 static String ID = "CLIPBOARD PROXY OBJECT"; //$NON-NLS-1$
92
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
47
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
48 static ClipboardProxy _getInstance(Display display) {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
49 ClipboardProxy proxy = cast(ClipboardProxy) display.getData(ID);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
50 if (proxy !is null) return proxy;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
51 proxy = new ClipboardProxy(display);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
52 display.setData(ID, proxy);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
53 display.addListener(DWT.Dispose, new class( display ) Listener {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
54 Display disp;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
55 this( Display disp ){ this.disp = disp; }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
56 public void handleEvent(Event event) {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
57 ClipboardProxy clipbordProxy = cast(ClipboardProxy)disp.getData(ID);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
58 if (clipbordProxy is null) return;
124
11b0a1324732 Fix various stack access from anon-class
Frank Benoit <benoit@tionex.de>
parents: 108
diff changeset
59 disp.setData(ID, null);
92
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
60 clipbordProxy.dispose();
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
61 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
62 });
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
63 return proxy;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
64 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
65
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
66 this(Display display) {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
67 this.display = display;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
68 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
69
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
70 void clear (Clipboard owner, int clipboards) {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
71 if ((clipboards & DND.CLIPBOARD) !is 0 && activeClipboard is owner) {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
72 OS.gtk_clipboard_clear(Clipboard.GTKCLIPBOARD);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
73 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
74 if ((clipboards & DND.SELECTION_CLIPBOARD) !is 0 && activePrimaryClipboard is owner) {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
75 OS.gtk_clipboard_clear(Clipboard.GTKPRIMARYCLIPBOARD);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
76 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
77 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
78
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
79 private static extern(C) void clearFuncFunc(GtkClipboard *clipboard, void* user_data_or_owner){
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
80 auto obj = cast(ClipboardProxy)user_data_or_owner;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
81 obj.clearFunc( clipboard );
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
82 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
83 void clearFunc(GtkClipboard *clipboard ){
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
84 if (clipboard is Clipboard.GTKCLIPBOARD) {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
85 activeClipboard = null;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
86 clipboardData = null;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
87 clipboardDataTypes = null;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
88 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
89 if (clipboard is Clipboard.GTKPRIMARYCLIPBOARD) {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
90 activePrimaryClipboard = null;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
91 primaryClipboardData = null;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
92 primaryClipboardDataTypes = null;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
93 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
94 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
95
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
96 void dispose () {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
97 if (display is null) return;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
98 if (activeClipboard !is null) OS.gtk_clipboard_clear(Clipboard.GTKCLIPBOARD);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
99 if (activePrimaryClipboard !is null) OS.gtk_clipboard_clear(Clipboard.GTKPRIMARYCLIPBOARD);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
100 display = null;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
101 clipboardData = null;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
102 clipboardDataTypes = null;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
103 primaryClipboardData = null;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
104 primaryClipboardDataTypes = null;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
105 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
106
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
107 private static extern(C) void getFuncFunc(
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
108 GtkClipboard *clipboard,
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
109 GtkSelectionData *selection_data,
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
110 uint info,
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
111 void* user_data_or_owner)
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
112 {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
113 auto obj = cast(ClipboardProxy)user_data_or_owner;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
114 obj.getFunc( clipboard, selection_data, info );
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
115 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
116 /**
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
117 * This function provides the data to the clipboard on request.
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
118 * When this clipboard is disposed, the data will no longer be available.
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
119 */
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
120 void getFunc(
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
121 GtkClipboard *clipboard,
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
122 GtkSelectionData *selectionData,
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
123 uint info)
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
124 {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
125 if (selectionData is null) return 0;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
126 TransferData tdata = new TransferData();
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
127 tdata.type = selectionData.target;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
128 Transfer[] types = (clipboard is Clipboard.GTKCLIPBOARD) ? clipboardDataTypes : primaryClipboardDataTypes;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
129 int index = -1;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
130 for (int i = 0; i < types.length; i++) {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
131 if (types[i].isSupportedType(tdata)) {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
132 index = i;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
133 break;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
134 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
135 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
136 if (index is -1) return 0;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
137 Object[] data = (clipboard is Clipboard.GTKCLIPBOARD) ? clipboardData : primaryClipboardData;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
138 types[index].javaToNative(data[index], tdata);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
139 if (tdata.format < 8 || tdata.format % 8 !is 0) {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
140 return 0;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
141 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
142 OS.gtk_selection_data_set(selectionData, tdata.type, tdata.format, tdata.pValue, tdata.length);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
143 OS.g_free(tdata.pValue);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
144 return 1;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
145 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
146
240
ce446666f5a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 238
diff changeset
147 bool setData(Clipboard owner, Object[] data, Transfer[] dataTypes, int clipboards) {
92
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
148 GtkTargetEntry*[] entries;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
149 GtkTargetEntry* pTargetsList;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
150 try {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
151 for (int i = 0; i < dataTypes.length; i++) {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
152 Transfer transfer = dataTypes[i];
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
153 int[] typeIds = transfer.getTypeIds();
238
380bad9f6852 reverted char[] to String
Frank Benoit <benoit@tionex.de>
parents: 169
diff changeset
154 String[] typeNames = transfer.getTypeNames();
92
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
155 for (int j = 0; j < typeIds.length; j++) {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
156 GtkTargetEntry* entry = new GtkTargetEntry();
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
157 entry.info = typeIds[j];
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
158 char* pName = cast(char*)OS.g_malloc(typeNames[j].length+1);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
159 pName[ 0 .. typeNames[j].length ] = typeNames[j];
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
160 pName[ typeNames[j].length ] = '\0';
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
161 entry.target = pName;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
162 GtkTargetEntry*[] tmp = new GtkTargetEntry*[entries.length + 1];
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
163 SimpleType!(GtkTargetEntry*).arraycopy(entries, 0, tmp, 0, entries.length);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
164 tmp[entries.length] = entry;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
165 entries = tmp;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
166 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
167 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
168
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
169 pTargetsList = cast(GtkTargetEntry*)OS.g_malloc(GtkTargetEntry.sizeof * entries.length);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
170 int offset = 0;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
171 for (int i = 0; i < entries.length; i++) {
169
bbd04636536f Fix: ticket 4, thanks nascent for reporting
Frank Benoit <benoit@tionex.de>
parents: 124
diff changeset
172 tango.stdc.string.memmove(pTargetsList + i, entries[i], GtkTargetEntry.sizeof);
92
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
173 offset += GtkTargetEntry.sizeof;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
174 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
175 if ((clipboards & DND.CLIPBOARD) !is 0) {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
176 if (activeClipboard !is null) OS.gtk_clipboard_clear(Clipboard.GTKCLIPBOARD);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
177 clipboardData = data;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
178 clipboardDataTypes = dataTypes;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
179 if (!OS.gtk_clipboard_set_with_data(Clipboard.GTKCLIPBOARD, pTargetsList, entries.length, &getFuncFunc, &clearFuncFunc, cast(void*)this )) {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
180 return false;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
181 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
182 activeClipboard = owner;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
183 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
184 if ((clipboards & DND.SELECTION_CLIPBOARD) !is 0) {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
185 if (activePrimaryClipboard !is null) OS.gtk_clipboard_clear(Clipboard.GTKPRIMARYCLIPBOARD);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
186 primaryClipboardData = data;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
187 primaryClipboardDataTypes = dataTypes;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
188 if (!OS.gtk_clipboard_set_with_data(Clipboard.GTKPRIMARYCLIPBOARD, pTargetsList, entries.length, &getFuncFunc, &clearFuncFunc, cast(void*)this )) {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
189 return false;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
190 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
191 activePrimaryClipboard = owner;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
192 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
193 return true;
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
194 } finally {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
195 for (int i = 0; i < entries.length; i++) {
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
196 GtkTargetEntry* entry = entries[i];
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
197 if( entry.target !is null) OS.g_free(entry.target);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
198 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
199 if (pTargetsList !is null) OS.g_free(pTargetsList);
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
200 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
201 }
ddb19cb18d2e package dnd
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
202 }