[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