2009-04-21 Christian Hoff <christian_hoff@gmx.net>

* gtk/Widget.custom: Deglued implementation of StyleGetProperty.

svn path=/trunk/gtk-sharp/; revision=132224
This commit is contained in:
Christian Hoff 2009-04-21 08:11:35 +00:00
parent a63841988e
commit 37c1f46d17
4 changed files with 34 additions and 35 deletions

View file

@ -1,3 +1,7 @@
2009-04-21 Christian Hoff <christian_hoff@gmx.net>
* gtk/Widget.custom: Deglued implementation of StyleGetProperty.
2009-04-16 Christian Hoff <christian_hoff@gmx.net> 2009-04-16 Christian Hoff <christian_hoff@gmx.net>
* glib/Value.cs: Support for additional fundamental GTypes. Invoke * glib/Value.cs: Support for additional fundamental GTypes. Invoke

View file

@ -30,7 +30,7 @@ namespace GLib {
Writable = 1 << 1, Writable = 1 << 1,
} }
internal class ParamSpec { public class ParamSpec {
IntPtr handle; IntPtr handle;

View file

@ -329,31 +329,39 @@ static void ClassInit (GLib.GType gtype, Type t)
GLib.Marshaller.Free (signame); GLib.Marshaller.Free (signame);
} }
[DllImport("gtksharpglue-2")] public object StyleGetProperty (string property_name)
static extern bool gtksharp_widget_style_get_property (IntPtr widget, IntPtr property, ref GLib.Value value); {
GLib.Value value;
public object StyleGetProperty (string property_name) { try {
GLib.Value value = new GLib.Value (); value = StyleGetPropertyValue (property_name);
IntPtr name = GLib.Marshaller.StringToPtrGStrdup (property_name); } catch (ArgumentException) {
bool success = gtksharp_widget_style_get_property (Handle, name, ref value); return null;
GLib.Marshaller.Free (name); }
if(success) {
object ret = value.Val; object ret = value.Val;
value.Dispose (); value.Dispose ();
return ret; return ret;
} }
return null; [DllImport("libgtk-win32-2.0-0.dll")]
} static extern IntPtr gtk_widget_class_find_style_property (IntPtr class_ptr, IntPtr property_name);
internal GLib.Value StyleGetPropertyValue (string property_name) { [DllImport("libgtk-win32-2.0-0.dll")]
GLib.Value value = new GLib.Value (); static extern IntPtr gtk_widget_style_get_property (IntPtr inst, IntPtr property_name, ref GLib.Value value);
IntPtr name = GLib.Marshaller.StringToPtrGStrdup (property_name); internal GLib.Value StyleGetPropertyValue (string property_name)
gtksharp_widget_style_get_property (Handle, name, ref value); {
GLib.Marshaller.Free (name); IntPtr native_name = GLib.Marshaller.StringToPtrGStrdup (property_name);
try {
IntPtr pspec_ptr = gtk_widget_class_find_style_property (this.LookupGType ().ClassPtr, native_name);
if (pspec_ptr == IntPtr.Zero)
throw new ArgumentException (String.Format ("Cannot find style property \"{0}\"", property_name));
GLib.Value value = new GLib.Value ((new GLib.ParamSpec (pspec_ptr)).ValueType);
gtk_widget_style_get_property (Handle, native_name, ref value);
return value; return value;
} finally {
GLib.Marshaller.Free (native_name);
}
} }
[DllImport("libgtk-win32-2.0-0.dll")] [DllImport("libgtk-win32-2.0-0.dll")]

View file

@ -40,7 +40,6 @@ void gtksharp_gtk_widget_set_flags (GtkWidget *widget, int flags);
int gtksharp_gtk_widget_style_get_int (GtkWidget *widget, const char *name); int gtksharp_gtk_widget_style_get_int (GtkWidget *widget, const char *name);
void gtksharp_widget_add_binding_signal (GType gtype, const char *sig_name, GCallback cb); void gtksharp_widget_add_binding_signal (GType gtype, const char *sig_name, GCallback cb);
void gtksharp_widget_register_binding (GType gtype, const char *sig_name, guint key, int mod, gpointer data); void gtksharp_widget_register_binding (GType gtype, const char *sig_name, guint key, int mod, gpointer data);
gboolean gtksharp_widget_style_get_property (GtkWidget *widget, const gchar* property, GValue *value);
/* */ /* */
GdkRectangle* GdkRectangle*
@ -170,15 +169,3 @@ gtksharp_widget_register_binding (GType gtype, const gchar *signame, guint key,
GtkBindingSet *set = gtk_binding_set_by_class (klass); GtkBindingSet *set = gtk_binding_set_by_class (klass);
gtk_binding_entry_add_signal (set, key, mod, signame, 1, G_TYPE_LONG, data); gtk_binding_entry_add_signal (set, key, mod, signame, 1, G_TYPE_LONG, data);
} }
gboolean
gtksharp_widget_style_get_property (GtkWidget *widget, const gchar* property, GValue *value)
{
GParamSpec *spec = gtk_widget_class_find_style_property (GTK_WIDGET_GET_CLASS (widget), property);
if (spec == NULL)
return FALSE;
g_value_init (value, spec->value_type);
gtk_widget_style_get_property (widget, property, value);
return TRUE;
}