[gstreamermm] Added multifdsink plug-in.
- From: José Alburquerque <jaalburqu src gnome org>
- To: svn-commits-list gnome org
- Subject: [gstreamermm] Added multifdsink plug-in.
- Date: Tue, 30 Jun 2009 04:24:47 +0000 (UTC)
commit f9273ab523a24fec9acb91cd6eda4ce50bccc93d
Author: José Alburquerque <jaalburqu svn gnome org>
Date: Tue Jun 30 00:23:51 2009 -0400
Added multifdsink plug-in.
ChangeLog | 17 +++
configure.ac | 3 +-
gstreamer/src/Makefile_list_of_hg.am_fragment | 2 +-
gstreamer/src/enums.hg | 9 +-
gstreamer/src/gst_enums.defs | 25 ++++
gstreamer/src/gst_enums.defs.patch | 57 ++++++----
.../extra_defs_gen/generate_plugin_gmmproc_file.cc | 120 ++++++++++++++++++--
tools/m4/plugingen_base.m4 | 60 +++++++++-
8 files changed, 247 insertions(+), 46 deletions(-)
---
diff --git a/ChangeLog b/ChangeLog
index 481ae1e..b59e542 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,20 @@
+2009-06-30 José Alburquerque <jaalburqu svn gnome org>
+
+ * configure.ac:
+ * gstreamer/src/Makefile_list_of_hg.am_fragment: Added multifdsink
+ plug-in.
+ * gstreamer/src/gst_enums.defs:
+ * gstreamer/src/gst_enums.defs.patch: Fixed patch to include
+ handwritten enum for multifdsink plugin.
+
+ * tools/m4/plugingen_base.m4: Added and Modified macros to enable the
+ plug-in generator to generate enum code for plug-in enums used in
+ signals.
+ * tools/extra_defs_gen/generate_plugin_gmmproc_file.cc: Modified
+ plug-in generator to generate enum code for enum specific plug-ins.
+ * gstreamer/src/enums.hg: Corrected comments about plug-in specific
+ enums used in signals not being able to be generated.
+
2009-06-29 José Alburquerque <jaalburqu svn gnome org>
* configure.ac:
diff --git a/configure.ac b/configure.ac
index 57ae40b..c3b2345 100644
--- a/configure.ac
+++ b/configure.ac
@@ -195,7 +195,8 @@ cdparanoiasrc=CdParanoiaSrc clockoverlay=ClockOverlay decodebin=DecodeBin \
decodebin2=DecodeBin2 \
ffmpegcolorspace=FfmpegColorSpace gdpdepay=GDPDepay gdppay=GDPPay \
giosink=GioSink giosrc=GioSrc giostreamsink=GioStreamSink \
-giostreamsrc=GioStreamSrc oggdemux=OggDemux oggmux=OggMux \
+giostreamsrc=GioStreamSrc multifdsink=MultiFdSink oggdemux=OggDemux \
+oggmux=OggMux \
playbin=PlayBin playbin2=PlayBin2 \
tcpclientsink=TCPClientSink tcpclientsrc=TCPClientSrc \
tcpserversrc=TCPServerSrc \
diff --git a/gstreamer/src/Makefile_list_of_hg.am_fragment b/gstreamer/src/Makefile_list_of_hg.am_fragment
index ad1ee27..e29e011 100644
--- a/gstreamer/src/Makefile_list_of_hg.am_fragment
+++ b/gstreamer/src/Makefile_list_of_hg.am_fragment
@@ -40,7 +40,7 @@ files_all_plugin_hg = capsfilter.hg fakesink.hg fakesrc.hg fdsink.hg fdsrc.hg \
cdparanoiasrc.hg clockoverlay.hg decodebin.hg decodebin2.hg \
ffmpegcolorspace.hg gdpdepay.hg gdppay.hg giosink.hg \
giosrc.hg giostreamsink.hg giostreamsrc.hg \
- oggdemux.hg oggmux.hg playbin.hg playbin2.hg \
+ multifdsink.hg oggdemux.hg oggmux.hg playbin.hg playbin2.hg \
tcpclientsink.hg tcpclientsrc.hg tcpserversrc.hg \
textoverlay.hg textrender.hg theoradec.hg theoraenc.hg \
timeoverlay.hg videorate.hg videoscale.hg \
diff --git a/gstreamer/src/enums.hg b/gstreamer/src/enums.hg
index 487363a..3bf2a4a 100644
--- a/gstreamer/src/enums.hg
+++ b/gstreamer/src/enums.hg
@@ -22,8 +22,9 @@
_DEFS(gstreamermm,gst)
-// Plug-in C enums used in the plug-in signals need to be handwritten. This
-// one is used in the "autoplug-select" signal of the decodebin2 plug-in:
+// Plug-in C enums used in the plug-in signals that are shared need to be
+// declared. This one is is shared between decodebin2 and uridecodebin so it
+// is difficult for it to be generated.
enum GstAutoplugSelectResult
{
GST_AUTOPLUG_SELECT_TRY,
@@ -37,8 +38,8 @@ namespace Gst
_WRAP_ENUM(MiniObjectFlags, GstMiniObjectFlags)
_WRAP_ENUM(State, GstState)
-// Plug-in non-genereated enums (some are shared, others are used in plug-in
-// signals and there's no way of knowing whether to generate them or not):
+// Plug-in non-genereated enums. Handled manually (and not generated because
+// they are shared by more than one plug-in):
_WRAP_ENUM(AutoplugSelectResult, GstAutoplugSelectResult)
_WRAP_ENUM(TCPProtocol, GstTCPProtocol)
diff --git a/gstreamer/src/gst_enums.defs b/gstreamer/src/gst_enums.defs
index 77204cc..7c307b6 100644
--- a/gstreamer/src/gst_enums.defs
+++ b/gstreamer/src/gst_enums.defs
@@ -35,6 +35,18 @@
)
)
+;; From /usr/src/jhbuild-sources/gstreamer/gst/gstbufferlist.h
+
+(define-enum-extended BufferListItem
+ (in-module "Gst")
+ (c-name "GstBufferListItem")
+ (values
+ '("continue" "GST_BUFFER_LIST_CONTINUE" "0")
+ '("skip-group" "GST_BUFFER_LIST_SKIP_GROUP" "1")
+ '("end" "GST_BUFFER_LIST_END" "2")
+ )
+)
+
;; From /usr/src/jhbuild-sources/gstreamer/gst/gstbus.h
(define-enum-extended BusFlags
@@ -1660,6 +1672,7 @@
'("x-receding-playlistchange" "GST_RTSP_HDR_X_RECEDING_PLAYLISTCHANGE" "72")
'("x-rtp-info" "GST_RTSP_HDR_X_RTP_INFO" "73")
'("x-startupprofile" "GST_RTSP_HDR_X_STARTUPPROFILE" "74")
+ '("timestamp" "GST_RTSP_HDR_TIMESTAMP" "75")
)
)
@@ -1941,6 +1954,7 @@
'("pink-noise" "GST_AUDIO_TEST_SRC_WAVE_PINK_NOISE" "6")
'("sine-tab" "GST_AUDIO_TEST_SRC_WAVE_SINE_TAB" "7")
'("ticks" "GST_AUDIO_TEST_SRC_WAVE_TICKS" "8")
+ '("gaussian-white-noise" "GST_AUDIO_TEST_SRC_WAVE_GAUSSIAN_WHITE_NOISE" "9")
)
)
@@ -2344,3 +2358,14 @@
'("full" "GST_PARANOIA_MODE_FULL" "0xff")
)
)
+
+;; Handwritten for MultiFdSink plugin (taken from gstmultifdsink.c):
+(define-enum-extended FDSetMode
+ (in-module "Gst")
+ (c-name "GstFDSetMode")
+ (values
+ '("select" "GST_FD_SET_MODE_SELECT" "0")
+ '("poll" "GST_FD_SET_MODE_POLL" "1")
+ '("epoll" "GST_FD_SET_MODE_EPOLL" "2")
+ )
+)
diff --git a/gstreamer/src/gst_enums.defs.patch b/gstreamer/src/gst_enums.defs.patch
index 24d2989..9d5920a 100644
--- a/gstreamer/src/gst_enums.defs.patch
+++ b/gstreamer/src/gst_enums.defs.patch
@@ -1,5 +1,5 @@
---- gst_enums.defs.orig 2009-06-18 01:02:24.000000000 -0400
-+++ gst_enums.defs 2009-06-18 01:16:27.000000000 -0400
+--- gst_enums.defs 2009-06-30 00:09:54.000000000 -0400
++++ gst_enums.defs.new 2009-06-30 00:06:00.000000000 -0400
@@ -1,3 +1,5 @@
+;; Apply gst_enums.defs.patch after regenerating.
+
@@ -21,7 +21,7 @@
)
)
-@@ -33,6 +41,8 @@
+@@ -45,6 +53,8 @@
(in-module "Gst")
(c-name "GstBusFlags")
(values
@@ -30,7 +30,7 @@
)
)
-@@ -85,6 +95,13 @@
+@@ -97,6 +107,13 @@
(in-module "Gst")
(c-name "GstClockFlags")
(values
@@ -44,7 +44,7 @@
)
)
-@@ -126,10 +143,18 @@
+@@ -138,10 +155,18 @@
)
)
@@ -63,7 +63,7 @@
)
)
-@@ -137,6 +162,10 @@
+@@ -149,6 +174,10 @@
(in-module "Gst")
(c-name "GstElementFlags")
(values
@@ -74,7 +74,7 @@
)
)
-@@ -233,40 +262,6 @@
+@@ -245,40 +274,6 @@
)
)
@@ -115,7 +115,7 @@
(define-enum-extended SeekType
(in-module "Gst")
(c-name "GstSeekType")
-@@ -364,6 +359,9 @@
+@@ -376,6 +371,9 @@
(in-module "Gst")
(c-name "GstIndexFlags")
(values
@@ -125,7 +125,7 @@
)
)
-@@ -464,7 +462,7 @@
+@@ -476,7 +474,7 @@
'("async-done" "GST_MESSAGE_ASYNC_DONE" "1 << 21")
'("request-state" "GST_MESSAGE_REQUEST_STATE" "1 << 22")
'("step-start" "GST_MESSAGE_STEP_START" "1 << 23")
@@ -134,7 +134,7 @@
)
)
-@@ -571,6 +569,12 @@
+@@ -583,6 +581,12 @@
(in-module "Gst")
(c-name "GstPadFlags")
(values
@@ -147,7 +147,7 @@
)
)
-@@ -590,6 +594,8 @@
+@@ -602,6 +606,8 @@
(in-module "Gst")
(c-name "GstPadTemplateFlags")
(values
@@ -156,7 +156,7 @@
)
)
-@@ -982,13 +988,13 @@
+@@ -994,13 +1000,13 @@
(in-module "Gst")
(c-name "GstFakeSinkStateError")
(values
@@ -177,7 +177,7 @@
)
)
-@@ -998,14 +1004,14 @@
+@@ -1010,14 +1016,14 @@
(in-module "Gst")
(c-name "GstFakeSrcOutputType")
(values
@@ -200,7 +200,7 @@
)
)
-@@ -1013,8 +1019,8 @@
+@@ -1025,8 +1031,8 @@
(in-module "Gst")
(c-name "GstFakeSrcDataType")
(values
@@ -211,7 +211,7 @@
)
)
-@@ -1022,9 +1028,9 @@
+@@ -1034,9 +1040,9 @@
(in-module "Gst")
(c-name "GstFakeSrcSizeType")
(values
@@ -224,7 +224,7 @@
)
)
-@@ -1032,11 +1038,23 @@
+@@ -1044,11 +1050,23 @@
(in-module "Gst")
(c-name "GstFakeSrcFillType")
(values
@@ -253,7 +253,7 @@
)
)
-@@ -1051,6 +1069,16 @@
+@@ -1075,6 +1093,16 @@
)
)
@@ -270,7 +270,7 @@
;; From /usr/src/jhbuild-sources/gst-plugins-base/gst-libs/gst/audio/gstbaseaudiosink.h
(define-enum-extended BaseAudioSinkSlaveMethod
-@@ -1867,10 +1895,10 @@
+@@ -1892,10 +1920,10 @@
(in-module "Gst")
(c-name "GstAudioConvertDithering")
(values
@@ -285,7 +285,7 @@
)
)
-@@ -1878,11 +1906,11 @@
+@@ -1903,11 +1931,11 @@
(in-module "Gst")
(c-name "GstAudioConvertNoiseShaping")
(values
@@ -302,7 +302,7 @@
)
)
-@@ -2203,17 +2231,6 @@
+@@ -2229,17 +2257,6 @@
)
)
@@ -320,7 +320,7 @@
;; From /usr/src/jhbuild-sources/gst-plugins-base/ext/pango/gsttextoverlay.h
(define-enum-extended TextOverlayVAlign
-@@ -2241,9 +2258,9 @@
+@@ -2267,9 +2284,9 @@
(c-name "GstTextOverlayWrapMode")
(values
'("none" "GST_TEXT_OVERLAY_WRAP_MODE_NONE" "-1")
@@ -333,7 +333,7 @@
)
)
-@@ -2251,9 +2268,9 @@
+@@ -2277,9 +2294,9 @@
(in-module "Gst")
(c-name "GstTextOverlayLineAlign")
(values
@@ -346,7 +346,7 @@
)
)
-@@ -2283,21 +2300,35 @@
+@@ -2309,21 +2326,46 @@
(in-module "Gst")
(c-name "GstTextRenderLineAlign")
(values
@@ -390,3 +390,14 @@
+ '("full" "GST_PARANOIA_MODE_FULL" "0xff")
+ )
+)
++
++;; Handwritten for MultiFdSink plugin (taken from gstmultifdsink.c):
++(define-enum-extended FDSetMode
++ (in-module "Gst")
++ (c-name "GstFDSetMode")
++ (values
++ '("select" "GST_FD_SET_MODE_SELECT" "0")
++ '("poll" "GST_FD_SET_MODE_POLL" "1")
++ '("epoll" "GST_FD_SET_MODE_EPOLL" "2")
++ )
++)
diff --git a/tools/extra_defs_gen/generate_plugin_gmmproc_file.cc b/tools/extra_defs_gen/generate_plugin_gmmproc_file.cc
index a5567e9..3a8d51d 100644
--- a/tools/extra_defs_gen/generate_plugin_gmmproc_file.cc
+++ b/tools/extra_defs_gen/generate_plugin_gmmproc_file.cc
@@ -22,6 +22,7 @@
#include <gst/gst.h>
#include <glibmm.h>
#include <iostream>
+#include <sstream>
static gchar* nmspace = 0;
static gchar* defsFile = 0;
@@ -180,10 +181,11 @@ Glib::ustring get_property_wrap_statements(Glib::ustring& includeMacroCalls,
if((G_TYPE_IS_ENUM(propertyGType) || G_TYPE_IS_FLAGS(propertyGType)))
{
+ Glib::ustring enumPrefix = propertyCType.substr(0, 3);
Glib::ustring propertyCppType = propertyCType.substr(3);
- enumWrapStatements += "_WRAP_PLUGIN_ENUM(" + propertyCppType +
- ", " + propertyCType + ")\n";
+ enumWrapStatements += "_WRAP_PLUGIN_ENUM(" + enumPrefix + "," +
+ propertyCppType + ")";
Glib::ustring enumGetTypeFunctionName =
get_cast_macro(propertyCType).lowercase() + "_get_type";
@@ -222,8 +224,56 @@ Glib::ustring get_method_name(const Glib::ustring& signalName)
return result;
}
+Glib::ustring get_c_enum_definition_macro(GType enumGType,
+ Glib::ustring& enumCType)
+{
+ Glib::ustring result;
+
+ if((G_TYPE_IS_ENUM(enumGType)))
+ {
+ GEnumClass* enumClass = G_ENUM_CLASS(g_type_class_ref(enumGType));
+ if(enumClass)
+ {
+ result += "_C_ENUM_DEFINITION(" + enumCType + ",";
+ for(guint i = 0; i < enumClass->n_values; i++)
+ {
+ std::stringstream stream;
+ result += (Glib::ustring) enumClass->values[i].value_nick + ",";
+ stream << enumClass->values[i].value;
+ result += stream.str();
+ if(i < enumClass->n_values - 1)
+ result += ",";
+ }
+ result += ")";
+ }
+ g_type_class_unref(enumClass);
+ }
+ else
+ {
+ GFlagsClass* flagsClass = G_FLAGS_CLASS(g_type_class_ref(enumGType));
+ if(flagsClass)
+ {
+ result += "_C_ENUM_DEFINITION(" + enumCType + ",";
+ for(guint i = 0; i < flagsClass->n_values; i++)
+ {
+ std::stringstream stream;
+ result += (Glib::ustring) flagsClass->values[i].value_nick + ",";
+ stream << flagsClass->values[i].value;
+ result += stream.str();
+ if(i < flagsClass->n_values - 1)
+ result += ",";
+ }
+ result += ")";
+ }
+ g_type_class_unref(flagsClass);
+ }
+ return result;
+}
+
Glib::ustring get_signal_wrap_statements(Glib::ustring& includeMacroCalls,
- Glib::ustring& cClassSignalDeclarations)
+ Glib::ustring& cEnumDefinitions, Glib::ustring& enumWrapStatements,
+ Glib::ustring& cClassSignalDeclarations,
+ Glib::ustring& enumGTypeFunctionDefinitions)
{
Glib::ustring wrapStatements;
@@ -263,7 +313,27 @@ Glib::ustring get_signal_wrap_statements(Glib::ustring& includeMacroCalls,
Glib::ustring returnCType = g_type_name(returnGType) +
(Glib::ustring) (gst_type_is_a_pointer(returnGType) ? "*" : "");
- if(gst_type_is_a_pointer(returnGType))
+ if((G_TYPE_IS_ENUM(returnGType) || G_TYPE_IS_FLAGS(returnGType)))
+ // Check for an enum first and attempt to generate _WRAP_ENUM() and
+ // _TRANSLATION() macros if it is not wrapped (see plugingen_base.m4
+ // file for docs).
+ {
+ Glib::ustring enumPrefix = returnCType.substr(0, 3);
+ Glib::ustring returnCppType = returnCType.substr(3);
+
+ enumWrapStatements += "_WRAP_PLUGIN_ENUM(" + enumPrefix + "," +
+ returnCppType + ")";
+
+ Glib::ustring enumGetTypeFunctionName =
+ get_cast_macro(returnCType).lowercase() + "_get_type";
+
+ enumGTypeFunctionDefinitions +=
+ "_PLUGIN_ENUM_GET_TYPE_FUNC(" + returnCType + ")";
+
+ cEnumDefinitions += get_c_enum_definition_macro(returnGType,
+ returnCType);
+ }
+ else if(gst_type_is_a_pointer(returnGType))
{
if(g_type_is_a(returnGType, G_TYPE_BOXED))
// Boxed type returns for signals need special conversions because
@@ -337,9 +407,29 @@ Glib::ustring get_signal_wrap_statements(Glib::ustring& includeMacroCalls,
includeMacroCalls += "_TRANSLATION_INCLUDE(" + paramCType + ")dnl\n";
// Include wrapping conversions for signal parameters. (Unwrapping
- // conversions will already probably be defined in the global convert
- // file):
+ // conversions will already probably be defined in the global
+ // convert file). Also try to wrap plug-in specific enums:
+ if((G_TYPE_IS_ENUM(paramGType) || G_TYPE_IS_FLAGS(paramGType)))
+ // Check for an enum first and attempt to generate _WRAP_ENUM() and
+ // _TRANSLATION() macros and other necessary code if it is not
+ // wrapped (see plugingen_base.m4 file for docs).
+ {
+ Glib::ustring enumPrefix = paramCType.substr(0, 3);
+ Glib::ustring paramCppType = paramCType.substr(3);
+
+ enumWrapStatements += "_WRAP_PLUGIN_ENUM(" + enumPrefix + "," +
+ paramCppType + ")";
+
+ Glib::ustring enumGetTypeFunctionName =
+ get_cast_macro(paramCType).lowercase() + "_get_type";
+
+ enumGTypeFunctionDefinitions +=
+ "_PLUGIN_ENUM_GET_TYPE_FUNC(" + paramCType + ")";
+
+ cEnumDefinitions += get_c_enum_definition_macro(paramGType,
+ paramCType);
+ }
if(gst_type_is_a_pointer(paramGType))
{
if(paramGType == GST_TYPE_TAG_LIST)
@@ -422,6 +512,7 @@ Glib::ustring get_interface_macros(Glib::ustring& includeMacroCalls,
}
void generate_hg_file(const Glib::ustring& includeMacroCalls,
+ const Glib::ustring& cEnumDefinitions,
const Glib::ustring& enumWrapStatements,
const Glib::ustring& cppExtends,
const Glib::ustring& interfaceMacros,
@@ -438,11 +529,17 @@ void generate_hg_file(const Glib::ustring& includeMacroCalls,
std::cout << "_DEFS(" << target << "," << defsFile << ")" << std::endl <<
std::endl;
+ if(!cEnumDefinitions.empty())
+ {
+ std::cout << "// Plug-in C enums used in signals:" << std::endl;
+ std::cout << cEnumDefinitions;
+ }
+
std::cout << "namespace " << nmspace << std::endl;
std::cout << "{" << std::endl << std::endl;
if(!enumWrapStatements.empty())
- std::cout << enumWrapStatements << std::endl;
+ std::cout << enumWrapStatements;
std::cout << "/** " << nmspace << "::" << cppTypeName << " - " << pluginName << " plugin." << std::endl;
std::cout << " * Please note that, though using the underlying GObject is "
@@ -722,6 +819,7 @@ int main(int argc, char* argv[])
if(hgFile || ccgFile)
{
Glib::ustring includeMacroCalls;
+ Glib::ustring cEnumDefinitions;
Glib::ustring enumWrapStatements;
Glib::ustring propertyWrapStatements;
Glib::ustring signalWrapStatements;
@@ -732,7 +830,8 @@ int main(int argc, char* argv[])
enumWrapStatements, enumGTypeFunctionDefinitions);
signalWrapStatements = get_signal_wrap_statements(includeMacroCalls,
- cClassSignalDeclarations);
+ cEnumDefinitions, enumWrapStatements, cClassSignalDeclarations,
+ enumGTypeFunctionDefinitions);
if(hgFile)
{
@@ -741,8 +840,9 @@ int main(int argc, char* argv[])
interfaceMacros = get_interface_macros(includeMacroCalls, cppExtends);
- generate_hg_file(includeMacroCalls, enumWrapStatements, cppExtends,
- interfaceMacros, propertyWrapStatements, signalWrapStatements);
+ generate_hg_file(includeMacroCalls, cEnumDefinitions,
+ enumWrapStatements, cppExtends, interfaceMacros,
+ propertyWrapStatements, signalWrapStatements);
}
else
{
diff --git a/tools/m4/plugingen_base.m4 b/tools/m4/plugingen_base.m4
index 00425b3..4f29e28 100644
--- a/tools/m4/plugingen_base.m4
+++ b/tools/m4/plugingen_base.m4
@@ -6,9 +6,15 @@ dnl
dnl __HASH variable borrowed form glibmm's convert_base.m4 file
define(`__HASH',`__`'translit(`$*',`ABCDEFGHIJKLMNOPQRSTUVWXYZ<>[]&*, ',`abcdefghijklmnopqrstuvwxyzVBNMRSC_')`'')
+dnl _CAMEL_TO_UNDERSCORE(GtkWidget) -> gtk_widget. Adapted from glibmm's
+dnl _GET_TYPE_FUNC() macro (see glibmm's convert_base.m4 file for docs).
+define(`_CAMEL_TO_UNDERSCORE',`dnl
+translit(substr(patsubst(patsubst(`$1',`[A-Z][A-Z]+',`_\&'),`[A-Z][a-z]',`_\&'),1),`[A-Z]',`[a-z]')`'dnl
+')
+
dnl _GET_TYPE_FUNC(GtkWidget) -> gtk_widget_get_type(). Borrowed from glibmm's convert_base.m4 file (see glibmm's m4 file for docs).
define(`_GET_TYPE_FUNC',`dnl
-translit(substr(patsubst(patsubst(`$1',`[A-Z][A-Z]+',`_\&'),`[A-Z][a-z]',`_\&'),1),`[A-Z]',`[a-z]')_get_type()`'dnl
+_CAMEL_TO_UNDERSCORE($1)_get_type()`'dnl
')
dnl Macro to insert left quote
@@ -49,7 +55,7 @@ ifdef(`IFC'__HASH(`$1'),,`dnl
ifdef(`IF'__HASH(`$1'),`dnl
#include indir(`IF'__HASH(`$1'))
dnl
-define(`IFC'__HASH(`$1'),`complete')dnl
+define(`IFC'__HASH(`$1'))dnl
')`'dnl
')`'dnl
')dnl
@@ -97,15 +103,18 @@ define(`_ENUM_IS_WRAPPED',`dnl
define(`EIW'__HASH(`$1'))dnl
')dnl
-dnl _WRAP_PLUGIN_ENUM(CppEnumType, CEnumType)
+dnl _WRAP_PLUGIN_ENUM(prefix, CppEnumType)
dnl
dnl Attempts to generate a _WRAP_ENUM() and a _TRANSLATION() macro for an enum
dnl used by a plug-in. If the enum has been flagged as wrapped by the
dnl _ENUM_IS_WRAPPED() macro nothing will be generated.
define(`_WRAP_PLUGIN_ENUM',`dnl
-ifdef(`EIW'__HASH(`$2'),,`dnl
-_WRAP_ENUM($1,$2)dnl
-_TRANSLATION(`$2',`$1',`$1')dnl
+ifdef(`EIW'__HASH(`$1$2'),,`dnl
+_TRANSLATION(`$1$2',`$1::$2',`$1::$2')dnl
+_WRAP_ENUM($2,$1$2)
+_CONV_ENUM($1,$2)
+
+_ENUM_IS_WRAPPED($1$2)dnl
')`'dnl
')dnl
@@ -114,15 +123,52 @@ dnl
dnl Attempts to generate a *_get_type() function for an enum specific to a
dnl plug-in. If the enum has been flagged as wrapped by the
dnl _ENUM_IS_WRAPPED() macro it is taken taken to be a non-plugin enum and
-dnl nothing will be generated.
+dnl nothing will be generated. Only one function is generated no matter how
+dnl many times the macro is used.
define(`_PLUGIN_ENUM_GET_TYPE_FUNC',`dnl
ifdef(`EIW'__HASH(`$1'),,`dnl
+ifdef(`EGTF'__HASH(`$1'),,`dnl
static GType _GET_TYPE_FUNC($1)
{
static GType const type = g_type_from_name("$1");
return type;
}
+define(`EGTF'__HASH(`$1'))dnl
+')`'dnl
+')`'dnl
+')dnl
+
+dnl _C_ENUM_VALUES(CAPS_UNDERSCORE_C_ENUM_TYPE, nick1, val1, nick2, val2, ...)
+dnl
+dnl Generates the enum values of a C enum definition from the C enum type name
+dnl and the list of nicknames and values of the enum. The enum type name must
+dnl be converted from camel to caps/underscore format.
+define(`_C_ENUM_VALUES',`dnl
+ifelse(eval(`$# < 3'),`1',,eval(`$# == 3'),`1',`dnl
+ $1_`'translit(translit(`$2',`a-z',`A-Z'),`-',`_') = $3
+',`dnl
+ $1_`'translit(translit(`$2',`a-z',`A-Z'),`-',`_') = $3,
+_C_ENUM_VALUES(`$1',shift(shift(shift($@))))dnl
+')`'dnl
+')dnl
+
+dnl _C_ENUM_DEFINITION(CEnumType, nick1, val1, nick2, val2, ...)
+dnl
+dnl Generates a C enum definition from the C enum type name and the list of
+dnl nicknames and values of the enum if the enum has not been flagged as
+dnl wrapped with the _ENUM_IS_WRAPPED() macro. Only one definition is
+dnl generated per multiple calls.
+define(`_C_ENUM_DEFINITION',`dnl
+ifdef(`EIW'__HASH(`$1'),,`dnl
+ifdef(`CED'__HASH(`$1'),,`dnl
+enum $1
+{
+_C_ENUM_VALUES(translit(_CAMEL_TO_UNDERSCORE(`$1'),`a-z',`A-Z'),shift($@))dnl
+};
+
+define(`CED'__HASH(`$1'))dnl
+')`'dnl
')`'dnl
')dnl
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]