[Gtk-sharp-list] Re: ButtonPressEvent in 0.15
Tiago Lima
tiago.lima@vianw.pt
Fri, 16 Jan 2004 10:17:09 +0000
Ok, it works fine. Thanks !
Tiago Lima
On Friday 16 January 2004 09:07, Ecmel Ercan wrote:
> >> I am developing an application and now I can't do context menus :(
> >>
> >> Please help,
>
> Hi,
>
> I made a workaround using 0.15 hope helps:
>
> using System;
> using System.Collections;
> using Gtk;
> using GtkSharp;
> using System.Runtime.InteropServices;
>
> public class ProjectTree : TreeView
> {
> static GLib.GType gtype = GLib.GType.Invalid;
> public static new GLib.GType GType {
> get
> {
> if (gtype == GLib.GType.Invalid)
> gtype = RegisterGType (typeof (ProjectTree));
> return gtype;
> }
> }
>
> public ProjectTree () : base (GType)
> {
>
> }
>
> /* This segfaults
> protected override bool OnButtonPressEvent (ref Gdk.EventButton evnt)
> {
> Console.WriteLine ("Hello");
> base.OnButtonPressEvent (ref evnt);
> return false;
> }
> */
>
> //
> // CONNECT_AFTER WORKAROUND
> // This Works
>
> private Hashtable Signals = new Hashtable();
>
> [GLib.Signal("button_press_event")]
> public new event ButtonPressEventHandler ButtonPressEvent
> {
> add
> {
> if (EventList["button_press_event"] == null)
> Signals["button_press_event"] = new
> boolObjectEventButtonSignal(this, Handle, "button_press_event", value,
> System.Type.GetType("GtkSharp.ButtonPressEventArgs,gtk-sharp")); else
> ((GtkSharp.SignalCallback) Signals
> ["button_press_event"]).AddDelegate (value);
>
> EventList.AddHandler("button_press_event", value);
> }
> remove
> {
> EventList.RemoveHandler("button_press_event", value);
> GtkSharp.SignalCallback cb = Signals ["button_press_event"] as
> GtkSharp.SignalCallback; if (cb == null)
> return;
>
> cb.RemoveDelegate (value);
>
> if (EventList["button_press_event"] == null)
> {
> Signals.Remove("button_press_event");
> cb.Dispose ();
> }
> }
> }
>
> private delegate bool boolObjectEventButtonDelegate(IntPtr arg0, ref
> Gdk.EventButton arg1, int key);
>
> private class boolObjectEventButtonSignal : SignalCallback
> {
> private static boolObjectEventButtonDelegate _Delegate;
>
> private IntPtr _raw;
> private uint _HandlerID;
>
> private static bool boolObjectEventButtonCallback(IntPtr arg0, ref
> Gdk.EventButton arg1, int key) {
> if (!_Instances.Contains(key))
> throw new Exception("Unexpected signal key " + key);
>
> boolObjectEventButtonSignal inst =
> (boolObjectEventButtonSignal) _Instances[key]; SignalArgs args =
> (SignalArgs) Activator.CreateInstance (inst._argstype); args.Args = new
> object[1];
> args.Args[0] = arg1;
> object[] argv = new object[2];
> argv[0] = inst._obj;
> argv[1] = args;
> inst._handler.DynamicInvoke(argv);
> if (args.RetVal == null)
> return false;
> return (bool) ((bool)args.RetVal);
> }
>
> [DllImport("libgobject-2.0-0.dll")]
> static extern uint g_signal_connect_data(IntPtr obj, String name,
> boolObjectEventButtonDelegate cb, int key, IntPtr p, int flags);
>
> public boolObjectEventButtonSignal(GLib.Object obj, IntPtr raw,
> String name, Delegate eh, Type argstype) : base(obj, eh, argstype) {
> if (_Delegate == null)
> {
> _Delegate = new
> boolObjectEventButtonDelegate(boolObjectEventButtonCallback); }
> _raw = raw;
> _HandlerID = g_signal_connect_data(raw, name, _Delegate, _key,
> new IntPtr(0), 0); }
>
> [DllImport("libgobject-2.0-0.dll")]
> static extern void g_signal_handler_disconnect (IntPtr instance,
> uint handler);
>
> [DllImport("libgobject-2.0-0.dll")]
> static extern bool g_signal_handler_is_connected (IntPtr instance,
> uint handler);
>
> protected override void Dispose (bool disposing)
> {
> _Instances.Remove(_key);
> if(_Instances.Count == 0)
> _Delegate = null;
>
> if (g_signal_handler_is_connected (_raw, _HandlerID))
> g_signal_handler_disconnect (_raw, _HandlerID);
> base.Dispose (disposing);
> }
> }
>
> }
>
>
>
>
>
> _______________________________________________
> Gtk-sharp-list maillist - Gtk-sharp-list@lists.ximian.com
> http://lists.ximian.com/mailman/listinfo/gtk-sharp-list