[Mono-list] Some questions about clipboards and gtk-sharp
Philip Van Hoof
spamfrommailing@freax.org
08 Jun 2003 14:00:54 +0200
Hi there,
I want to implement a method that will collect all targets of the
current clipboard .. so far I have this (see below). I have ported it
from plain C to C# and I know that in C it "does" work perfectly.
The issues that I have are ..
* targets = clipboard.WaitForContents (Atom.Intern ("TARGETS", false))
does not work at all.
clipboard is instantiated with Clipboard.Get(Atom.Clipboard("CLIPBOARD",
false)).
This method of clipboard will always return targets.length = -1.
Nomatter which selection I choose (PRIMARY, CLIPBOARD or SECONDARY) and
nomatter how much data is currently to be converted to the requested
target by the clipboardowner. I've tried "COMPOUND_TEXT", "TARGETS",
"TEXT", "text/html", ... as the target Atom of WaitForContents().
Short: It just does not work "at all". Nothing worked not one try ..
* I cannot know the size of a Gdk.Atom and I assume that the
targets.Data that I will receive (in case WaitForContents would work)
will not contain an array of Gdk.Atom's but in stead an array of xlib
Atom's right? I got this working in C by casting the received data to a
pointer of GdkAtom's and then I looped for i to the length of the
GtkSelectionData. I cannot do this cast in C# (it looks like it's just
impossible: getting errors about unmanaged types; invalid casts;
blabla).
In C#'s case I don't know if targets.length is the size of targets.Data
or if it's the value which X passed ? (So is this converted to the
amount of Bytes that have been received or does the C# API just copied
the value from the Gtk+ API to the SelectionData.length ?).
And .. How do I know what the size of a Atom is :)? In C I could do
sizeof(GdkAtom) but in C# sizeof(Gdk.Atom) gives me a compiler error
explaining me that I cannot request the size of an unmanaged type. So I
made a small C application to get the size and I am now using that value
(4 bytes). I wonder if stuff like this could get in or already is
available in the gtk-sharp-glue library?
if a SelectionData.length is -1 and you want the property
SelectionData.Data then it will throw a very wierd exception which won't
explain the programmer what the heck is wrong. I had to dig gtk-sharp
sources to get a very vague idea of what "could" be wrong.
So what I had to do ... to get this managed and working in C#, I guess
is ...
I have to receive the four bytes; I put those in an array of four bytes
and then I cast that array using
raw = GtkSharp.ManagedValue.WrapObject(my_four_bytes);
and then of course I want to get the contents for that atom :
Gtk.SelectionData data =
this.clipboard.WaitForContents (new Atom (raw));
Ick.. I am really really not sure how much of all this will actually
work :)
So the question is .. ehm.. well.. wtf? :) I don't know how people are
going to use Gtk-Sharp if issues like this cannot and will never
work...so I hope for a clean solution (in the Gtk-Sharp API) or .. how
should I actually get this working using the current API ?
Please do not start thinking that I now hate Gtk-Sharp .. it's just that
the GtkClipboard, GtkSelection and GtkAtom wrappings really REALLY
dissapoint me a lot...I will not belive you if you tell me that one will
find it more easy to implement a Clipboard in his or hers application
using Gtk-Sharp compared to C.
Do trust me when I say that MOST applications don't want to just put
some COMPOUND_TEXT on the clipboard .. most want to put very much
targets and want to get pretty complicated when it comes down to the
clipboard -see OpenOffice.org, Evolution, GNummeric, Mozilla, Mozilla
Composer-. We/You guys are building Gtk-Sharp because large applications
in C (or C++) are difficult to maintain. so ... it should be possible to
play a lot with that clipboard, right?
So until this GtkClipboard wrapping works .. I don't belive that any
major desktop application will get working if it uses gtk-sharp.
Of course I am interested in helping with fixing the gtk-sharp
wrappings.. So is, at this moment, somebody maintaining gtk-sharp?
So.. this is what I've been trying :
public override void CollectCurrent ()
{
// Gtk-Sharp TODO : This does not work !
SelectionData targets = clipboard.WaitForContents
(ClipboardManager.TARGETS);
if (
((targets.type == ClipboardManager.ATOM) ||
(targets.type == ClipboardManager.TARGETS)) &&
(targets.length > -1)
) unsafe {
ClipboardItem item = new ClipboardItem();
item.Compressed = false;
item.Targets = new SelectionDataCollection();
// Gtk-Sharp TODO : This does not work !
byte[] atoms_targets = targets.Data;
// #include <gdk/gdk.h>
// int main() { printf("%d", sizeof(GdkAtom)); }
// Will return 4. So we will be receiving 4 bytes
// which will contain the raw data of our Atom
// TODO: Make a small C library-function that will return
// sizeof(GdkAtom) or add something like that to
// Gtk-Sharp(-glue)
int sizeof_atom=4;
for(int counter = 0; counter < targets.length; counter+=sizeof_atom)
{
byte[] atom_target = new byte[sizeof_atom];
for (int b=0; b<sizeof_atom; b++)
atom_target[b] = atoms_targets[counter+b];
// TODO: I am not sure if this will work at all
IntPtr raw = ManagedValue.WrapObject(atom_target);
Gtk.SelectionData data =
this.clipboard.WaitForContents (new Atom (raw));
item.Targets.Add(data);
}
this.items.Add(item);
this.Claim(item);
} else {
Console.WriteLine("GCM WARNING: Not TARGETS target");
}
}
--
Philip Van Hoof, Software Developer @ Cronos
home: me at freax dot org
work: Philip dot VanHoof at cronos dot be
http://www.freax.be, http://www.freax.eu.org