📄 gtk-signal-marshallers.html
字号:
<HTML><HEAD><TITLE>Signal Marshallers</TITLE><METANAME="GENERATOR"CONTENT="Modular DocBook HTML Stylesheet Version 1.61"><LINKREL="HOME"TITLE="GTK+ Reference Manual"HREF="index.html"><LINKREL="UP"TITLE="GTK+ "HREF="gtk.html"><LINKREL="PREVIOUS"TITLE="Signals"HREF="gtk-signals.html"><LINKREL="NEXT"TITLE="Implementation of Object Properties"HREF="gtk-object-properties.html"></HEAD><BODYCLASS="REFENTRY"BGCOLOR="#FFFFFF"TEXT="#000000"LINK="#0000FF"VLINK="#840084"ALINK="#0000FF"><DIVCLASS="NAVHEADER"><TABLEWIDTH="100%"BORDER="0"BGCOLOR="#000000"CELLPADDING="1"CELLSPACING="0"><TR><THCOLSPAN="4"ALIGN="center"><FONTCOLOR="#FFFFFF"SIZE="5">GTK+ Reference Manual</FONT></TH></TR><TR><TDWIDTH="25%"BGCOLOR="#C00000"ALIGN="left"><AHREF="gtk-signals.html"><FONTCOLOR="#FFFFFF"SIZE="3"><B><<< Previous Page</B></FONT></A></TD><TDWIDTH="25%"BGCOLOR="#0000C0"ALIGN="center"><FONTCOLOR="#FFFFFF"SIZE="3"><B><AHREF="index.html"><FONTCOLOR="#FFFFFF"SIZE="3"><B>Home</B></FONT></A></B></FONT></TD><TDWIDTH="25%"BGCOLOR="#00C000"ALIGN="center"><FONTCOLOR="#FFFFFF"SIZE="3"><B><AHREF="gtk.html"><FONTCOLOR="#FFFFFF"SIZE="3"><B>Up</B></FONT></A></B></FONT></TD><TDWIDTH="25%"BGCOLOR="#C00000"ALIGN="right"><AHREF="gtk-object-properties.html"><FONTCOLOR="#FFFFFF"SIZE="3"><B>Next Page >>></B></FONT></A></TD></TR></TABLE></DIV><H1><ANAME="GTK-SIGNAL-MARSHALLERS">Signal Marshallers</A></H1><DIVCLASS="REFNAMEDIV"><ANAME="AEN9134"></A><H2>Name</H2>Signal Marshallers -- Functions to adapt C structures to native calling convention.</DIV><DIVCLASS="REFSYNOPSISDIV"><ANAME="AEN9137"></A><H2>Synopsis</H2><TABLEBORDER="0"BGCOLOR="#D6E8FF"WIDTH="100%"CELLPADDING="6"><TR><TD><PRECLASS="SYNOPSIS"> #include <gtk/gtk.h>#define <AHREF="gtk-signal-marshallers.html#GTK-SIGNAL-DEFAULT-MARSHALLER">gtk_signal_default_marshaller</A> </PRE></TD></TR></TABLE></DIV><DIVCLASS="REFSECT1"><ANAME="AEN9141"></A><H2>Description</H2><DIVCLASS="REFSECT2"><ANAME="AEN9143"></A><H3>What are Signal Marshallers?</H3><P>Marshals are functions which all have the same prototype:they take a <AHREF="gtkobject.html">GtkObject</A>, a <AHREF="gtk-types.html#GTKSIGNALFUNC">GtkSignalFunc</A>, a <AHREF=../glib/glib-basic-types.html#GPOINTER>gpointer</A>,and an array of argument values.The functions are names gtk_marshall_RETURNTYPE__PARAMTYPE1_PARAMTYPE2....</P><P>They then call a native function: the GtkObject is the firstparameter passed in. The arguments are passed in the nativecalling convention: chars, shorts, ints, longs may be packedon the stack, or tucked in registers: it doesn't matterbecause the same calling convention will be generatedinside the gtkmarshal code as is expected where you defineyour handlers.</P><P>So the function named:<TABLEBORDER="0"BGCOLOR="#D6E8FF"WIDTH="100%"CELLPADDING="6"><TR><TD><PRECLASS="PROGRAMLISTING">gtk_marshal_BOOL__POINTER_INT_INT_UINT(GtkObject*, GtkSignalFunc, gpointer, GtkArg*);</PRE></TD></TR></TABLE>will call the <AHREF="gtk-types.html#GTKSIGNALFUNC">GtkSignalFunc</A> assuming it was a function with signature:<TABLEBORDER="0"BGCOLOR="#D6E8FF"WIDTH="100%"CELLPADDING="6"><TR><TD><PRECLASS="PROGRAMLISTING">gboolean sigfunc(gpointer,gint,gint,guint);</PRE></TD></TR></TABLE></P></DIV><HR><DIVCLASS="REFSECT2"><ANAME="AEN9154"></A><H3>Writing Custom Marshals</H3><P>Marshals are primarily used as arguments to <AHREF="gtk-signals.html#GTK-SIGNAL-NEW">gtk_signal_new</A>().Sometimes, you may find that a marshaller you need isn't availablein the standard list. Then you have to write your own.</P><P>If you wish to define a signal with a new type of argument list.Suppose you want 2 pointers and 2 integers.You would write:<TABLEBORDER="0"BGCOLOR="#D6E8FF"WIDTH="100%"CELLPADDING="6"><TR><TD><PRECLASS="PROGRAMLISTING">typedef int (*GtkSignal_INT__POINTER_POINTER_INT_INT)( gpointer, gpointer, gint, gint);void marshal_INT__POINTER_POINTER_INT_INT(GtkObject* object, GtkSignalFunc func, gpointer func_data, GtkArg* args){ GtkSignal_NONE__POINTER_POINTER_INT_INT rfunc; gint* return_val; return_val = GTK_RETLOC_INT(args[4]); rfunc = (GtkSignal_INT__POINTER_POINTER_INT_INT)func; *return_val = (*rfunc)(object, GTK_VALUE_POINTER(args[0]), GTK_VALUE_POINTER(args[1]), GTK_VALUE_INT(args[2]), GTK_VALUE_INT(args[3]), func_data);}</PRE></TD></TR></TABLE></P></DIV></DIV><DIVCLASS="REFSECT1"><ANAME="AEN9160"></A><H2>Details</H2><DIVCLASS="REFSECT2"><ANAME="AEN9162"></A><H3><ANAME="GTK-SIGNAL-DEFAULT-MARSHALLER"></A>gtk_signal_default_marshaller</H3><TABLEBORDER="0"BGCOLOR="#D6E8FF"WIDTH="100%"CELLPADDING="6"><TR><TD><PRECLASS="PROGRAMLISTING">#define gtk_signal_default_marshaller gtk_marshal_NONE__NONE</PRE></TD></TR></TABLE><P>A marshaller that returns void and takes no extra parameters.</P></DIV></DIV><DIVCLASS="REFSECT1"><ANAME="AEN9167"></A><H2>See Also</H2><P><P></P><DIVCLASS="VARIABLELIST"><DL><DT>GtkSignal</DT><DD><P>The signal handling functions (of which marshallers are really an implementation detail).</P></DD></DL></DIV></P></DIV><DIVCLASS="NAVFOOTER"><BRCLEAR="all"><BR><TABLEWIDTH="100%"BORDER="0"BGCOLOR="#000000"CELLPADDING="1"CELLSPACING="0"><TR><TDWIDTH="25%"BGCOLOR="#C00000"ALIGN="left"><AHREF="gtk-signals.html"><FONTCOLOR="#FFFFFF"SIZE="3"><B><<< Previous Page</B></FONT></A></TD><TDWIDTH="25%"BGCOLOR="#0000C0"ALIGN="center"><FONTCOLOR="#FFFFFF"SIZE="3"><B><AHREF="index.html"><FONTCOLOR="#FFFFFF"SIZE="3"><B>Home</B></FONT></A></B></FONT></TD><TDWIDTH="25%"BGCOLOR="#00C000"ALIGN="center"><FONTCOLOR="#FFFFFF"SIZE="3"><B><AHREF="gtk.html"><FONTCOLOR="#FFFFFF"SIZE="3"><B>Up</B></FONT></A></B></FONT></TD><TDWIDTH="25%"BGCOLOR="#C00000"ALIGN="right"><AHREF="gtk-object-properties.html"><FONTCOLOR="#FFFFFF"SIZE="3"><B>Next Page >>></B></FONT></A></TD></TR><TR><TDCOLSPAN="2"ALIGN="left"><FONTCOLOR="#FFFFFF"SIZE="3"><B>Signals</B></FONT></TD><TDCOLSPAN="2"ALIGN="right"><FONTCOLOR="#FFFFFF"SIZE="3"><B>Implementation of Object Properties</B></FONT></TD></TR></TABLE></DIV></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -