/* Copyright (C) 2002 The gtkmm Development Team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . */ #include #include #include namespace Glib { namespace OptionContextPrivate { static const gchar* SignalProxy_translate_gtk_callback(const gchar* str, gpointer data) { Glib::ustring translated_str; Glib::OptionContext::SlotTranslate* the_slot = static_cast(data); try { translated_str = (*the_slot)(str); } catch (...) { Glib::exception_handlers_invoke(); } return translated_str.c_str(); } static void SignalProxy_translate_gtk_callback_destroy(gpointer data) { delete static_cast(data); } } // namespace OptionContextPrivate OptionContext::OptionContext(const Glib::ustring& parameter_string) : gobject_(g_option_context_new(parameter_string.c_str())), has_ownership_(true) { } OptionContext::OptionContext(GOptionContext* castitem, bool take_ownership) : gobject_(castitem), has_ownership_(take_ownership) { } OptionContext::OptionContext(OptionContext&& other) noexcept : gobject_(std::move(other.gobject_)), has_ownership_(std::move(other.has_ownership_)) { other.gobject_ = nullptr; other.has_ownership_ = false; } OptionContext& OptionContext::operator=(OptionContext&& other) noexcept { if (has_ownership_) g_option_context_free(gobj()); gobject_ = std::move(other.gobject_); has_ownership_ = std::move(other.has_ownership_); other.gobject_ = nullptr; other.has_ownership_ = false; return *this; } OptionContext::~OptionContext() { if (has_ownership_) g_option_context_free(gobj()); gobject_ = nullptr; } void OptionContext::add_group(OptionGroup& group) { // GObjectContext takes ownership of the GOptionGroup, unrefing it later. g_option_context_add_group(gobj(), group.gobj_copy()); } void OptionContext::set_main_group(OptionGroup& group) { // GObjectContext takes ownership of the GOptionGroup, unrefing it later. g_option_context_set_main_group(gobj(), group.gobj_copy()); } /* OptionGroup OptionContext::get_main_group() const { const auto cobj = g_option_context_get_main_group(const_cast( gobj()) ); OptionGroup cppObj(const_cast(cobj), true); // take_copy return cppObj; } */ void OptionContext::set_translate_func(const SlotTranslate& slot) { // Create a copy of the slot. A pointer to this will be passed through the callback's data // parameter. // It will be deleted when SignalProxy_translate_gtk_callback_destroy() is called. auto slot_copy = new SlotTranslate(slot); g_option_context_set_translate_func(gobj(), &OptionContextPrivate::SignalProxy_translate_gtk_callback, slot_copy, &OptionContextPrivate::SignalProxy_translate_gtk_callback_destroy); } Glib::ustring OptionContext::get_help(bool main_help) const { return Glib::convert_return_gchar_ptr_to_ustring(g_option_context_get_help( const_cast(gobj()), static_cast(main_help), nullptr)); } } // namespace Glib