diff --git a/.hgignore b/.hgignore index b10d09ff..3c71a4cc 100644 --- a/.hgignore +++ b/.hgignore @@ -19,7 +19,6 @@ missing po-gsv/Makefile.in.in po/Makefile.in.in build/ -build-15/ autom4te.cache/ aclocal.m4 *~ diff --git a/CMakeLists.txt b/CMakeLists.txt index 5cedf6d9..aab05109 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,231 +1,199 @@ -cmake_minimum_required(VERSION 3.0) -cmake_policy(SET CMP0048 NEW) - -include(cmake/PrecompiledHeader.cmake) - -list(APPEND EXTRA_DIST - tools/genenums.py - tools/glade2c.py - tools/xml2h.py - plat/win32/installer.iss.in - plat/win32/istrans.sh - plat/win32/mingw-configure -) - -# zzz -# if MOO_OS_WIN32 -# plat/win32/installer.iss: $(top_srcdir)/plat/win32/installer.iss.in $(top_builddir)/config.status -# $(AM_V_at)$(MKDIR_P) plat/win32 -# $(AM_V_GEN)cd $(top_builddir) && ./config.status --silent --file=plat/win32/installer.iss -# installer: plat/win32/installer.iss install -# $(MEDIT_INNO_COMPILER) plat/win32/installer.iss -# copy: -# cp moo/medit.exe "/win/Program Files (x86)/medit/bin/" -# bd_tmpdir = medit-win-dist-tmp -# bd_distdir = $(PACKAGE)-$(VERSION) -# bd_pzip = $(PACKAGE)-portable-$(VERSION) -# bd_zip = $(PACKAGE)-$(VERSION) -# portable: install -# rm -fr $(bd_tmpdir) -# mkdir $(bd_tmpdir) -# cp -lR ${prefix} $(bd_tmpdir)/$(bd_distdir) -# cd $(bd_tmpdir) && zip -r9 $(bd_zip).zip $(bd_distdir) -# echo "This file enables portable mode for medit" > $(bd_tmpdir)/$(bd_distdir)/bin/$(MEDIT_PORTABLE_MAGIC_FILE_NAME) -# cd $(bd_tmpdir) && zip -r9 $(bd_pzip).zip $(bd_distdir) -# mv $(bd_tmpdir)/$(bd_pzip).zip $(bd_tmpdir)/$(bd_zip).zip . -# rm -fr $(bd_tmpdir) -# bdist: installer portable -# endif - -# zzz @MOO_PO_SUBDIRS_RULE@ - -set(MOO_MAJOR_VERSION 1) -set(MOO_MINOR_VERSION 2) -set(MOO_MICRO_VERSION 90) -set(_moo_version_suffix_ "-devel") -set(MOO_MODULE_MAJOR_VERSION 2) -set(MOO_MODULE_MINOR_VERSION 0) -set(MOO_VERSION "${MOO_MAJOR_VERSION}.${MOO_MINOR_VERSION}.${MOO_MICRO_VERSION}") -set(MOO_DISPLAY_VERSION "${MOO_VERSION}${_moo_version_suffix_}") - -project(medit VERSION ${MOO_VERSION}) - -# keep in sync with po/maintain -set(MOO_PACKAGE_NAME "medit-1") - -set(MOO_WEBSITE "http://mooedit.sourceforge.net/") -set(MOO_WEB_CONTACT "http://mooedit.sourceforge.net/contact.html") -set(MOO_EMAIL "emuntyan@users.sourceforge.net") -set(MOO_COPYRIGHT "2004-2015 Yevgen Muntyan <${MOO_EMAIL}>") - -set(MOO_PREFS_XML_FILE_NAME "prefs.xml") -set(MOO_STATE_XML_FILE_NAME "state.xml") -set(MOO_NAMED_SESSION_XML_FILE_NAME "session-%s.xml") -set(MOO_SESSION_XML_FILE_NAME "session.xml") -set(MEDIT_PORTABLE_MAGIC_FILE_NAME "medit-portable") -set(MEDIT_PORTABLE_DATA_DIR "medit-portable-data") -set(MEDIT_PORTABLE_CACHE_DIR "medit-portable-cache") - -set(MOO_DATA_DIR "${CMAKE_INSTALL_PREFIX}/share/${MOO_PACKAGE_NAME}") -set(MOO_LIB_DIR "${CMAKE_INSTALL_PREFIX}/lib/${MOO_PACKAGE_NAME}") -set(MOO_DOC_DIR "${CMAKE_INSTALL_PREFIX}/share/doc/${MOO_PACKAGE_NAME}") -set(MOO_HELP_DIR "${MOO_DOC_DIR}/help") -set(MOO_TEXT_LANG_FILES_DIR "${MOO_DATA_DIR}/language-specs") -set(MOO_PYTHON_PLUGIN_DIR "${MOO_DATA_DIR}/plugins") -set(MOO_PYTHON_LIB_DIR "${MOO_DATA_DIR}/python") - -if(CMAKE_COMPILER_IS_GNUCXX) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14") -endif() - -if(WIN32 AND CMAKE_CONFIGURATION_TYPES) - set(CMAKE_CONFIGURATION_TYPES Release Debug) - set(CMAKE_CONFIGURATION_TYPES "${CMAKE_CONFIGURATION_TYPES}" CACHE STRING - "Reset the configurations to what we need" FORCE) -endif() - -set(CMAKE_INCLUDE_CURRENT_DIR ON) -set(CMAKE_AUTOMOC ON) - -if(WIN32) - set(MOO_OS_WIN32 TRUE) -else() - set(MOO_OS_UNIX TRUE) -endif() - -set(MOO_BUILD_FROM_MSVC FALSE CACHE BOOL "Create a win32 build from MSVC gtk build") -set(MOO_BUILD_FROM_MINGW ${MOO_OS_WIN32} CACHE BOOL "Create a win32 build from mingw gtk build") - -if(NOT MOO_BUILD_FROM_MINGW AND NOT MOO_BUILD_FROM_MSVC) - find_package(PkgConfig REQUIRED) - pkg_check_modules(GTK REQUIRED gtk+-2.0) - pkg_check_modules(GMODULE REQUIRED gmodule-2.0) - #execute_process( - # COMMAND ${PKG_CONFIG_EXECUTABLE} --variable=glib_genmarshal glib-2.0 - # OUTPUT_VARIABLE GLIB_GENMARSHAL - # OUTPUT_STRIP_TRAILING_WHITESPACE - # RESULT_VARIABLE RESULT) - #if(NOT RESULT EQUAL 0) - # MESSAGE(FATAL_ERROR "Could not find glib-genmarshal") - #endif() - execute_process( - COMMAND ${PKG_CONFIG_EXECUTABLE} --variable=glib_mkenums glib-2.0 - OUTPUT_VARIABLE GLIB_MKENUMS - OUTPUT_STRIP_TRAILING_WHITESPACE - RESULT_VARIABLE RESULT) - if(NOT RESULT EQUAL 0) - MESSAGE(FATAL_ERROR "Could not find glib-mkenums") - endif() - - pkg_check_modules(XLIB x11 xext xrender ice sm) - pkg_check_modules(LIBXML2 REQUIRED libxml-2.0) -else() - - if(MOO_BUILD_FROM_MINGW) - set(MOO_GTK_DIR "C:/Projects/gtk/release/target" CACHE PATH "Gtk root dir") - set(MOO_GTK_DIST_DIR "C:/Projects/gtk/release/bdist" CACHE PATH "Gtk binary dir") - - set(GTK_LIBRARIES libgtk-win32-2.0-0 libatk-1.0-0 libgdk-win32-2.0-0 libgdk_pixbuf-2.0-0 - libpango-1.0-0 libpangocairo-1.0-0 libcairo-2 - libgio-2.0-0 libgobject-2.0-0 libgmodule-2.0-0 libgthread-2.0-0 libglib-2.0-0 libintl-8 - libmooglib-0) - set(LIBXML2_LIBRARIES "libxml2-2") - else() - set(MOO_GTK_DIR "C:/gtk-build/gtk/Win32/release" CACHE PATH "Gtk root dir") - set(MOO_GTK_DIST_DIR "C:/gtk-build/gtk/bdist" CACHE PATH "Gtk binary dir") - - set(GTK_LIBRARIES atk-1.0 cairo gdk_pixbuf-2.0 gdk-win32-2.0 gio-2.0 glib-2.0 gmodule-2.0 gobject-2.0 - gthread-2.0 gtk-win32-2.0 iconv intl libffi libpng16 pango-1.0 pangocairo-1.0 pixman-1 zlib1) - set(LIBXML2_LIBRARIES libxml2) - endif() - - set(CMAKE_INSTALL_PREFIX ${MOO_GTK_DIR} CACHE PATH "CMake install prefix" FORCE) - - include_directories(SYSTEM "${MOO_GTK_DIR}/include") - include_directories(SYSTEM "${MOO_GTK_DIR}/include/glib-2.0") - include_directories(SYSTEM "${MOO_GTK_DIR}/lib/glib-2.0/include") - include_directories(SYSTEM "${MOO_GTK_DIR}/lib/gtk-2.0/include") - include_directories(SYSTEM "${MOO_GTK_DIR}/include/gtk-2.0") - include_directories(SYSTEM "${MOO_GTK_DIR}/include/gdk-pixbuf-2.0") - include_directories(SYSTEM "${MOO_GTK_DIR}/include/pango-1.0") - include_directories(SYSTEM "${MOO_GTK_DIR}/include/atk-1.0") - include_directories(SYSTEM "${MOO_GTK_DIR}/include/cairo") - include_directories(SYSTEM "${MOO_GTK_DIR}/include/libxml2") - - set(GTK_LIBRARY_DIRS "${MOO_GTK_DIR}/lib") - - set(ENV{PATH} "ENV{PATH};${MOO_GTK_DIR}/bin") - - include_directories(SYSTEM "${CMAKE_SOURCE_DIR}/moo/mooutils/moowin32/ms") - - foreach(var CMAKE_C_FLAGS CMAKE_CXX_FLAGS) - set(${var} "${${var}} /MP /Zo /wd4996") - - # "C4706: assignment within conditional expression" - it's a good warning, it catches - # 'if(x = 5)'. Unfortunately it also complains about 'while ((p = x()))' which is fine - # and is used a lot. Additional parentheses don't silence it, unlike with gcc. - set(${var} "${${var}} /W4 /WX /wd4244 /wd4800 /wd4100 /wd4127 /wd4054 /wd4055 /wd4306 /wd4706 /wd4125 /wd4389 /wd4152 /wd4505") - - set(${var}_RELEASE "${${var}_RELEASE} /Zi") - string(REPLACE "/Ob1" "/Ob2" ${var}_RELWITHDEBINFO "${${var}_RELWITHDEBINFO}") - - if (true) - # /MDd means link with the debug crt library, which we don't want; and /D_DEBUG forces - # that as well because of some includes; turn them off. - string(REPLACE "/MDd" "/MD" ${var}_DEBUG "${${var}_DEBUG}") - string(REPLACE "/D_DEBUG" "/DENABLE_DEBUG=1 /DDEBUG=1 /DMOO_DEBUG=1" ${var}_DEBUG "${${var}_DEBUG}") - else() - string(REPLACE "/D_DEBUG" "/DENABLE_DEBUG=1 /DDEBUG=1 /DMOO_DEBUG=1 /D_DEBUG" ${var}_DEBUG "${${var}_DEBUG}") - endif() - endforeach() - - set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /DEBUG /INCREMENTAL") - set(CMAKE_MODULE_LINKER_FLAGS_RELEASE "${CMAKE_MODULE_LINKER_FLAGS_RELEASE} /DEBUG /INCREMENTAL") - set(CMAKE_SHARED_LINKER_FLAGS_RELEASE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE} /DEBUG /INCREMENTAL") - -endif() - -find_program(GLIB_GENMARSHAL glib-genmarshal) -find_program(GDK_PIXBUF_CSOURCE gdk-pixbuf-csource) - -#find_library(LIBM m) - -find_package(Gettext REQUIRED) -set(GETTEXT_PACKAGE "${MOO_PACKAGE_NAME}") -set(GETTEXT_PACKAGE_GSV "${MOO_PACKAGE_NAME}-gsv") -# MOO_INTL - -set(PythonInterp_FIND_VERSION TRUE) -set(PythonInterp_FIND_VERSION_MAJOR 2) -find_package(PythonInterp REQUIRED) -set(MOO_PYTHON "${PYTHON_EXECUTABLE}") - -set(MOO_ENABLE_PYTHON TRUE CACHE BOOL "Use python") - -add_definitions(-DHAVE_CONFIG_H=1 -DXDG_PREFIX=_moo_edit_xdg -DG_LOG_DOMAIN=\"Moo\") -#add_definitions(-DGDK_DISABLE_DEPRECATED=1) -#add_definitions(-DGTK_DISABLE_DEPRECATED=1) - -if(WIN32) - add_definitions(-DUNICODE=1 -D_UNICODE=1 -D__WIN32__=1 -DSTRICT=1 -D_CRT_SECURE_NO_WARNINGS=1 -D_CRT_NONSTDC_NO_WARNINGS=1) - set(MOO_NEED_GETTIMEOFDAY TRUE) - set(HAVE_UNISTD_H TRUE) - set(HAVE_BIND_TEXTDOMAIN_CODESET TRUE) - list(APPEND MEDIT_LIBS Shlwapi.lib) -endif(WIN32) - -# zzz SUBDIRS = po po-gsv api doc moo -add_subdirectory(api) -# add_subdirectory(doc) - -#set(ENABLE_NLS TRUE) -#add_subdirectory(po) -#add_subdirectory(po-gsv) - -add_subdirectory(moo) - -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/config-cmake.h.in ${CMAKE_CURRENT_BINARY_DIR}/config.h) - -if(WIN32) - install(DIRECTORY plat/win32/medit-data/bin plat/win32/medit-data/etc DESTINATION "${CMAKE_INSTALL_PREFIX}") -endif(WIN32) +cmake_minimum_required(VERSION 3.0) +cmake_policy(SET CMP0048 NEW) + +list(APPEND EXTRA_DIST + tools/genenums.py + tools/glade2c.py + tools/xml2h.py + plat/win32/installer.iss.in + plat/win32/istrans.sh + plat/win32/mingw-configure +) + +# zzz +# if MOO_OS_WIN32 +# plat/win32/installer.iss: $(top_srcdir)/plat/win32/installer.iss.in $(top_builddir)/config.status +# $(AM_V_at)$(MKDIR_P) plat/win32 +# $(AM_V_GEN)cd $(top_builddir) && ./config.status --silent --file=plat/win32/installer.iss +# installer: plat/win32/installer.iss install +# $(MEDIT_INNO_COMPILER) plat/win32/installer.iss +# copy: +# cp moo/medit.exe "/win/Program Files (x86)/medit/bin/" +# bd_tmpdir = medit-win-dist-tmp +# bd_distdir = $(PACKAGE)-$(VERSION) +# bd_pzip = $(PACKAGE)-portable-$(VERSION) +# bd_zip = $(PACKAGE)-$(VERSION) +# portable: install +# rm -fr $(bd_tmpdir) +# mkdir $(bd_tmpdir) +# cp -lR ${prefix} $(bd_tmpdir)/$(bd_distdir) +# cd $(bd_tmpdir) && zip -r9 $(bd_zip).zip $(bd_distdir) +# echo "This file enables portable mode for medit" > $(bd_tmpdir)/$(bd_distdir)/bin/$(MEDIT_PORTABLE_MAGIC_FILE_NAME) +# cd $(bd_tmpdir) && zip -r9 $(bd_pzip).zip $(bd_distdir) +# mv $(bd_tmpdir)/$(bd_pzip).zip $(bd_tmpdir)/$(bd_zip).zip . +# rm -fr $(bd_tmpdir) +# bdist: installer portable +# endif + +# zzz @MOO_PO_SUBDIRS_RULE@ + +set(MOO_MAJOR_VERSION 1) +set(MOO_MINOR_VERSION 2) +set(MOO_MICRO_VERSION 90) +set(_moo_version_suffix_ "-devel") +set(MOO_MODULE_MAJOR_VERSION 2) +set(MOO_MODULE_MINOR_VERSION 0) +set(MOO_VERSION "${MOO_MAJOR_VERSION}.${MOO_MINOR_VERSION}.${MOO_MICRO_VERSION}") +set(MOO_DISPLAY_VERSION "${MOO_VERSION}${_moo_version_suffix_}") + +project(medit VERSION ${MOO_VERSION}) + +# keep in sync with po/maintain +set(MOO_PACKAGE_NAME "medit-1") + +set(MOO_WEBSITE "http://mooedit.sourceforge.net/") +set(MOO_WEB_CONTACT "http://mooedit.sourceforge.net/contact.html") +set(MOO_EMAIL "emuntyan@users.sourceforge.net") +set(MOO_COPYRIGHT "2004-2015 Yevgen Muntyan <${MOO_EMAIL}>") + +set(MOO_PREFS_XML_FILE_NAME "prefs.xml") +set(MOO_STATE_XML_FILE_NAME "state.xml") +set(MOO_NAMED_SESSION_XML_FILE_NAME "session-%s.xml") +set(MOO_SESSION_XML_FILE_NAME "session.xml") +set(MEDIT_PORTABLE_MAGIC_FILE_NAME "medit-portable") +set(MEDIT_PORTABLE_DATA_DIR "medit-portable-data") +set(MEDIT_PORTABLE_CACHE_DIR "medit-portable-cache") + +set(MOO_DATA_DIR "${CMAKE_INSTALL_PREFIX}/share/${MOO_PACKAGE_NAME}") +set(MOO_LIB_DIR "${CMAKE_INSTALL_PREFIX}/lib/${MOO_PACKAGE_NAME}") +set(MOO_DOC_DIR "${CMAKE_INSTALL_PREFIX}/share/doc/${MOO_PACKAGE_NAME}") +set(MOO_HELP_DIR "${MOO_DOC_DIR}/help") +set(MOO_TEXT_LANG_FILES_DIR "${MOO_DATA_DIR}/language-specs") +set(MOO_PYTHON_PLUGIN_DIR "${MOO_DATA_DIR}/plugins") +set(MOO_PYTHON_LIB_DIR "${MOO_DATA_DIR}/python") + +if(CMAKE_COMPILER_IS_GNUCXX) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") +endif() + +if(WIN32 AND CMAKE_CONFIGURATION_TYPES) + set(CMAKE_CONFIGURATION_TYPES Release Debug) + set(CMAKE_CONFIGURATION_TYPES "${CMAKE_CONFIGURATION_TYPES}" CACHE STRING + "Reset the configurations to what we need" FORCE) +endif() + +set(CMAKE_INCLUDE_CURRENT_DIR ON) +set(CMAKE_AUTOMOC ON) + +if(WIN32) + set(MOO_OS_WIN32 TRUE) +else() + set(MOO_OS_UNIX TRUE) +endif() + +set(MOO_BUILD_FROM_MINGW ${MOO_OS_WIN32} CACHE BOOL "Create a win32 build from mingw gtk build") + +if(NOT MOO_BUILD_FROM_MINGW) + find_package(PkgConfig REQUIRED) + pkg_check_modules(GTK REQUIRED gtk+-2.0) + pkg_check_modules(GMODULE REQUIRED gmodule-2.0) + #execute_process( + # COMMAND ${PKG_CONFIG_EXECUTABLE} --variable=glib_genmarshal glib-2.0 + # OUTPUT_VARIABLE GLIB_GENMARSHAL + # OUTPUT_STRIP_TRAILING_WHITESPACE + # RESULT_VARIABLE RESULT) + #if(NOT RESULT EQUAL 0) + # MESSAGE(FATAL_ERROR "Could not find glib-genmarshal") + #endif() + execute_process( + COMMAND ${PKG_CONFIG_EXECUTABLE} --variable=glib_mkenums glib-2.0 + OUTPUT_VARIABLE GLIB_MKENUMS + OUTPUT_STRIP_TRAILING_WHITESPACE + RESULT_VARIABLE RESULT) + if(NOT RESULT EQUAL 0) + MESSAGE(FATAL_ERROR "Could not find glib-mkenums") + endif() + + pkg_check_modules(XLIB x11 xext xrender ice sm) + pkg_check_modules(LIBXML2 REQUIRED libxml-2.0) +else() + set(MOO_GTK_DIR "C:/Projects/gtk/release/target" CACHE PATH "Gtk root dir") + set(MOO_GTK_DIST_DIR "C:/Projects/gtk/release/bdist" CACHE PATH "Gtk binary dir") + + set(CMAKE_INSTALL_PREFIX ${MOO_GTK_DIR} CACHE PATH "CMake install prefix" FORCE) + + include_directories(SYSTEM "${MOO_GTK_DIR}/include") + include_directories(SYSTEM "${MOO_GTK_DIR}/include/glib-2.0") + include_directories(SYSTEM "${MOO_GTK_DIR}/lib/glib-2.0/include") + include_directories(SYSTEM "${MOO_GTK_DIR}/lib/gtk-2.0/include") + include_directories(SYSTEM "${MOO_GTK_DIR}/include/gtk-2.0") + include_directories(SYSTEM "${MOO_GTK_DIR}/include/gdk-pixbuf-2.0") + include_directories(SYSTEM "${MOO_GTK_DIR}/include/pango-1.0") + include_directories(SYSTEM "${MOO_GTK_DIR}/include/atk-1.0") + include_directories(SYSTEM "${MOO_GTK_DIR}/include/cairo") + include_directories(SYSTEM "${MOO_GTK_DIR}/include/libxml2") + + set(GTK_LIBRARY_DIRS "${MOO_GTK_DIR}/lib") + set(GTK_LIBRARIES libgtk-win32-2.0-0 libatk-1.0-0 libgdk-win32-2.0-0 libgdk_pixbuf-2.0-0 + libpango-1.0-0 libpangocairo-1.0-0 libcairo-2 + libgio-2.0-0 libgobject-2.0-0 libgmodule-2.0-0 libgthread-2.0-0 libglib-2.0-0 libintl-8) + set(LIBXML2_LIBRARIES "libxml2-2") + + set(ENV{PATH} "ENV{PATH};${MOO_GTK_DIR}/bin") + + include_directories(SYSTEM "${CMAKE_SOURCE_DIR}/moo/mooutils/moowin32/ms") + + set(PYGTK_DEFS_DIR ${MOO_GTK_DIR}/share/pygtk/2.0/defs) + set(PYGOBJECT_DEFS_DIR ${MOO_GTK_DIR}/share/pygobject/2.0/defs) + + set(PYGTK_INCLUDE_DIR "${MOO_GTK_DIR}/include/pygtk-2.0") + include_directories(SYSTEM "${PYGTK_INCLUDE_DIR}") + + foreach(var CMAKE_C_FLAGS CMAKE_CXX_FLAGS) + set(${var} "${${var}} /MP /Zo /wd4996") + + # "C4706: assignment within conditional expression" - it's a good warning, it catches + # 'if(x = 5)'. Unfortunately it also complains about 'while ((p = x()))' which is fine + # and is used a lot. Additional parentheses don't silence it, unlike with gcc. + set(${var} "${${var}} /W4 /WX /wd4244 /wd4800 /wd4100 /wd4127 /wd4054 /wd4055 /wd4306 /wd4706 /wd4125 /wd4389 /wd4152 /wd4505") + + set(${var}_RELEASE "${${var}_RELEASE} /Zi") + string(REPLACE "/Ob1" "/Ob2" ${var}_RELWITHDEBINFO "${${var}_RELWITHDEBINFO}") + string(REPLACE "/MDd" "/MD" ${var}_DEBUG "${${var}_DEBUG}") + string(REPLACE "/D_DEBUG" "" ${var}_DEBUG "${${var}_DEBUG}") + endforeach() +endif() + +find_program(GLIB_GENMARSHAL glib-genmarshal) +find_program(GDK_PIXBUF_CSOURCE gdk-pixbuf-csource) + +#find_library(LIBM m) + +find_package(Gettext REQUIRED) +set(GETTEXT_PACKAGE "${MOO_PACKAGE_NAME}") +set(GETTEXT_PACKAGE_GSV "${MOO_PACKAGE_NAME}-gsv") +# MOO_INTL + +set(PythonInterp_FIND_VERSION TRUE) +set(PythonInterp_FIND_VERSION_MAJOR 2) +find_package(PythonInterp REQUIRED) +set(MOO_PYTHON "${PYTHON_EXECUTABLE}") + +set(MOO_ENABLE_PYTHON TRUE CACHE BOOL "Use python") + +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/config-cmake.h.in ${CMAKE_CURRENT_BINARY_DIR}/config.h) +add_definitions(-DMOO_COMPILATION=1 -DHAVE_CONFIG_H=1 -DXDG_PREFIX=_moo_edit_xdg -DG_LOG_DOMAIN=\"Moo\") + +if(WIN32) + add_definitions(-DUNICODE=1 -D_UNICODE=1 -D__WIN32__=1 -DSTRICT=1 -D_CRT_SECURE_NO_WARNINGS=1 -D_CRT_NONSTDC_NO_WARNINGS=1) + add_definitions(-DMOO_NEED_GETTIMEOFDAY=1) + add_definitions(-DHAVE_UNISTD_H=1 -DENABLE_NLS=1 -DHAVE_BIND_TEXTDOMAIN_CODESET=1) +endif(WIN32) + +# zzz SUBDIRS = po po-gsv api doc moo +add_subdirectory(api) +# add_subdirectory(doc) +#add_subdirectory(po) +#add_subdirectory(po-gsv) + +add_subdirectory(moo) diff --git a/Makefile.am b/Makefile.am index a771ce10..bd1718d9 100644 --- a/Makefile.am +++ b/Makefile.am @@ -9,7 +9,7 @@ EXTRA_DIST = \ DISTCHECK_CONFIGURE_FLAGS = if MOO_DEV_MODE -DISTCHECK_CONFIGURE_FLAGS += MAKEFLAGS=-j4 +DISTCHECK_CONFIGURE_FLAGS += MAKEFLAGS=-j3 endif if MOO_STRICT_MODE DISTCHECK_CONFIGURE_FLAGS += --enable-strict diff --git a/api/CMakeLists.txt b/api/CMakeLists.txt index 1ce4042d..20295512 100644 --- a/api/CMakeLists.txt +++ b/api/CMakeLists.txt @@ -44,22 +44,23 @@ SET(source_files ../moo/mooapp/moolinklabel.h ../moo/mooedit/mooedit-accels.h ../moo/mooedit/mooeditaction.c - ../moo/mooedit/mooeditaction-factory.cpp + ../moo/mooedit/mooeditaction-factory.c ../moo/mooedit/mooeditaction-factory.h ../moo/mooedit/mooeditaction.h - ../moo/mooedit/mooeditbookmark.cpp + ../moo/mooedit/mooeditbookmark.c ../moo/mooedit/mooeditbookmark.h - ../moo/mooedit/mooedit.cpp + ../moo/mooedit/mooedit.c ../moo/mooedit/mooeditconfig.c ../moo/mooedit/mooeditconfig.h - ../moo/mooedit/mooeditdialogs.cpp + ../moo/mooedit/mooeditdialogs.c ../moo/mooedit/mooeditdialogs.h ../moo/mooedit/mooedit-enum-types.c ../moo/mooedit/mooedit-enum-types.h ../moo/mooedit/mooedit-enums.h - ../moo/mooedit/mooeditfileinfo.cpp + ../moo/mooedit/mooeditfileinfo.c + ../moo/mooedit/mooeditfileinfo.c ../moo/mooedit/mooeditfileinfo.h - ../moo/mooedit/mooedit-fileops.cpp + ../moo/mooedit/mooedit-fileops.c ../moo/mooedit/mooedit-fileops.h ../moo/mooedit/mooeditfiltersettings.c ../moo/mooedit/mooeditfiltersettings.h @@ -73,16 +74,16 @@ SET(source_files ../moo/mooedit/mooeditor-private.h ../moo/mooedit/mooeditor-tests.c ../moo/mooedit/mooeditor-tests.h - ../moo/mooedit/mooeditprefs.cpp + ../moo/mooedit/mooeditprefs.c ../moo/mooedit/mooeditprefs.h ../moo/mooedit/mooeditprefspage.c ../moo/mooedit/mooedit-private.h ../moo/mooedit/mooedit-script.c ../moo/mooedit/mooedit-script.h - ../moo/mooedit/mooedittab.cpp + ../moo/mooedit/mooedittab.c ../moo/mooedit/mooedittab.h ../moo/mooedit/mooedittypes.h - ../moo/mooedit/mooeditview.cpp + ../moo/mooedit/mooeditview.c ../moo/mooedit/mooeditview.h ../moo/mooedit/mooeditview-script.c ../moo/mooedit/mooeditview-script.h @@ -95,7 +96,7 @@ SET(source_files ../moo/mooedit/mooindenter.h ../moo/mooedit/moolang.c ../moo/mooedit/moolang.h - ../moo/mooedit/moolangmgr.cpp + ../moo/mooedit/moolangmgr.c ../moo/mooedit/moolangmgr.h ../moo/mooedit/moolangmgr-private.h ../moo/mooedit/moolang-private.h @@ -136,7 +137,7 @@ SET(source_files ../moo/moofileview/moofileentry.h ../moo/moofileview/moofile.h ../moo/moofileview/moofile-private.h - ../moo/moofileview/moofilesystem.cpp + ../moo/moofileview/moofilesystem.c ../moo/moofileview/moofilesystem.h ../moo/moofileview/moofileview-accels.h ../moo/moofileview/moofileview-aux.h @@ -148,9 +149,9 @@ SET(source_files ../moo/moofileview/moofileview-private.h ../moo/moofileview/moofileview-tools.c ../moo/moofileview/moofileview-tools.h - ../moo/moofileview/moofolder.cpp + ../moo/moofileview/moofolder.c ../moo/moofileview/moofolder.h - ../moo/moofileview/moofoldermodel.cpp + ../moo/moofileview/moofoldermodel.c ../moo/moofileview/moofoldermodel.h ../moo/moofileview/moofoldermodel-private.h ../moo/moofileview/moofolder-private.h @@ -158,140 +159,140 @@ SET(source_files ../moo/moofileview/mooiconview.h ../moo/moofileview/mootreeview.c ../moo/moofileview/mootreeview.h - ../moo/mooutils/mooaccelbutton.cpp + ../moo/mooutils/mooaccelbutton.c ../moo/mooutils/mooaccelbutton.h - ../moo/mooutils/mooaccel.cpp + ../moo/mooutils/mooaccel.c ../moo/mooutils/mooaccel.h - ../moo/mooutils/mooaccelprefs.cpp + ../moo/mooutils/mooaccelprefs.c ../moo/mooutils/mooaccelprefs.h - ../moo/mooutils/mooactionbase.cpp + ../moo/mooutils/mooactionbase.c ../moo/mooutils/mooactionbase.h ../moo/mooutils/mooactionbase-private.h - ../moo/mooutils/mooaction.cpp - ../moo/mooutils/mooactioncollection.cpp + ../moo/mooutils/mooaction.c + ../moo/mooutils/mooactioncollection.c ../moo/mooutils/mooactioncollection.h - ../moo/mooutils/mooactionfactory.cpp + ../moo/mooutils/mooactionfactory.c ../moo/mooutils/mooactionfactory.h - ../moo/mooutils/mooactiongroup.cpp + ../moo/mooutils/mooactiongroup.c ../moo/mooutils/mooactiongroup.h ../moo/mooutils/mooaction.h ../moo/mooutils/mooaction-private.h - ../moo/mooutils/mooappinput-common.cpp + ../moo/mooutils/mooappinput-common.c ../moo/mooutils/mooappinput.h - ../moo/mooutils/mooapp-ipc.cpp + ../moo/mooutils/mooapp-ipc.c ../moo/mooutils/mooapp-ipc.h ../moo/mooutils/mooarray.h ../moo/mooutils/mooatom.h - ../moo/mooutils/moobigpaned.cpp + ../moo/mooutils/moobigpaned.c ../moo/mooutils/moobigpaned.h - ../moo/mooutils/mooclosure.cpp + ../moo/mooutils/mooclosure.c ../moo/mooutils/mooclosure.h - ../moo/mooutils/moocombo.cpp + ../moo/mooutils/moocombo.c ../moo/mooutils/moocombo.h ../moo/mooutils/moocompat.h - ../moo/mooutils/moodialogs.cpp + ../moo/mooutils/moodialogs.c ../moo/mooutils/moodialogs.h - ../moo/mooutils/mooeditops.cpp + ../moo/mooutils/mooeditops.c ../moo/mooutils/mooeditops.h - ../moo/mooutils/mooencodings.cpp + ../moo/mooutils/mooencodings.c ../moo/mooutils/mooencodings-data.h ../moo/mooutils/mooencodings.h - ../moo/mooutils/mooentry.cpp + ../moo/mooutils/mooentry.c ../moo/mooutils/mooentry.h ../moo/mooutils/moo-environ.h - ../moo/mooutils/moofiledialog.cpp + ../moo/mooutils/moofiledialog.c ../moo/mooutils/moofiledialog.h - ../moo/mooutils/moofileicon.cpp + ../moo/mooutils/moofileicon.c ../moo/mooutils/moofileicon.h - ../moo/mooutils/moofilewatch.cpp + ../moo/mooutils/moofilewatch.c ../moo/mooutils/moofilewatch.h - ../moo/mooutils/moofilewriter.cpp + ../moo/mooutils/moofilewriter.c ../moo/mooutils/moofilewriter.h ../moo/mooutils/moofilewriter-private.h - ../moo/mooutils/moofiltermgr.cpp + ../moo/mooutils/moofiltermgr.c ../moo/mooutils/moofiltermgr.h ../moo/mooutils/moofontsel.c ../moo/mooutils/moofontsel.h - ../moo/mooutils/mooglade.cpp + ../moo/mooutils/mooglade.c ../moo/mooutils/mooglade.h - ../moo/mooutils/moohelp.cpp + ../moo/mooutils/moohelp.c ../moo/mooutils/moohelp.h - ../moo/mooutils/moohistorycombo.cpp + ../moo/mooutils/moohistorycombo.c ../moo/mooutils/moohistorycombo.h - ../moo/mooutils/moohistorylist.cpp + ../moo/mooutils/moohistorylist.c ../moo/mooutils/moohistorylist.h - ../moo/mooutils/moohistorymgr.cpp + ../moo/mooutils/moohistorymgr.c ../moo/mooutils/moohistorymgr.h - ../moo/mooutils/mooi18n.cpp + ../moo/mooutils/mooi18n.c ../moo/mooutils/mooi18n.h ../moo/mooutils/moolist.h - ../moo/mooutils/moomarkup.cpp + ../moo/mooutils/moomarkup.c ../moo/mooutils/moomarkup.h - ../moo/mooutils/moomenuaction.cpp + ../moo/mooutils/moomenuaction.c ../moo/mooutils/moomenuaction.h - ../moo/mooutils/moomenu.cpp + ../moo/mooutils/moomenu.c ../moo/mooutils/moomenu.h - ../moo/mooutils/moomenumgr.cpp + ../moo/mooutils/moomenumgr.c ../moo/mooutils/moomenumgr.h - ../moo/mooutils/moomenutoolbutton.cpp + ../moo/mooutils/moomenutoolbutton.c ../moo/mooutils/moomenutoolbutton.h - ../moo/mooutils/moo-mime.cpp + ../moo/mooutils/moo-mime.c ../moo/mooutils/moo-mime.h - ../moo/mooutils/moonotebook.cpp + ../moo/mooutils/moonotebook.c ../moo/mooutils/moonotebook.h ../moo/mooutils/mooonce.h - ../moo/mooutils/moopane.cpp - ../moo/mooutils/moopaned.cpp + ../moo/mooutils/moopane.c + ../moo/mooutils/moopaned.c ../moo/mooutils/moopaned.h ../moo/mooutils/moopane.h - ../moo/mooutils/mooprefs.cpp - ../moo/mooutils/mooprefsdialog.cpp + ../moo/mooutils/mooprefs.c + ../moo/mooutils/mooprefsdialog.c ../moo/mooutils/mooprefsdialog.h ../moo/mooutils/mooprefs.h - ../moo/mooutils/mooprefspage.cpp + ../moo/mooutils/mooprefspage.c ../moo/mooutils/mooprefspage.h - ../moo/mooutils/moospawn.cpp + ../moo/mooutils/moospawn.c ../moo/mooutils/moospawn.h - ../moo/mooutils/moostock.cpp + ../moo/mooutils/moostock.c ../moo/mooutils/moostock.h ../moo/mooutils/moo-test-macros.h - ../moo/mooutils/moo-test-utils.cpp + ../moo/mooutils/moo-test-utils.c ../moo/mooutils/moo-test-utils.h ../moo/mooutils/mootypedecl-macros.h ../moo/mooutils/mootype-macros.h - ../moo/mooutils/moouixml.cpp + ../moo/mooutils/moouixml.c ../moo/mooutils/moouixml.h - ../moo/mooutils/mooundo.cpp + ../moo/mooutils/mooundo.c ../moo/mooutils/mooundo.h ../moo/mooutils/mooutils-debug.h ../moo/mooutils/mooutils-enums.c ../moo/mooutils/mooutils-enums.h - ../moo/mooutils/mooutils-file.cpp + ../moo/mooutils/mooutils-file.c ../moo/mooutils/mooutils-file.h - ../moo/mooutils/mooutils-fs.cpp + ../moo/mooutils/mooutils-fs.c ../moo/mooutils/mooutils-fs.h - ../moo/mooutils/mooutils-gobject.cpp + ../moo/mooutils/mooutils-gobject.c ../moo/mooutils/mooutils-gobject.h ../moo/mooutils/mooutils-gobject-private.h ../moo/mooutils/mooutils.h ../moo/mooutils/mooutils-macros.h ../moo/mooutils/mooutils-mem.h ../moo/mooutils/mooutils-messages.h - ../moo/mooutils/mooutils-misc.cpp + ../moo/mooutils/mooutils-misc.c ../moo/mooutils/mooutils-misc.h - ../moo/mooutils/mooutils-script.cpp + ../moo/mooutils/mooutils-script.c ../moo/mooutils/mooutils-script.h ../moo/mooutils/mooutils-tests.h - ../moo/mooutils/mooutils-thread.cpp + ../moo/mooutils/mooutils-thread.c ../moo/mooutils/mooutils-thread.h - ../moo/mooutils/mooutils-treeview.cpp + ../moo/mooutils/mooutils-treeview.c ../moo/mooutils/mooutils-treeview.h - ../moo/mooutils/mooutils-win32.cpp + ../moo/mooutils/mooutils-win32.c ../moo/mooutils/moowin32/mingw/fnmatch.h ../moo/mooutils/moowin32/mingw/netinet/in.h ../moo/mooutils/moowin32/ms/sys/time.h ../moo/mooutils/moowin32/ms/unistd.h - ../moo/mooutils/moowindow.cpp + ../moo/mooutils/moowindow.c ../moo/mooutils/moowindow.h ../moo/plugins/support/moocmdview.c ../moo/plugins/support/moocmdview.h @@ -343,7 +344,7 @@ LIST(APPEND built_moo_sources moo.xml.stamp) FILE(WRITE ${CMAKE_CURRENT_BINARY_DIR}/gengtkxml.cmake "EXECUTE_PROCESS(COMMAND ${MOO_PYTHON} ${CMAKE_CURRENT_SOURCE_DIR}/parsedocs.py - --source-file ${CMAKE_SOURCE_DIR}/moo/moolua/gtk-api.c + --source-file ${CMAKE_SOURCE_DIR}/moo/moolua/gtk-api.c --source-file ${CMAKE_SOURCE_DIR}/moo/moolua/gtk-api.h --module Gtk --output ${CMAKE_CURRENT_SOURCE_DIR}/gtk.xml diff --git a/api/mpi/luawriter.py b/api/mpi/luawriter.py index 15816e41..a3239485 100644 --- a/api/mpi/luawriter.py +++ b/api/mpi/luawriter.py @@ -204,29 +204,17 @@ class Writer(object): 'moo_lua_get_arg_enum (L, %(arg_idx)s, "%(param_name)s", ' + \ '%(gtype_id)s);') % dic) elif isinstance(param.type, ArrayType): + assert isinstance(param.type.elm_type, Class) dic['gtype_id'] = param.type.elm_type.gtype_id - if isinstance(param.type.elm_type, Class): - if param.default_value is not None: - func_body.start.append(('%(TypeName)s arg%(narg)d = (%(TypeName)s) ' + \ - 'moo_lua_get_arg_object_array_opt (L, %(arg_idx)s, "%(param_name)s", ' + \ - '%(gtype_id)s);') % dic) - else: - func_body.start.append(('%(TypeName)s arg%(narg)d = (%(TypeName)s) ' + \ - 'moo_lua_get_arg_object_array (L, %(arg_idx)s, "%(param_name)s", ' + \ - '%(gtype_id)s);') % dic) - func_body.end.append('moo_object_array_free ((MooObjectArray*) arg%(narg)d);' % dic) - elif isinstance(param.type.elm_type, Boxed): - if param.default_value is not None: - func_body.start.append(('%(TypeName)s arg%(narg)d = (%(TypeName)s) ' + \ - 'moo_lua_get_arg_boxed_array_opt (L, %(arg_idx)s, "%(param_name)s", ' + \ - '%(gtype_id)s);') % dic) - else: - func_body.start.append(('%(TypeName)s arg%(narg)d = (%(TypeName)s) ' + \ - 'moo_lua_get_arg_boxed_array (L, %(arg_idx)s, "%(param_name)s", ' + \ - '%(gtype_id)s);') % dic) - func_body.end.append('moo_boxed_array_free ((MooPtrArray*) arg%(narg)d, %(gtype_id)s);' % dic) + if param.default_value is not None: + func_body.start.append(('%(TypeName)s arg%(narg)d = (%(TypeName)s) ' + \ + 'moo_lua_get_arg_object_array_opt (L, %(arg_idx)s, "%(param_name)s", ' + \ + '%(gtype_id)s);') % dic) else: - raise "Arrays are not implemented for this type" + func_body.start.append(('%(TypeName)s arg%(narg)d = (%(TypeName)s) ' + \ + 'moo_lua_get_arg_object_array (L, %(arg_idx)s, "%(param_name)s", ' + \ + '%(gtype_id)s);') % dic) + func_body.end.append('moo_object_array_free ((MooObjectArray*) arg%(narg)d);' % dic) elif param.type.name == 'strv': assert param.default_value is None or param.default_value == 'NULL' if param.default_value is not None: @@ -339,15 +327,10 @@ class Writer(object): func_call = '%s ret = ' % meth.retval.type.name push_ret = 'moo_lua_push_int (L, ret);' % dic elif isinstance(meth.retval.type, ArrayType): + assert isinstance(meth.retval.type.elm_type, Class) dic['gtype_id'] = meth.retval.type.elm_type.gtype_id - if isinstance(meth.retval.type.elm_type, Class): - func_call = 'MooObjectArray *ret = (MooObjectArray*) ' - push_ret = 'moo_lua_push_object_array (L, ret, %(make_copy)s);' % dic - elif isinstance(meth.retval.type.elm_type, Boxed): - func_call = 'MooPtrArray *ret = (MooPtrArray*) ' - push_ret = 'moo_lua_push_boxed_array (L, ret, %(gtype_id)s, %(make_copy)s);' % dic - else: - raise "Arrays of this type are not implemented" + func_call = 'MooObjectArray *ret = (MooObjectArray*) ' + push_ret = 'moo_lua_push_object_array (L, ret, %(make_copy)s);' % dic elif meth.retval.type.name == 'strv': assert meth.retval.transfer_mode == 'full' func_call = 'char **ret = ' diff --git a/api/sourcefiles.mak b/api/sourcefiles.mak index f1df7995..b599bf58 100644 --- a/api/sourcefiles.mak +++ b/api/sourcefiles.mak @@ -1,35 +1,36 @@ source_files = \ ../moo/moolua/medit-lua.h\ ../moo/moolua/medit-lua.cpp\ - ../moo/mooapp/mooappabout.cpp\ + ../moo/mooapp/mooappabout.c\ ../moo/mooapp/mooappabout.h\ ../moo/mooapp/mooapp-accels.h\ - ../moo/mooapp/mooapp.cpp\ + ../moo/mooapp/mooapp.c\ ../moo/mooapp/mooapp.h\ ../moo/mooapp/mooapp-info.h\ ../moo/mooapp/mooapp-private.h\ - ../moo/mooapp/moohtml.cpp\ + ../moo/mooapp/moohtml.c\ ../moo/mooapp/moohtml.h\ - ../moo/mooapp/moolinklabel.cpp\ + ../moo/mooapp/moolinklabel.c\ ../moo/mooapp/moolinklabel.h\ ../moo/mooedit/mooedit-accels.h\ ../moo/mooedit/mooeditaction.c\ - ../moo/mooedit/mooeditaction-factory.cpp\ + ../moo/mooedit/mooeditaction-factory.c\ ../moo/mooedit/mooeditaction-factory.h\ ../moo/mooedit/mooeditaction.h\ - ../moo/mooedit/mooeditbookmark.cpp\ + ../moo/mooedit/mooeditbookmark.c\ ../moo/mooedit/mooeditbookmark.h\ - ../moo/mooedit/mooedit.cpp\ + ../moo/mooedit/mooedit.c\ ../moo/mooedit/mooeditconfig.c\ ../moo/mooedit/mooeditconfig.h\ - ../moo/mooedit/mooeditdialogs.cpp\ + ../moo/mooedit/mooeditdialogs.c\ ../moo/mooedit/mooeditdialogs.h\ ../moo/mooedit/mooedit-enum-types.c\ ../moo/mooedit/mooedit-enum-types.h\ ../moo/mooedit/mooedit-enums.h\ - ../moo/mooedit/mooeditfileinfo.cpp\ + ../moo/mooedit/mooeditfileinfo.c\ + ../moo/mooedit/mooeditfileinfo.c\ ../moo/mooedit/mooeditfileinfo.h\ - ../moo/mooedit/mooedit-fileops.cpp\ + ../moo/mooedit/mooedit-fileops.c\ ../moo/mooedit/mooedit-fileops.h\ ../moo/mooedit/mooeditfiltersettings.c\ ../moo/mooedit/mooeditfiltersettings.h\ @@ -43,16 +44,16 @@ source_files = \ ../moo/mooedit/mooeditor-private.h\ ../moo/mooedit/mooeditor-tests.c\ ../moo/mooedit/mooeditor-tests.h\ - ../moo/mooedit/mooeditprefs.cpp\ + ../moo/mooedit/mooeditprefs.c\ ../moo/mooedit/mooeditprefs.h\ ../moo/mooedit/mooeditprefspage.c\ ../moo/mooedit/mooedit-private.h\ ../moo/mooedit/mooedit-script.c\ ../moo/mooedit/mooedit-script.h\ - ../moo/mooedit/mooedittab.cpp\ + ../moo/mooedit/mooedittab.c\ ../moo/mooedit/mooedittab.h\ ../moo/mooedit/mooedittypes.h\ - ../moo/mooedit/mooeditview.cpp\ + ../moo/mooedit/mooeditview.c\ ../moo/mooedit/mooeditview.h\ ../moo/mooedit/mooeditview-script.c\ ../moo/mooedit/mooeditview-script.h\ @@ -65,7 +66,7 @@ source_files = \ ../moo/mooedit/mooindenter.h\ ../moo/mooedit/moolang.c\ ../moo/mooedit/moolang.h\ - ../moo/mooedit/moolangmgr.cpp\ + ../moo/mooedit/moolangmgr.c\ ../moo/mooedit/moolangmgr.h\ ../moo/mooedit/moolangmgr-private.h\ ../moo/mooedit/moolang-private.h\ @@ -97,171 +98,171 @@ source_files = \ ../moo/mooedit/mootextview.h\ ../moo/mooedit/mootextview-input.c\ ../moo/mooedit/mootextview-private.h\ - ../moo/moofileview/moobookmarkmgr.cpp\ + ../moo/moofileview/moobookmarkmgr.c\ ../moo/moofileview/moobookmarkmgr.h\ - ../moo/moofileview/moobookmarkview.cpp\ + ../moo/moofileview/moobookmarkview.c\ ../moo/moofileview/moobookmarkview.h\ - ../moo/moofileview/moofile.cpp\ - ../moo/moofileview/moofileentry.cpp\ + ../moo/moofileview/moofile.c\ + ../moo/moofileview/moofileentry.c\ ../moo/moofileview/moofileentry.h\ ../moo/moofileview/moofile.h\ ../moo/moofileview/moofile-private.h\ - ../moo/moofileview/moofilesystem.cpp\ + ../moo/moofileview/moofilesystem.c\ ../moo/moofileview/moofilesystem.h\ ../moo/moofileview/moofileview-accels.h\ ../moo/moofileview/moofileview-aux.h\ - ../moo/moofileview/moofileview.cpp\ - ../moo/moofileview/moofileview-dialogs.cpp\ + ../moo/moofileview/moofileview.c\ + ../moo/moofileview/moofileview-dialogs.c\ ../moo/moofileview/moofileview-dialogs.h\ ../moo/moofileview/moofileview.h\ ../moo/moofileview/moofileview-impl.h\ ../moo/moofileview/moofileview-private.h\ - ../moo/moofileview/moofileview-tools.cpp\ + ../moo/moofileview/moofileview-tools.c\ ../moo/moofileview/moofileview-tools.h\ - ../moo/moofileview/moofolder.cpp\ + ../moo/moofileview/moofolder.c\ ../moo/moofileview/moofolder.h\ - ../moo/moofileview/moofoldermodel.cpp\ + ../moo/moofileview/moofoldermodel.c\ ../moo/moofileview/moofoldermodel.h\ ../moo/moofileview/moofoldermodel-private.h\ ../moo/moofileview/moofolder-private.h\ - ../moo/moofileview/mooiconview.cpp\ + ../moo/moofileview/mooiconview.c\ ../moo/moofileview/mooiconview.h\ - ../moo/moofileview/mootreeview.cpp\ + ../moo/moofileview/mootreeview.c\ ../moo/moofileview/mootreeview.h\ - ../moo/mooutils/mooaccelbutton.cpp\ + ../moo/mooutils/mooaccelbutton.c\ ../moo/mooutils/mooaccelbutton.h\ - ../moo/mooutils/mooaccel.cpp\ + ../moo/mooutils/mooaccel.c\ ../moo/mooutils/mooaccel.h\ - ../moo/mooutils/mooaccelprefs.cpp\ + ../moo/mooutils/mooaccelprefs.c\ ../moo/mooutils/mooaccelprefs.h\ - ../moo/mooutils/mooactionbase.cpp\ + ../moo/mooutils/mooactionbase.c\ ../moo/mooutils/mooactionbase.h\ ../moo/mooutils/mooactionbase-private.h\ - ../moo/mooutils/mooaction.cpp\ - ../moo/mooutils/mooactioncollection.cpp\ + ../moo/mooutils/mooaction.c\ + ../moo/mooutils/mooactioncollection.c\ ../moo/mooutils/mooactioncollection.h\ - ../moo/mooutils/mooactionfactory.cpp\ + ../moo/mooutils/mooactionfactory.c\ ../moo/mooutils/mooactionfactory.h\ - ../moo/mooutils/mooactiongroup.cpp\ + ../moo/mooutils/mooactiongroup.c\ ../moo/mooutils/mooactiongroup.h\ ../moo/mooutils/mooaction.h\ ../moo/mooutils/mooaction-private.h\ - ../moo/mooutils/mooappinput-common.cpp\ + ../moo/mooutils/mooappinput-common.c\ ../moo/mooutils/mooappinput.h\ - ../moo/mooutils/mooapp-ipc.cpp\ + ../moo/mooutils/mooapp-ipc.c\ ../moo/mooutils/mooapp-ipc.h\ ../moo/mooutils/mooarray.h\ ../moo/mooutils/mooatom.h\ - ../moo/mooutils/moobigpaned.cpp\ + ../moo/mooutils/moobigpaned.c\ ../moo/mooutils/moobigpaned.h\ - ../moo/mooutils/mooclosure.cpp\ + ../moo/mooutils/mooclosure.c\ ../moo/mooutils/mooclosure.h\ - ../moo/mooutils/moocombo.cpp\ + ../moo/mooutils/moocombo.c\ ../moo/mooutils/moocombo.h\ ../moo/mooutils/moocompat.h\ - ../moo/mooutils/moodialogs.cpp\ + ../moo/mooutils/moodialogs.c\ ../moo/mooutils/moodialogs.h\ - ../moo/mooutils/mooeditops.cpp\ + ../moo/mooutils/mooeditops.c\ ../moo/mooutils/mooeditops.h\ - ../moo/mooutils/mooencodings.cpp\ + ../moo/mooutils/mooencodings.c\ ../moo/mooutils/mooencodings-data.h\ ../moo/mooutils/mooencodings.h\ - ../moo/mooutils/mooentry.cpp\ + ../moo/mooutils/mooentry.c\ ../moo/mooutils/mooentry.h\ ../moo/mooutils/moo-environ.h\ - ../moo/mooutils/moofiledialog.cpp\ + ../moo/mooutils/moofiledialog.c\ ../moo/mooutils/moofiledialog.h\ - ../moo/mooutils/moofileicon.cpp\ + ../moo/mooutils/moofileicon.c\ ../moo/mooutils/moofileicon.h\ - ../moo/mooutils/moofilewatch.cpp\ + ../moo/mooutils/moofilewatch.c\ ../moo/mooutils/moofilewatch.h\ - ../moo/mooutils/moofilewriter.cpp\ + ../moo/mooutils/moofilewriter.c\ ../moo/mooutils/moofilewriter.h\ ../moo/mooutils/moofilewriter-private.h\ - ../moo/mooutils/moofiltermgr.cpp\ + ../moo/mooutils/moofiltermgr.c\ ../moo/mooutils/moofiltermgr.h\ ../moo/mooutils/moofontsel.c\ ../moo/mooutils/moofontsel.h\ - ../moo/mooutils/mooglade.cpp\ + ../moo/mooutils/mooglade.c\ ../moo/mooutils/mooglade.h\ - ../moo/mooutils/moohelp.cpp\ + ../moo/mooutils/moohelp.c\ ../moo/mooutils/moohelp.h\ - ../moo/mooutils/moohistorycombo.cpp\ + ../moo/mooutils/moohistorycombo.c\ ../moo/mooutils/moohistorycombo.h\ - ../moo/mooutils/moohistorylist.cpp\ + ../moo/mooutils/moohistorylist.c\ ../moo/mooutils/moohistorylist.h\ - ../moo/mooutils/moohistorymgr.cpp\ + ../moo/mooutils/moohistorymgr.c\ ../moo/mooutils/moohistorymgr.h\ - ../moo/mooutils/mooi18n.cpp\ + ../moo/mooutils/mooi18n.c\ ../moo/mooutils/mooi18n.h\ ../moo/mooutils/moolist.h\ - ../moo/mooutils/moomarkup.cpp\ + ../moo/mooutils/moomarkup.c\ ../moo/mooutils/moomarkup.h\ - ../moo/mooutils/moomenuaction.cpp\ + ../moo/mooutils/moomenuaction.c\ ../moo/mooutils/moomenuaction.h\ - ../moo/mooutils/moomenu.cpp\ + ../moo/mooutils/moomenu.c\ ../moo/mooutils/moomenu.h\ - ../moo/mooutils/moomenumgr.cpp\ + ../moo/mooutils/moomenumgr.c\ ../moo/mooutils/moomenumgr.h\ - ../moo/mooutils/moomenutoolbutton.cpp\ + ../moo/mooutils/moomenutoolbutton.c\ ../moo/mooutils/moomenutoolbutton.h\ - ../moo/mooutils/moo-mime.cpp\ + ../moo/mooutils/moo-mime.c\ ../moo/mooutils/moo-mime.h\ - ../moo/mooutils/moonotebook.cpp\ + ../moo/mooutils/moonotebook.c\ ../moo/mooutils/moonotebook.h\ ../moo/mooutils/mooonce.h\ - ../moo/mooutils/moopane.cpp\ - ../moo/mooutils/moopaned.cpp\ + ../moo/mooutils/moopane.c\ + ../moo/mooutils/moopaned.c\ ../moo/mooutils/moopaned.h\ ../moo/mooutils/moopane.h\ - ../moo/mooutils/mooprefs.cpp\ - ../moo/mooutils/mooprefsdialog.cpp\ + ../moo/mooutils/mooprefs.c\ + ../moo/mooutils/mooprefsdialog.c\ ../moo/mooutils/mooprefsdialog.h\ ../moo/mooutils/mooprefs.h\ - ../moo/mooutils/mooprefspage.cpp\ + ../moo/mooutils/mooprefspage.c\ ../moo/mooutils/mooprefspage.h\ - ../moo/mooutils/moospawn.cpp\ + ../moo/mooutils/moospawn.c\ ../moo/mooutils/moospawn.h\ - ../moo/mooutils/moostock.cpp\ + ../moo/mooutils/moostock.c\ ../moo/mooutils/moostock.h\ ../moo/mooutils/moo-test-macros.h\ - ../moo/mooutils/moo-test-utils.cpp\ + ../moo/mooutils/moo-test-utils.c\ ../moo/mooutils/moo-test-utils.h\ ../moo/mooutils/mootypedecl-macros.h\ ../moo/mooutils/mootype-macros.h\ - ../moo/mooutils/moouixml.cpp\ + ../moo/mooutils/moouixml.c\ ../moo/mooutils/moouixml.h\ - ../moo/mooutils/mooundo.cpp\ + ../moo/mooutils/mooundo.c\ ../moo/mooutils/mooundo.h\ ../moo/mooutils/mooutils-debug.h\ ../moo/mooutils/mooutils-enums.c\ ../moo/mooutils/mooutils-enums.h\ - ../moo/mooutils/mooutils-file.cpp\ + ../moo/mooutils/mooutils-file.c\ ../moo/mooutils/mooutils-file.h\ - ../moo/mooutils/mooutils-fs.cpp\ + ../moo/mooutils/mooutils-fs.c\ ../moo/mooutils/mooutils-fs.h\ - ../moo/mooutils/mooutils-gobject.cpp\ + ../moo/mooutils/mooutils-gobject.c\ ../moo/mooutils/mooutils-gobject.h\ ../moo/mooutils/mooutils-gobject-private.h\ ../moo/mooutils/mooutils.h\ ../moo/mooutils/mooutils-macros.h\ ../moo/mooutils/mooutils-mem.h\ ../moo/mooutils/mooutils-messages.h\ - ../moo/mooutils/mooutils-misc.cpp\ + ../moo/mooutils/mooutils-misc.c\ ../moo/mooutils/mooutils-misc.h\ - ../moo/mooutils/mooutils-script.cpp\ + ../moo/mooutils/mooutils-script.c\ ../moo/mooutils/mooutils-script.h\ ../moo/mooutils/mooutils-tests.h\ - ../moo/mooutils/mooutils-thread.cpp\ + ../moo/mooutils/mooutils-thread.c\ ../moo/mooutils/mooutils-thread.h\ - ../moo/mooutils/mooutils-treeview.cpp\ + ../moo/mooutils/mooutils-treeview.c\ ../moo/mooutils/mooutils-treeview.h\ - ../moo/mooutils/mooutils-win32.cpp\ + ../moo/mooutils/mooutils-win32.c\ ../moo/mooutils/moowin32/mingw/fnmatch.h\ ../moo/mooutils/moowin32/mingw/netinet/in.h\ ../moo/mooutils/moowin32/ms/sys/time.h\ ../moo/mooutils/moowin32/ms/unistd.h\ - ../moo/mooutils/moowindow.cpp\ + ../moo/mooutils/moowindow.c\ ../moo/mooutils/moowindow.h\ ../moo/plugins/support/moocmdview.c\ ../moo/plugins/support/moocmdview.h\ diff --git a/cmake/PrecompiledHeader.cmake b/cmake/PrecompiledHeader.cmake deleted file mode 100644 index 83524916..00000000 --- a/cmake/PrecompiledHeader.cmake +++ /dev/null @@ -1,222 +0,0 @@ -# Function for setting up precompiled headers. Usage: -# -# add_library/executable(target -# pchheader.c pchheader.cpp pchheader.h) -# -# add_precompiled_header(target pchheader.h -# [FORCEINCLUDE] -# [SOURCE_C pchheader.c] -# [SOURCE_CXX pchheader.cpp]) -# -# Options: -# -# FORCEINCLUDE: Add compiler flags to automatically include the -# pchheader.h from every source file. Works with both GCC and -# MSVC. This is recommended. -# -# SOURCE_C/CXX: Specifies the .c/.cpp source file that includes -# pchheader.h for generating the pre-compiled header -# output. Defaults to pchheader.c. Only required for MSVC. -# -# Caveats: -# -# * Its not currently possible to use the same precompiled-header in -# more than a single target in the same directory (No way to set -# the source file properties differently for each target). -# -# * MSVC: A source file with the same name as the header must exist -# and be included in the target (E.g. header.cpp). Name of file -# can be changed using the SOURCE_CXX/SOURCE_C options. -# -# License: -# -# Copyright (C) 2009-2013 Lars Christensen -# -# Permission is hereby granted, free of charge, to any person -# obtaining a copy of this software and associated documentation files -# (the 'Software') deal in the Software without restriction, -# including without limitation the rights to use, copy, modify, merge, -# publish, distribute, sublicense, and/or sell copies of the Software, -# and to permit persons to whom the Software is furnished to do so, -# subject to the following conditions: -# -# The above copyright notice and this permission notice shall be -# included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS -# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN -# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -include(CMakeParseArguments) - -macro(combine_arguments _variable) - set(_result "") - foreach(_element ${${_variable}}) - set(_result "${_result} \"${_element}\"") - endforeach() - string(STRIP "${_result}" _result) - set(${_variable} "${_result}") -endmacro() - -function(export_all_flags _filename) - set(_include_directories "$") - set(_compile_definitions "$") - set(_compile_flags "$") - set(_compile_options "$") - set(_include_directories "$<$:-I$\n>") - set(_compile_definitions "$<$:-D$\n>") - set(_compile_flags "$<$:$\n>") - set(_compile_options "$<$:$\n>") - file(GENERATE OUTPUT "${_filename}" CONTENT "${_compile_definitions}${_include_directories}${_compile_flags}${_compile_options}\n") -endfunction() - -function(add_precompiled_header _target _input) - cmake_parse_arguments(_PCH "FORCEINCLUDE" "SOURCE_CXX:SOURCE_C" "" ${ARGN}) - - get_filename_component(_input_we ${_input} NAME_WE) - if(NOT _PCH_SOURCE_CXX) - set(_PCH_SOURCE_CXX "${_input_we}.cpp") - endif() - if(NOT _PCH_SOURCE_C) - set(_PCH_SOURCE_C "${_input_we}.c") - endif() - - if(MSVC) - - set(_cxx_path "${CMAKE_CFG_INTDIR}/${_target}_cxx_pch") - set(_c_path "${CMAKE_CFG_INTDIR}/${_target}_c_pch") - make_directory("${_cxx_path}") - make_directory("${_c_path}") - set(_pch_cxx_header "${_cxx_path}/${_input}") - set(_pch_cxx_pch "${_cxx_path}/${_input_we}.pch") - set(_pch_c_header "${_c_path}/${_input}") - set(_pch_c_pch "${_c_path}/${_input_we}.pch") - - get_target_property(sources ${_target} SOURCES) - foreach(_source ${sources}) - set(_pch_compile_flags "") - if(_source MATCHES \\.\(cc|cxx|cpp|c\)$) - if(_source MATCHES \\.\(cpp|cxx|cc\)$) - set(_pch_header "${_input}") - set(_pch "${_pch_cxx_pch}") - else() - set(_pch_header "${_input}") - set(_pch "${_pch_c_pch}") - endif() - - if(_source STREQUAL "${_PCH_SOURCE_CXX}") - set(_pch_compile_flags "${_pch_compile_flags} \"/Fp${_pch_cxx_pch}\" /Yc${_input}") - set(_pch_source_cxx_found TRUE) - elseif(_source STREQUAL "${_PCH_SOURCE_C}") - set(_pch_compile_flags "${_pch_compile_flags} \"/Fp${_pch_c_pch}\" /Yc${_input}") - set(_pch_source_c_found TRUE) - else() - if(_source MATCHES \\.\(cpp|cxx|cc\)$) - set(_pch_compile_flags "${_pch_compile_flags} \"/Fp${_pch_cxx_pch}\" /Yu${_input}") - set(_pch_source_cxx_needed TRUE) - else() - set(_pch_compile_flags "${_pch_compile_flags} \"/Fp${_pch_c_pch}\" /Yu${_input}") - set(_pch_source_c_needed TRUE) - endif() - if(_PCH_FORCEINCLUDE) - set(_pch_compile_flags "${_pch_compile_flags} /FI${_input}") - endif(_PCH_FORCEINCLUDE) - endif() - - get_source_file_property(_object_depends "${_source}" OBJECT_DEPENDS) - if(NOT _object_depends) - set(_object_depends) - endif() - if(_PCH_FORCEINCLUDE) - if(_source MATCHES \\.\(cc|cxx|cpp\)$) - list(APPEND _object_depends "${_pch_header}") - else() - list(APPEND _object_depends "${_pch_header}") - endif() - endif() - - set_source_files_properties(${_source} PROPERTIES - COMPILE_FLAGS "${_pch_compile_flags}" - OBJECT_DEPENDS "${_object_depends}") - endif() - endforeach() - - if(_pch_source_cxx_needed AND NOT _pch_source_cxx_found) - message(FATAL_ERROR "A source file ${_PCH_SOURCE_CXX} for ${_input} is required for MSVC builds. Can be set with the SOURCE_CXX option.") - endif() - if(_pch_source_c_needed AND NOT _pch_source_c_found) - message(FATAL_ERROR "A source file ${_PCH_SOURCE_C} for ${_input} is required for MSVC builds. Can be set with the SOURCE_C option.") - endif() - endif(MSVC) - - if(CMAKE_COMPILER_IS_GNUCXX) - get_filename_component(_name ${_input} NAME) - set(_pch_header "${CMAKE_CURRENT_SOURCE_DIR}/${_input}") - set(_pch_binary_dir "${CMAKE_CURRENT_BINARY_DIR}/${_target}_pch") - set(_pchfile "${_pch_binary_dir}/${_input}") - set(_outdir "${CMAKE_CURRENT_BINARY_DIR}/${_target}_pch/${_name}.gch") - make_directory(${_outdir}) - set(_output_cxx "${_outdir}/.c++") - set(_output_c "${_outdir}/.c") - - set(_pch_flags_file "${_pch_binary_dir}/compile_flags.rsp") - export_all_flags("${_pch_flags_file}") - set(_compiler_FLAGS "@${_pch_flags_file}") - add_custom_command( - OUTPUT "${_pchfile}" - COMMAND "${CMAKE_COMMAND}" -E copy "${_pch_header}" "${_pchfile}" - DEPENDS "${_pch_header}" - COMMENT "Updating ${_name}") - add_custom_command( - OUTPUT "${_output_cxx}" - COMMAND "${CMAKE_CXX_COMPILER}" ${_compiler_FLAGS} -x c++-header -o "${_output_cxx}" "${_pchfile}" - DEPENDS "${_pchfile}" "${_pch_flags_file}" - COMMENT "Precompiling ${_name} for ${_target} (C++)") - add_custom_command( - OUTPUT "${_output_c}" - COMMAND "${CMAKE_C_COMPILER}" ${_compiler_FLAGS} -x c-header -o "${_output_c}" "${_pchfile}" - DEPENDS "${_pchfile}" "${_pch_flags_file}" - COMMENT "Precompiling ${_name} for ${_target} (C)") - - get_property(_sources TARGET ${_target} PROPERTY SOURCES) - foreach(_source ${_sources}) - set(_pch_compile_flags "") - - if(_source MATCHES \\.\(cc|cxx|cpp|c\)$) - get_source_file_property(_pch_compile_flags "${_source}" COMPILE_FLAGS) - if(NOT _pch_compile_flags) - set(_pch_compile_flags) - endif() - separate_arguments(_pch_compile_flags) - list(APPEND _pch_compile_flags -Winvalid-pch) - if(_PCH_FORCEINCLUDE) - list(APPEND _pch_compile_flags -include "${_pchfile}") - else(_PCH_FORCEINCLUDE) - list(APPEND _pch_compile_flags "-I${_pch_binary_dir}") - endif(_PCH_FORCEINCLUDE) - - get_source_file_property(_object_depends "${_source}" OBJECT_DEPENDS) - if(NOT _object_depends) - set(_object_depends) - endif() - list(APPEND _object_depends "${_pchfile}") - if(_source MATCHES \\.\(cc|cxx|cpp\)$) - list(APPEND _object_depends "${_output_cxx}") - else() - list(APPEND _object_depends "${_output_c}") - endif() - - combine_arguments(_pch_compile_flags) - message("${_source}" ${_pch_compile_flags}) - set_source_files_properties(${_source} PROPERTIES - COMPILE_FLAGS "${_pch_compile_flags}" - OBJECT_DEPENDS "${_object_depends}") - endif() - endforeach() - endif(CMAKE_COMPILER_IS_GNUCXX) -endfunction() diff --git a/config-cmake.h.in b/config-cmake.h.in index 2ee129c0..e247ae47 100644 --- a/config-cmake.h.in +++ b/config-cmake.h.in @@ -1,48 +1,30 @@ -#pragma once - -#define MOO_PACKAGE_NAME "@MOO_PACKAGE_NAME@" - -#define MOO_WEBSITE "@MOO_WEBSITE@" -#define MOO_WEB_CONTACT "@MOO_WEB_CONTACT@" -#define MOO_EMAIL "@MOO_EMAIL@" -#define MOO_COPYRIGHT "@MOO_COPYRIGHT@" -#define PACKAGE_BUGREPORT "@MOO_EMAIL@" - -#define GETTEXT_PACKAGE "@GETTEXT_PACKAGE@" - -#define MOO_PREFS_XML_FILE_NAME "@MOO_PREFS_XML_FILE_NAME@" -#define MOO_STATE_XML_FILE_NAME "@MOO_STATE_XML_FILE_NAME@" -#define MOO_NAMED_SESSION_XML_FILE_NAME "@MOO_NAMED_SESSION_XML_FILE_NAME@" -#define MOO_SESSION_XML_FILE_NAME "@MOO_SESSION_XML_FILE_NAME@" - -#define MEDIT_PORTABLE_DATA_DIR "@MEDIT_PORTABLE_DATA_DIR@" -#define MEDIT_PORTABLE_CACHE_DIR "@MEDIT_PORTABLE_CACHE_DIR@" -#define MEDIT_PORTABLE_MAGIC_FILE_NAME "@MEDIT_PORTABLE_MAGIC_FILE_NAME@" - -#define MOO_VERSION "@MOO_VERSION@" -#define MOO_DISPLAY_VERSION "@MOO_DISPLAY_VERSION@" -#define MOO_MAJOR_VERSION @MOO_MAJOR_VERSION@ -#define MOO_MICRO_VERSION @MOO_MICRO_VERSION@ -#define MOO_MINOR_VERSION @MOO_MINOR_VERSION@ -#define MOO_MODULE_MAJOR_VERSION @MOO_MODULE_MAJOR_VERSION@ -#define MOO_MODULE_MINOR_VERSION @MOO_MODULE_MINOR_VERSION@ - -#cmakedefine MOO_BUILD_FROM_MINGW 1 -#cmakedefine MOO_BUILD_FROM_MSVC 1 - -#cmakedefine MOO_BUILD_CTAGS 1 -#cmakedefine MOO_ENABLE_COVERAGE 1 -#cmakedefine MOO_ENABLE_PYTHON 1 -#cmakedefine MOO_BROKEN_GTK_THEME 1 -#cmakedefine MOO_NEED_GETTIMEOFDAY 1 - -#cmakedefine ENABLE_NLS 1 -#cmakedefine HAVE_BIND_TEXTDOMAIN_CODESET 1 -#cmakedefine HAVE_GETC_UNLOCKED 1 -#cmakedefine HAVE_MMAP 1 -#cmakedefine HAVE_UNISTD_H 1 -#cmakedefine HAVE_SYS_UTSNAME_H 1 -#cmakedefine HAVE_SIGNAL_H 1 -#cmakedefine HAVE_SYS_WAIT_H 1 - -#include +#pragma once + +#define MOO_PACKAGE_NAME "@MOO_PACKAGE_NAME@" + +#define MOO_DISPLAY_VERSION "@MOO_DISPLAY_VERSION@" + +#define MOO_WEBSITE "@MOO_WEBSITE@" +#define MOO_WEB_CONTACT "@MOO_WEB_CONTACT@" +#define MOO_EMAIL "@MOO_EMAIL@" +#define MOO_COPYRIGHT "@MOO_COPYRIGHT@" +#define PACKAGE_BUGREPORT "@MOO_EMAIL@" + +#define GETTEXT_PACKAGE "@GETTEXT_PACKAGE@" + +#define MOO_PREFS_XML_FILE_NAME "@MOO_PREFS_XML_FILE_NAME@" +#define MOO_STATE_XML_FILE_NAME "@MOO_STATE_XML_FILE_NAME@" +#define MOO_NAMED_SESSION_XML_FILE_NAME "@MOO_NAMED_SESSION_XML_FILE_NAME@" +#define MOO_SESSION_XML_FILE_NAME "@MOO_SESSION_XML_FILE_NAME@" + +#define MEDIT_PORTABLE_DATA_DIR "@MEDIT_PORTABLE_DATA_DIR@" +#define MEDIT_PORTABLE_CACHE_DIR "@MEDIT_PORTABLE_CACHE_DIR@" +#define MEDIT_PORTABLE_MAGIC_FILE_NAME "@MEDIT_PORTABLE_MAGIC_FILE_NAME@" + +#define MOO_VERSION "@MOO_VERSION@" +#define MOO_DISPLAY_VERSION "@MOO_DISPLAY_VERSION@" +#define MOO_MAJOR_VERSION @MOO_MAJOR_VERSION@ +#define MOO_MICRO_VERSION @MOO_MICRO_VERSION@ +#define MOO_MINOR_VERSION @MOO_MINOR_VERSION@ +#define MOO_MODULE_MAJOR_VERSION @MOO_MODULE_MAJOR_VERSION@ +#define MOO_MODULE_MINOR_VERSION @MOO_MODULE_MINOR_VERSION@ diff --git a/configure.ac b/configure.ac index e3b251ae..c00bc5b4 100644 --- a/configure.ac +++ b/configure.ac @@ -85,8 +85,10 @@ if test x$MOO_DEV_MODE = "xyes" -a "x$XSLTPROC" = "x"; then fi AC_CONFIG_HEADERS([config.h]) -AH_TOP([#pragma once]) -AH_BOTTOM([#include ]) +AH_TOP([#ifndef __CONFIG_H__ +#define __CONFIG_H__]) +AH_BOTTOM([#include +#endif // __CONFIG_H__]) MOO_LT_LIB_M @@ -124,6 +126,13 @@ if $MOO_BUILD_MODULE; then fi fi +if $MOO_BUILD_APP; then + AC_DEFINE(MOO_BUILD_APP, 1, [build medit application]) +fi +if $MOO_BUILD_MODULE; then + AC_DEFINE(MOO_BUILD_MODULE, 1, [build standalone python module]) +fi + AM_CONDITIONAL(MOO_BUILD_APP, [$MOO_BUILD_APP]) AM_CONDITIONAL(MOO_BUILD_MODULE, [$MOO_BUILD_MODULE]) diff --git a/m4/moo-flags.m4 b/m4/moo-flags.m4 index 0fbe191a..d3c7ba96 100644 --- a/m4/moo-flags.m4 +++ b/m4/moo-flags.m4 @@ -194,6 +194,8 @@ AC_DEFUN_ONCE([MOO_AC_FLAGS],[ AC_CHECK_FUNCS(mmap) + AC_DEFINE(MOO_COMPILATION, 1, [must be 1]) + moo_top_src_dir=`cd $srcdir && pwd` MOO_CFLAGS="$MOO_CFLAGS $GTK_CFLAGS" MOO_CXXFLAGS="$MOO_CXXFLAGS $GTK_CFLAGS" diff --git a/m4/moo-intltool.m4 b/m4/moo-intltool.m4 index 7d19b597..ace37def 100644 --- a/m4/moo-intltool.m4 +++ b/m4/moo-intltool.m4 @@ -24,7 +24,6 @@ AC_DEFUN([MOO_INTL],[ AC_SUBST([ENABLE_NLS]) if test "$ENABLE_NLS" = "yes"; then _MOO_INTLTOOL - AC_DEFINE(ENABLE_NLS, 1) else _MOO_INTLTOOL_NO_NLS fi diff --git a/moo/CMakeLists.txt b/moo/CMakeLists.txt index 357029c7..05a45ad7 100644 --- a/moo/CMakeLists.txt +++ b/moo/CMakeLists.txt @@ -1,199 +1,170 @@ -FILE(WRITE ${CMAKE_CURRENT_BINARY_DIR}/genmarshals_h.cmake -"EXECUTE_PROCESS(COMMAND ${GLIB_GENMARSHAL} --prefix=_moo_marshal --header ${CMAKE_CURRENT_SOURCE_DIR}/marshals.list - RESULT_VARIABLE result - OUTPUT_VARIABLE output - ERROR_VARIABLE error - OUTPUT_FILE marshals.h.tmp) -if(NOT result EQUAL 0) - MESSAGE(FATAL_ERROR \"Error generating marshals.h: \${output} \${error}\") -endif() -file(RENAME marshals.h.tmp marshals.h) -") -add_custom_command(OUTPUT marshals.h - COMMAND ${CMAKE_COMMAND} -P genmarshals_h.cmake - MAIN_DEPENDENCY marshals.list) -LIST(APPEND built_moo_sources marshals.h) - -macro(ADD_GXML input) - string(REPLACE ".glade" "-gxml.h" _gxml_output "${input}") - string(REPLACE "/glade/" "/" _gxml_output "${_gxml_output}") - #message(STATUS "_gxml_output: ${_gxml_output}") - add_custom_command(OUTPUT ${_gxml_output} - COMMAND ${MOO_PYTHON} ${CMAKE_SOURCE_DIR}/tools/glade2c.py --output=${_gxml_output} ${CMAKE_CURRENT_SOURCE_DIR}/${input} - MAIN_DEPENDENCY ${input} - DEPENDS ${CMAKE_SOURCE_DIR}/tools/glade2c.py - COMMENT "Generating ${_gxml_output} from ${input}") - list(APPEND built_moo_sources ${_gxml_output}) -endmacro(ADD_GXML) - -macro(XML2H _xml2h_input _xml2h_output _xml2h_variable) - add_custom_command(OUTPUT ${_xml2h_output} - COMMAND ${MOO_PYTHON} ${CMAKE_SOURCE_DIR}/tools/xml2h.py ${CMAKE_CURRENT_SOURCE_DIR}/${_xml2h_input} ${_xml2h_output} ${_xml2h_variable} - MAIN_DEPENDENCY ${_xml2h_input} - DEPENDS ${CMAKE_SOURCE_DIR}/tools/xml2h.py - COMMENT "Generating ${_xml2h_output} from ${_xml2h_input}") - list(APPEND built_moo_sources ${_xml2h_output}) -endmacro(XML2H) - -macro(ADD_UI input) - string(REPLACE ".xml" "-ui.h" _ui_output "${input}") -# message(STATUS "_ui_output: ${_ui_output}") - string(REGEX REPLACE ".*/([^/]*)\\.xml" "\\1" _ui_variable "${input}") - XML2H(${input} ${_ui_output} ${_ui_variable}_ui_xml) -endmacro(ADD_UI) - -file(MAKE_DIRECTORY - ${CMAKE_CURRENT_BINARY_DIR}/mooapp - ${CMAKE_CURRENT_BINARY_DIR}/mooedit - ${CMAKE_CURRENT_BINARY_DIR}/moofileview - ${CMAKE_CURRENT_BINARY_DIR}/mooutils - ${CMAKE_CURRENT_BINARY_DIR}/moolua - ${CMAKE_CURRENT_BINARY_DIR}/plugins/usertools - ${CMAKE_CURRENT_BINARY_DIR}/medit-app -) - -include_directories(${PROJECT_SOURCE_DIR}/moo/mooutils/moowin32/ms) - -include_directories( - ${PROJECT_BINARY_DIR} - ${GTK_INCLUDE_DIRS} - ${LIBXML2_INCLUDE_DIRS} -) -link_directories(${GTK_LIBRARY_DIRS} ${GMODULE_LIBRARY_DIRS}) - -include(xdgmime/xdgmime.cmake) -include(mooutils/mooutils.cmake) -include(moocpp/moocpp.cmake) -#include(moogpp/moogpp.cmake) -include(mooedit/mooedit.cmake) -include(moofileview/moofileview.cmake) -include(gtksourceview/gtksourceview.cmake) -if(NOT MOO_OS_WIN32) - include(eggsmclient/eggsmclient.cmake) -endif() -include(mooapp/mooapp.cmake) -include(moolua/moolua.cmake) -if(MOO_ENABLE_PYTHON) - include(moopython/moopython.cmake) -endif() -include(plugins/plugins.cmake) -include(medit-app/medit-app.cmake) - -SET(MEDIT_SOURCES - CMakeLists.txt - ${moo_sources} - ${built_moo_sources} -) - -macro(ADD_MODULE name) - string(REPLACE "-" "_" _escaped_name "${name}") - source_group(${name} FILES ${${_escaped_name}_sources} ${${_escaped_name}_extra_files}) - source_group(${name}\\generated FILES ${built_${_escaped_name}_sources}) - #source_group(${name} FILES ${${_escaped_name}_sources} ${${_escaped_name}_extra_files}) - #source_group(${name}\\generated FILES ${built_${_escaped_name}_sources}) - LIST(APPEND MEDIT_SOURCES ${${_escaped_name}_sources} ${built_${_escaped_name}_sources}) - LIST(APPEND MEDIT_EXTRA_DIST ${${_escaped_name}_extra_dist} ${${_escaped_name}_extra_files}) -endmacro(ADD_MODULE) - -ADD_MODULE(xdgmime) -ADD_MODULE(eggsmclient) -ADD_MODULE(gtksourceview) -ADD_MODULE(mooutils) -ADD_MODULE(moofileview) -ADD_MODULE(mooedit) -ADD_MODULE(mooapp) -ADD_MODULE(plugins) -ADD_MODULE(moolua) -ADD_MODULE(moocpp) -ADD_MODULE(moogpp) -if(MOO_ENABLE_PYTHON) - ADD_MODULE(moopython) -endif() -ADD_MODULE(medit-app) - -source_group(moo REGULAR_EXPRESSION .*) -source_group("generated\\sources" REGULAR_EXPRESSION ".*\\.c(pp)?$") -source_group("generated\\headers" REGULAR_EXPRESSION ".*\\.h$") -source_group("moo\\glade" REGULAR_EXPRESSION ".*\\.glade$") - -set(MOO_USE_PCH TRUE) -if(MOO_USE_PCH) - set(MEDIT_PCH_SOURCES - moo-pch.c - moo-pch.cpp - moo-pch.h - ) -endif() - -add_executable(medit WIN32 - ${MEDIT_SOURCES} - ${MEDIT_PCH_SOURCES} -) - -if(MOO_USE_PCH) - add_precompiled_header(medit - moo-pch.h - FORCEINCLUDE - SOURCE_C moo-pch.c - SOURCE_CXX moo-pch.cpp) -endif() - -if(MOO_BUILD_FROM_MINGW) - LIST(APPEND MEDIT_LIBS libmooglib-0) -endif() - -target_link_libraries(medit - ${GTK_LIBRARIES} - ${GMODULE_LIBRARIES} - ${LIBXML2_LIBRARIES} - ${XLIB_LIBRARIES} - #${LIBM} - ${PYTHON_LIBRARY} - ${moo_libadd} - ${MEDIT_LIBS} -) - -install(TARGETS medit RUNTIME DESTINATION bin) - -if(MOO_BUILD_FROM_MINGW) - # xxx this is wrong, doing it temporarily so it doesn't install python lib every time - if(NOT EXISTS "${MOO_GTK_DIST_DIR}/bin/libglib-2.0-0.dll") - install(DIRECTORY ${MOO_GTK_DIST_DIR}/bin DESTINATION ${CMAKE_INSTALL_PREFIX}) - install(DIRECTORY ${MOO_GTK_DIST_DIR}/etc DESTINATION ${CMAKE_INSTALL_PREFIX}) - install(DIRECTORY ${MOO_GTK_DIST_DIR}/lib DESTINATION ${CMAKE_INSTALL_PREFIX}) - install(DIRECTORY ${MOO_GTK_DIST_DIR}/share DESTINATION ${CMAKE_INSTALL_PREFIX}) - endif() - - #install(DIRECTORY ${CMAKE_SOURCE_DIR}/plat/win32/gtk-win/extra/medit-data/bin DESTINATION ${CMAKE_INSTALL_PREFIX}) - #install(DIRECTORY ${CMAKE_SOURCE_DIR}/plat/win32/gtk-win/extra/medit-data/etc DESTINATION ${CMAKE_INSTALL_PREFIX}) -endif() - -# zzz -# if MOO_OS_UNIX -# desktopdir = $(datadir)/applications -# desktop_DATA = medit-app/medit.desktop -# medit-app/medit.desktop: medit-app/medit.desktop.in @MOO_INTLTOOL_INI_DEPS@ -# $(AM_V_at)$(MKDIR_P) medit-app -# @MOO_INTLTOOL_INI_CMD@ -# CLEANFILES += medit-app/medit.desktop -# endif MOO_OS_UNIX - -# zzz -# iconthemedir = $(datadir)/icons/hicolor/48x48/apps -# icontheme_DATA = mooutils/pixmaps/medit.png -# if MOO_ENABLE_INSTALL_HOOKS -# update_icon_cache = gtk-update-icon-cache -f -t $(DESTDIR)$(datadir)/icons/hicolor -# install-data-hook: install-data-hook-gtk-icon-cache -# install-data-hook-gtk-icon-cache: -# @if echo "Updating icon cache" && $(update_icon_cache); then -# echo "Done."; -# else -# echo "*** GTK icon cache not updated. After install, run this:";\ -# echo $(update_icon_cache); -# fi -# uninstall-hook: uninstall-data-hook-gtk-icon-cache -# uninstall-data-hook-gtk-icon-cache: -# @if echo "Updating icon cache" && $(update_icon_cache); then echo "Done."; else echo "Failed."; fi -# endif - -# zzz include medit-module/Makefile.incl +FILE(WRITE ${CMAKE_CURRENT_BINARY_DIR}/genmarshals_h.cmake +"EXECUTE_PROCESS(COMMAND ${GLIB_GENMARSHAL} --prefix=_moo_marshal --header ${CMAKE_CURRENT_SOURCE_DIR}/marshals.list + RESULT_VARIABLE result + OUTPUT_VARIABLE output + ERROR_VARIABLE error + OUTPUT_FILE marshals.h.tmp) +if(NOT result EQUAL 0) + MESSAGE(FATAL_ERROR \"Error generating marshals.h: \${output} \${error}\") +endif() +file(RENAME marshals.h.tmp marshals.h) +") +add_custom_command(OUTPUT marshals.h + COMMAND ${CMAKE_COMMAND} -P genmarshals_h.cmake + MAIN_DEPENDENCY marshals.list) +LIST(APPEND built_moo_sources marshals.h) + +macro(ADD_GXML input) + string(REPLACE ".glade" "-gxml.h" _gxml_output "${input}") + string(REPLACE "/glade/" "/" _gxml_output "${_gxml_output}") + #message(STATUS "_gxml_output: ${_gxml_output}") + add_custom_command(OUTPUT ${_gxml_output} + COMMAND ${MOO_PYTHON} ${CMAKE_SOURCE_DIR}/tools/glade2c.py --output=${_gxml_output} ${CMAKE_CURRENT_SOURCE_DIR}/${input} + MAIN_DEPENDENCY ${input} + DEPENDS ${CMAKE_SOURCE_DIR}/tools/glade2c.py + COMMENT "Generating ${_gxml_output} from ${input}") + list(APPEND built_moo_sources ${_gxml_output}) +endmacro(ADD_GXML) + +macro(XML2H _xml2h_input _xml2h_output _xml2h_variable) + add_custom_command(OUTPUT ${_xml2h_output} + COMMAND ${MOO_PYTHON} ${CMAKE_SOURCE_DIR}/tools/xml2h.py ${CMAKE_CURRENT_SOURCE_DIR}/${_xml2h_input} ${_xml2h_output} ${_xml2h_variable} + MAIN_DEPENDENCY ${_xml2h_input} + DEPENDS ${CMAKE_SOURCE_DIR}/tools/xml2h.py + COMMENT "Generating ${_xml2h_output} from ${_xml2h_input}") + list(APPEND built_moo_sources ${_xml2h_output}) +endmacro(XML2H) + +macro(ADD_UI input) + string(REPLACE ".xml" "-ui.h" _ui_output "${input}") +# message(STATUS "_ui_output: ${_ui_output}") + string(REGEX REPLACE ".*/([^/]*)\\.xml" "\\1" _ui_variable "${input}") + XML2H(${input} ${_ui_output} ${_ui_variable}_ui_xml) +endmacro(ADD_UI) + +file(MAKE_DIRECTORY + ${CMAKE_CURRENT_BINARY_DIR}/mooapp + ${CMAKE_CURRENT_BINARY_DIR}/mooedit + ${CMAKE_CURRENT_BINARY_DIR}/moofileview + ${CMAKE_CURRENT_BINARY_DIR}/mooutils + ${CMAKE_CURRENT_BINARY_DIR}/moolua + ${CMAKE_CURRENT_BINARY_DIR}/plugins/usertools + ${CMAKE_CURRENT_BINARY_DIR}/medit-app +) + +include(xdgmime/xdgmime.cmake) +include(mooutils/mooutils.cmake) +include(mooedit/mooedit.cmake) +include(moofileview/moofileview.cmake) +include(gtksourceview/gtksourceview.cmake) +if(NOT MOO_OS_WIN32) + include(eggsmclient/eggsmclient.cmake) +endif() +include(mooapp/mooapp.cmake) +include(moolua/moolua.cmake) +if(MOO_ENABLE_PYTHON) + include(moopython/moopython.cmake) +endif() +include(plugins/plugins.cmake) +include(medit-app/medit-app.cmake) + +SET(MEDIT_SOURCES + CMakeLists.txt + ${moo_sources} + ${built_moo_sources} +) + +macro(ADD_MODULE name) + string(REPLACE "-" "_" _escaped_name "${name}") + source_group(${name} FILES ${${_escaped_name}_sources} ${${_escaped_name}_extra_files}) + source_group(${name}\\generated FILES ${built_${_escaped_name}_sources}) + #source_group(${name} FILES ${${_escaped_name}_sources} ${${_escaped_name}_extra_files}) + #source_group(${name}\\generated FILES ${built_${_escaped_name}_sources}) + LIST(APPEND MEDIT_SOURCES ${${_escaped_name}_sources} ${built_${_escaped_name}_sources}) + LIST(APPEND MEDIT_EXTRA_DIST ${${_escaped_name}_extra_dist} ${${_escaped_name}_extra_files}) +endmacro(ADD_MODULE) + +ADD_MODULE(xdgmime) +ADD_MODULE(eggsmclient) +ADD_MODULE(gtksourceview) +ADD_MODULE(mooutils) +ADD_MODULE(moofileview) +ADD_MODULE(mooedit) +ADD_MODULE(mooapp) +ADD_MODULE(plugins) +ADD_MODULE(moolua) +if(MOO_ENABLE_PYTHON) + ADD_MODULE(moopython) +endif() +ADD_MODULE(medit-app) + +include_directories(${PROJECT_SOURCE_DIR}/moo/mooutils/moowin32/ms) + +include_directories( + ${PROJECT_BINARY_DIR} + ${GTK_INCLUDE_DIRS} + ${LIBXML2_INCLUDE_DIRS} +) +link_directories(${GTK_LIBRARY_DIRS} ${GMODULE_LIBRARY_DIRS}) + +source_group(misc REGULAR_EXPRESSION .*) +source_group("generated\\sources" REGULAR_EXPRESSION ".*\\.c(pp)?$") +source_group("generated\\headers" REGULAR_EXPRESSION ".*\\.h$") +source_group("misc\\glade" REGULAR_EXPRESSION ".*\\.glade$") + +add_executable(medit WIN32 + ${MEDIT_SOURCES} +) + +target_link_libraries(medit + libmooglib-0 + ${GTK_LIBRARIES} + ${GMODULE_LIBRARIES} + ${LIBXML2_LIBRARIES} + ${XLIB_LIBRARIES} + #${LIBM} + ${PYTHON_LIBRARIES} + ${moo_libadd} + ${MEDIT_LIBS} +) + +install(TARGETS medit RUNTIME DESTINATION bin) + +if(MOO_BUILD_FROM_MINGW) + install(DIRECTORY ${MOO_GTK_DIST_DIR}/bin DESTINATION ${CMAKE_INSTALL_PREFIX}) + install(DIRECTORY ${MOO_GTK_DIST_DIR}/etc DESTINATION ${CMAKE_INSTALL_PREFIX}) + install(DIRECTORY ${MOO_GTK_DIST_DIR}/lib DESTINATION ${CMAKE_INSTALL_PREFIX}) + install(DIRECTORY ${MOO_GTK_DIST_DIR}/share DESTINATION ${CMAKE_INSTALL_PREFIX}) + #install(DIRECTORY ${CMAKE_SOURCE_DIR}/plat/win32/gtk-win/extra/medit-data/bin DESTINATION ${CMAKE_INSTALL_PREFIX}) + #install(DIRECTORY ${CMAKE_SOURCE_DIR}/plat/win32/gtk-win/extra/medit-data/etc DESTINATION ${CMAKE_INSTALL_PREFIX}) +endif() + +# zzz +# if MOO_OS_UNIX +# desktopdir = $(datadir)/applications +# desktop_DATA = medit-app/medit.desktop +# medit-app/medit.desktop: medit-app/medit.desktop.in @MOO_INTLTOOL_INI_DEPS@ +# $(AM_V_at)$(MKDIR_P) medit-app +# @MOO_INTLTOOL_INI_CMD@ +# CLEANFILES += medit-app/medit.desktop +# endif MOO_OS_UNIX + +# zzz +# iconthemedir = $(datadir)/icons/hicolor/48x48/apps +# icontheme_DATA = mooutils/pixmaps/medit.png +# if MOO_ENABLE_INSTALL_HOOKS +# update_icon_cache = gtk-update-icon-cache -f -t $(DESTDIR)$(datadir)/icons/hicolor +# install-data-hook: install-data-hook-gtk-icon-cache +# install-data-hook-gtk-icon-cache: +# @if echo "Updating icon cache" && $(update_icon_cache); then +# echo "Done."; +# else +# echo "*** GTK icon cache not updated. After install, run this:";\ +# echo $(update_icon_cache); +# fi +# uninstall-hook: uninstall-data-hook-gtk-icon-cache +# uninstall-data-hook-gtk-icon-cache: +# @if echo "Updating icon cache" && $(update_icon_cache); then echo "Done."; else echo "Failed."; fi +# endif + +# zzz include medit-module/Makefile.incl diff --git a/moo/Makefile.am b/moo/Makefile.am index 9a89a824..8a9b9a11 100644 --- a/moo/Makefile.am +++ b/moo/Makefile.am @@ -40,7 +40,6 @@ marshals.h: marshals.list include mooedit/Makefile.incl include xdgmime/Makefile.incl include mooutils/Makefile.incl -include moocpp/Makefile.incl include moofileview/Makefile.incl include gtksourceview/Makefile.incl include eggsmclient/Makefile.incl diff --git a/moo/gpp/Makefile.incl b/moo/gpp/Makefile.incl deleted file mode 100644 index 989e421e..00000000 --- a/moo/gpp/Makefile.incl +++ /dev/null @@ -1,26 +0,0 @@ -moo_sources += \ - moocpp/gboxed.h \ - moocpp/gobjectutils.h \ - moocpp/gobjptr.h \ - moocpp/gobjref.h \ - moocpp/gobjinfo.h \ - moocpp/gobjrawptr.h \ - moocpp/gobjtypes.h \ - moocpp/gobjtypes-glib.h \ - moocpp/gobjtypes-gio.h \ - moocpp/gobjtypes-gtk.h \ - moocpp/gobjtypes-glib.cpp \ - moocpp/gobjtypes-gio.cpp \ - moocpp/gobjtypes-gtk.cpp \ - moocpp/gobjwrapper.h \ - moocpp/gparam.h \ - moocpp/grefptr.h \ - moocpp/gutil.h \ - moocpp/gutil.cpp \ - moocpp/memutils.h \ - moocpp/moocpp.h \ - moocpp/strutils.h \ - moocpp/strutils.cpp \ - moocpp/utils.h - -# -%- use-tabs:true, indent-width: 8, strip:true -%- diff --git a/moo/gpp/gobj.cpp b/moo/gpp/gobj.cpp deleted file mode 100644 index 74e7d5ac..00000000 --- a/moo/gpp/gobj.cpp +++ /dev/null @@ -1,19 +0,0 @@ -/* - * moocpp/gobj.cpp - * - * Copyright (C) 2004-2016 by Yevgen Muntyan - * - * This file is part of medit. medit 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. - * - * You should have received a copy of the GNU Lesser General Public - * License along with medit. If not, see . - */ - -#pragma once - -#include "moocpp/gobj.h" - diff --git a/moo/gpp/gobj.h b/moo/gpp/gobj.h deleted file mode 100644 index c8b7405d..00000000 --- a/moo/gpp/gobj.h +++ /dev/null @@ -1,274 +0,0 @@ -/* - * moocpp/gobj.h - * - * Copyright (C) 2004-2016 by Yevgen Muntyan - * - * This file is part of medit. medit 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. - * - * You should have received a copy of the GNU Lesser General Public - * License along with medit. If not, see . - */ - -#pragma once - -#ifndef __cplusplus -#error "This is a C++ header" -#endif - -#include - -namespace g { - -namespace impl -{ - -class base -{ -public: - virtual ~base() = default; - virtual GObject* _gobj() = 0; -}; - -} // namespace impl - -namespace impl -{ - -class obj_base -{ -protected: - obj_base(GObject* o); - ~obj_base(); - - GObject* _gobj() const { return m_gobj; } - -private: - GObject* m_gobj; -}; - -class internals_accessor; - -} // namespace impl - -struct obj_type_info -{ - obj_type_info(GType g_type); - - GType g_type; -}; - -struct iface_type_info -{ - iface_type_info(GType g_type); - - GType g_type; -}; - -#define MOO_GOBJ_CLASS_DECL_BASE(Self, GName, G_TYPE) \ - friend class g::impl::internals_accessor; \ -\ - public: \ - static const g::obj_type_info type_info; \ -\ - using g_class = GName; \ -\ - GName *gobj() { return reinterpret_cast(_gobj()); } \ -\ - operator GName&() { return *gobj(); } \ -\ - static g::obj_ptr wrap_new(GName* o); \ - -#define MOO_GOBJ_CLASS_DECL(Self, Parent, GName, G_TYPE) \ -MOO_GOBJ_CLASS_DECL_BASE(Self, GName, G_TYPE) \ -protected: \ - Self() = delete; \ - explicit Self(GName* o) : Parent(reinterpret_cast(o)) {} \ - GObject *_gobj() { return Parent::_gobj(); } \ - - -#define MOO_GOBJ_IFACE_DECL(Self, GName, G_TYPE) \ - friend class g::impl::internals_accessor; \ -\ -public: \ - static const g::iface_type_info type_info; \ -\ - using g_iface = GName; \ -\ - GName *gobj() { return reinterpret_cast(_gobj()); } \ -\ - operator GName&() { return *gobj(); } \ -\ - static g::obj_ptr wrap_new(GName* o); \ - -#define MOO_DECLARE_GOBJ_CLASS(Self) \ - class Self; \ - using Self##Ptr = g::obj_ptr \ - -#define MOO_DEFINE_SIMPLE_GOBJ_CLASS(Self, Parent, GSelf, G_TYPE) \ -MOO_DECLARE_GOBJ_CLASS(Self); \ -class Self : public Parent \ -{ \ - MOO_GOBJ_CLASS_DECL(Self, Parent, GSelf, G_TYPE) \ -} - - -#define MOO_CUSTOM_GOBJ_CLASS_DECL(Self, Parent) \ - friend class impl::internals_accessor; \ -\ -public: \ - static const g::obj_type_info type_info; \ - - -namespace impl { - -template -class ref_ptr -{ -public: - ref_ptr(T* p = nullptr) : m_p(p) { if (m_p) RefUnref::ref(m_p); } - ~ref_ptr() { if (m_p) RefUnref::unref(m_p); } - - T* get() const { return m_p; } - T* operator->() const { return m_p; } - T& operator*() const { return *m_p; } - - void reset() { *this = nullptr; } - - ref_ptr(const ref_ptr& rhs) : ref_ptr(rhs.m_p) {} - ref_ptr& operator=(const ref_ptr& rhs) { *this = rhs.m_p; return *this; } - ref_ptr(ref_ptr&& rhs) : m_p(rhs.m_p) { rhs.m_p = nullptr; } - ref_ptr& operator=(ref_ptr&& rhs) { std::swap(m_p, rhs.m_p); return *this; } - ref_ptr& operator=(T* p) { if (m_p != p) { T* tmp = m_p; m_p = p; if (tmp) RefUnref::unref(tmp); if(m_p) RefUnref::ref(m_p); } return *this; } - - template - ref_ptr(U* p) : ref_ptr(static_cast(p)) {} - template - ref_ptr& operator=(U* p) { *this = static_cast(p); return *this; } - - template - ref_ptr(const ref_ptr& rhs) : ref_ptr(rhs.m_p) {} - template - ref_ptr& operator=(const ref_ptr& rhs) { *this = rhs.get(); return *this; } - template - ref_ptr(ref_ptr&& rhs) : m_p(rhs.m_p) { rhs.m_p = nullptr; } - template - ref_ptr& operator=(ref_ptr&& rhs); - -private: - T* m_p; -}; - -class obj_ref_unref -{ -public: - template - static void ref(T* o) { g_object_ref(o->gobj()); } - - template - static void unref(T* o) { g_object_unref(o->gobj()); } -}; - -} // namespace impl - -template -using obj_ptr = impl::ref_ptr; - -/////////////////////////////////////////////////////////////////////////////////////////// -// -// GObject -// - -class Object; -using ObjectPtr = obj_ptr; - -class Object : public impl::obj_base -{ - MOO_GOBJ_CLASS_DECL_BASE(Object, GObject, G_TYPE_OBJECT) - -protected: - Object() = delete; - explicit Object(GObject* o) : impl::obj_base(o) {} - -public: - gulong connect(const char* detailed_signal, GCallback c_handler, void* data); - gulong connect_swapped(const char* detailed_signal, GCallback c_handler, void* data); - - void signal_emit_by_name(const char* detailed_signal, ...); - void signal_emit(guint signal_id, GQuark detail, ...); - - bool signal_has_handler_pending(guint signal_id, GQuark detail, bool may_be_blocked); - gulong signal_connect_closure_by_id(guint signal_id, GQuark detail, GClosure* closure, bool after); - gulong signal_connect_closure(const char* detailed_signal, GClosure* closure, bool after); - gulong signal_connect_data(const char* detailed_signal, GCallback c_handler, gpointer data, GClosureNotify destroy_data, GConnectFlags connect_flags); - void signal_handler_block(gulong handler_id); - void signal_handler_unblock(gulong handler_id); - void signal_handler_disconnect(gulong handler_id); - bool signal_handler_is_connected(gulong handler_id); - gulong signal_handler_find(GSignalMatchType mask, guint signal_id, GQuark detail, GClosure* closure, gpointer func, gpointer data); - guint signal_handlers_block_matched(GSignalMatchType mask, guint signal_id, GQuark detail, GClosure* closure, gpointer func, gpointer data); - guint signal_handlers_unblock_matched(GSignalMatchType mask, guint signal_id, GQuark detail, GClosure* closure, gpointer func, gpointer data); - guint signal_handlers_disconnect_matched(GSignalMatchType mask, guint signal_id, GQuark detail, GClosure* closure, gpointer func, gpointer data); - guint signal_handlers_disconnect_by_func(GCallback c_handler, void* data); - -#if 0 - void* get_data(const char* key); - void* get_data(GQuark q); - void set_data(const char* key, gpointer value, GDestroyNotify destroy = nullptr); - void set_data(GQuark q, gpointer value, GDestroyNotify destroy = nullptr); - - void set_property(const char* property_name, const GValue* value); - - template - void set(const char* prop, const T& value) - { - g_object_set(gobj(), prop, cpp_vararg_value_fixer::apply(value), nullptr); - } - - template - void set(const char* prop, const T& value, Args&&... args) - { - set(prop, value); - set(std::forward(args)...); - } - - void get(const char* prop, bool& dest) - { - gboolean val; - g_object_get(gobj(), prop, &val, nullptr); - dest = val; - } - - template - void get(const char* prop, T&& dest) - { - g_object_get(gobj(), prop, cpp_vararg_dest_fixer::apply(std::forward(dest)), nullptr); - } - - template - void get(const char* prop, T&& dest, Args&&... args) - { - get(prop, std::forward(dest)); - get(std::forward(args)...); - } - -#endif // 0 - - void notify(const char* property_name); - void freeze_notify(); - void thaw_notify(); -}; - -/////////////////////////////////////////////////////////////////////////////////////////// -// -// GIface -// - -class Iface : public impl::base -{ -}; - -} // namespace g diff --git a/moo/gpp/gobjectutils.h b/moo/gpp/gobjectutils.h deleted file mode 100644 index fb78f7f9..00000000 --- a/moo/gpp/gobjectutils.h +++ /dev/null @@ -1,168 +0,0 @@ -/* - * moogpp/gobjectutils.h - * - * Copyright (C) 2004-2015 by Yevgen Muntyan - * - * This file is part of medit. medit 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. - * - * You should have received a copy of the GNU Lesser General Public - * License along with medit. If not, see . - */ - -#pragma once - -#ifndef __cplusplus -#error "This is a C++ header" -#endif - -#include -#include - -namespace g { - -template -inline GType get_g_type(); - -template -inline T* object_ref(T *obj) -{ - return static_cast(g_object_ref(obj)); -} - -template -inline T* object_cast(gpointer obj) -{ - return obj ? reinterpret_cast(G_TYPE_CHECK_INSTANCE_CAST(g_object_ref(obj), get_g_type(), T)) : nullptr; -} - -template -inline T* object_ref_opt(T *obj) -{ - return obj ? object_cast(g_object_ref(obj)) : nullptr; -} - -template -inline T* object_cast_opt(gpointer obj) -{ - return obj ? object_cast(obj) : nullptr; -} - -template -inline T* object_ref_cast_opt(gpointer obj) -{ - return obj ? object_ref(object_cast(obj)) : nullptr; -} - -template -inline T* new_object() -{ - return object_cast(g_object_new(get_g_type(), nullptr)); -} - -#if 0 - -template -std::vector> object_list_to_vector (GList* list) -{ - std::vector> ret; - - for (GList* l = list; l != nullptr; l = l->next) - { - CObject* o = reinterpret_cast(l->data); - g_assert (!o || G_TYPE_CHECK_INSTANCE_TYPE ((o), gobjinfo::object_g_type ())); - ret.emplace_back (gobj_ptr::wrap (o)); - } - - return ret; -} - -template -class cpp_vararg_value_fixer; - -template -class cpp_vararg_value_fixer -{ -public: - static const T& apply (const T& val) { return val; } -}; - -template -class cpp_vararg_value_fixer_convert -{ -public: - static TDest apply (const TSrc& val) { return val; } -}; - -template<> class cpp_vararg_value_fixer : public cpp_vararg_value_fixer_convert{}; -template<> class cpp_vararg_value_fixer : public cpp_vararg_value_fixer_convert{}; -template<> class cpp_vararg_value_fixer : public cpp_vararg_value_fixer_convert{}; - -template -class cpp_vararg_value_fixer> -{ -public: - static CObject* apply (const gobj_ptr& val) { return val.gobj(); } -}; - -template -class cpp_vararg_value_fixer> -{ -public: - static CObject* apply (const gobj_raw_ptr& val) { return val.gobj (); } -}; - -template -class cpp_vararg_value_fixer> -{ -public: - static T* apply (objp val) { return val.release (); } -}; - - -template -struct cpp_vararg_dest_fixer -{ - template - static void* apply (U) = delete; -}; - -template -struct cpp_vararg_dest_fixer_passthrough -{ - static T* apply (T* p) { return p; } -}; - -template -struct cpp_vararg_dest_fixer_passthrough_ref -{ - static T* apply (T& p) { return &p; } -}; - -template<> struct cpp_vararg_dest_fixer : public cpp_vararg_dest_fixer_passthrough_ref{}; -template<> struct cpp_vararg_dest_fixer : public cpp_vararg_dest_fixer_passthrough_ref{}; - -template<> -struct cpp_vararg_dest_fixer -{ - static char** apply (gstrp& s) { return s.pp (); } -}; - -template -struct cpp_vararg_dest_fixer&> -{ - static void** apply (objp& o) { return reinterpret_cast(o.pp ()); } -}; - -template -struct cpp_vararg_dest_fixer&> -{ - static void** apply (gobj_ptr& o) { return reinterpret_cast(o.pp ()); } -}; - -#endif // 0 - -} // namespace g diff --git a/moo/gpp/gobjtypes-gio.cpp b/moo/gpp/gobjtypes-gio.cpp deleted file mode 100644 index 25263814..00000000 --- a/moo/gpp/gobjtypes-gio.cpp +++ /dev/null @@ -1,25 +0,0 @@ -/* - * gpp/gobjtypes-gio.cpp - * - * Copyright (C) 2004-2016 by Yevgen Muntyan - * - * This file is part of medit. medit 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. - * - * You should have received a copy of the GNU Lesser General Public - * License along with medit. If not, see . - */ - -#include "moogpp/gobjtypes-gio.h" - -using namespace g; - -FilePtr File::new_for_path(const char* path) -{ - GFile* f = g_file_new_for_path(path); - g_return_val_if_fail(f != nullptr, nullptr); - return File::wrap_new(f); -} diff --git a/moo/gpp/gobjtypes-gio.h b/moo/gpp/gobjtypes-gio.h deleted file mode 100644 index 9ab17637..00000000 --- a/moo/gpp/gobjtypes-gio.h +++ /dev/null @@ -1,208 +0,0 @@ -/* - * gpp/gobjtypes-gio.h - * - * Copyright (C) 2004-2016 by Yevgen Muntyan - * - * This file is part of medit. medit 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. - * - * You should have received a copy of the GNU Lesser General Public - * License along with medit. If not, see . - */ - -#pragma once - -#ifndef __cplusplus -#error "This is a C++ header" -#endif - -#include -#include - -namespace g { - -class gstr; -class gerrp; - -MOO_DECLARE_GOBJ_CLASS(File); -MOO_DECLARE_GOBJ_CLASS(OutputStream); -MOO_DECLARE_GOBJ_CLASS(FileOutputStream); - -MOO_DEFINE_SIMPLE_GOBJ_CLASS(FileInfo, Object, GFileInfo, G_TYPE_FILE_INFO); -MOO_DEFINE_SIMPLE_GOBJ_CLASS(InputStream, Object, GInputStream, G_TYPE_INPUT_STREAM); -MOO_DEFINE_SIMPLE_GOBJ_CLASS(FileInputStream, InputStream, GFileInputStream, G_TYPE_FILE_INPUT_STREAM); -MOO_DEFINE_SIMPLE_GOBJ_CLASS(IOStream, Object, GIOStream, G_TYPE_IO_STREAM); -MOO_DEFINE_SIMPLE_GOBJ_CLASS(FileIOStream, IOStream, GFileIOStream, G_TYPE_FILE_IO_STREAM); - -class File : public Iface -{ - MOO_GOBJ_IFACE_DECL(File, GFile, G_TYPE_FILE) - -public: - static g::FilePtr new_for_path (const char* path); - static g::FilePtr new_for_uri (const char* uri); - static g::FilePtr new_for_commandline_arg (const char* arg); - static g::FilePtr parse_name (const char* parse_name); - - g::FilePtr dup (); - - bool equal (g::File& file2); - - gstr get_basename (); - gstr get_path(); - gstr get_uri(); - gstr get_parse_name(); - g::FilePtr get_parent (); - bool has_parent (g::File& parent); - g::FilePtr get_child (const char* name); - g::FilePtr get_child_for_display_name (const char* display_name, - gerrp& error); - bool has_prefix (g::File& prefix); - gstr get_relative_path (g::File& descendant); - g::FilePtr resolve_relative_path (const char *relative_path); - bool is_native (); - bool has_uri_scheme (const char *uri_scheme); - gstr get_uri_scheme(); - g::FileInputStreamPtr read (GCancellable* cancellable, - gerrp& error); - g::FileOutputStreamPtr append_to (GFileCreateFlags flags, - GCancellable* cancellable, - gerrp& error); - g::FileOutputStreamPtr create (GFileCreateFlags flags, - GCancellable* cancellable, - gerrp& error); - g::FileOutputStreamPtr replace (const char *etag, - gboolean make_backup, - GFileCreateFlags flags, - GCancellable* cancellable, - gerrp& error); - g::FileIOStreamPtr open_readwrite (GCancellable* cancellable, - gerrp& error); - g::FileIOStreamPtr create_readwrite (GFileCreateFlags flags, - GCancellable* cancellable, - gerrp& error); - g::FileIOStreamPtr replace_readwrite (const char *etag, - gboolean make_backup, - GFileCreateFlags flags, - GCancellable* cancellable, - gerrp& error); - bool query_exists (GCancellable* cancellable); - GFileType query_file_type (GFileQueryInfoFlags flags, - GCancellable* cancellable); - g::FileInfoPtr query_info (const char *attributes, - GFileQueryInfoFlags flags, - GCancellable* cancellable, - gerrp& error); - g::FileInfoPtr query_filesystem_info (const char *attributes, - GCancellable* cancellable, - gerrp& error); - GFileEnumerator* enumerate_children (const char *attributes, - GFileQueryInfoFlags flags, - GCancellable* cancellable, - gerrp& error); - g::FilePtr set_display_name (const char* display_name, - GCancellable* cancellable, - gerrp& error); - bool delete_ (GCancellable* cancellable, - gerrp& error); - bool trash (GCancellable* cancellable, - gerrp& error); - bool copy (g::File& destination, - GFileCopyFlags flags, - GCancellable* cancellable, - GFileProgressCallback progress_callback, - gpointer progress_callback_data, - gerrp& error); - bool move (g::File& destination, - GFileCopyFlags flags, - GCancellable* cancellable, - GFileProgressCallback progress_callback, - gpointer progress_callback_data, - gerrp& error); - bool make_directory (GCancellable* cancellable, - gerrp& error); - bool make_directory_with_parents (GCancellable* cancellable, - gerrp& error); - bool make_symbolic_link (const char *symlink_value, - GCancellable* cancellable, - gerrp& error); - - bool load_contents (GCancellable* cancellable, - char** contents, - gsize* length, - char** etag_out, - gerrp& error); - bool replace_contents (const char* contents, - gsize length, - const char* etag, - gboolean make_backup, - GFileCreateFlags flags, - char** new_etag, - GCancellable* cancellable, - gerrp& error); -}; - -class OutputStream : public Object -{ - MOO_GOBJ_CLASS_DECL(OutputStream, Object, GOutputStream, G_TYPE_OUTPUT_STREAM) - -public: - gssize write (const void *buffer, - gsize count, - GCancellable *cancellable, - gerrp& error); - bool write_all (const void *buffer, - gsize count, - gsize *bytes_written, - GCancellable *cancellable, - gerrp& error); - gssize splice (g::InputStream source, - GOutputStreamSpliceFlags flags, - GCancellable *cancellable, - gerrp& error); - bool flush (GCancellable *cancellable, - gerrp& error); - bool close (GCancellable *cancellable, - gerrp& error); - void write_async (const void *buffer, - gsize count, - int io_priority, - GCancellable *cancellable, - GAsyncReadyCallback callback, - gpointer user_data); - gssize write_finish (GAsyncResult *result, - gerrp& error); - void splice_async (g::InputStream source, - GOutputStreamSpliceFlags flags, - int io_priority, - GCancellable *cancellable, - GAsyncReadyCallback callback, - gpointer user_data); - gssize splice_finish (GAsyncResult *result, - gerrp& error); - void flush_async (int io_priority, - GCancellable *cancellable, - GAsyncReadyCallback callback, - gpointer user_data); - bool flush_finish (GAsyncResult *result, - gerrp& error); - void close_async (int io_priority, - GCancellable *cancellable, - GAsyncReadyCallback callback, - gpointer user_data); - bool close_finish (GAsyncResult *result, - gerrp& error); - - bool is_closed (); - bool is_closing (); - bool has_pending (); - bool set_pending (gerrp& error); - void clear_pending (); -}; - -MOO_DEFINE_SIMPLE_GOBJ_CLASS(FileOutputStream, OutputStream, GFileOutputStream, G_TYPE_FILE_OUTPUT_STREAM); - -} // namespace g diff --git a/moo/gpp/gobjtypes-glib.cpp b/moo/gpp/gobjtypes-glib.cpp deleted file mode 100644 index 0a93b6d7..00000000 --- a/moo/gpp/gobjtypes-glib.cpp +++ /dev/null @@ -1,50 +0,0 @@ -/* - * moocpp/gobjtypes-glib.cpp - * - * Copyright (C) 2004-2016 by Yevgen Muntyan - * - * This file is part of medit. medit 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. - * - * You should have received a copy of the GNU Lesser General Public - * License along with medit. If not, see . - */ - -#include "moogpp/gobjtypes-glib.h" -#include - -namespace { - -//std::unordered_map known_types; -// -//g::obj_type_info* lookup_type(GType gtyp) -//{ -// auto itr = known_types.find(gtyp); -// if (itr == known_types.end()) -// return nullptr; -// else -// return itr->second; -//} -// -//g::obj_type_info* get_type(GType gtyp) -//{ -// g::obj_type_info* ti = lookup_type(gtyp); -// if (ti) -// return ti; -// -// g_return_val_if_fail(g_type_fundamental(gtyp) == G_TYPE_OBJECT, nullptr); -// g_return_val_if_fail(gtyp != G_TYPE_OBJECT, nullptr); -// -// GType parent = g_type_parent(gtyp); -// g::obj_type_info* parent_ti = get_type(parent); -// -// if (gtyp == G_TYPE_OBJECT) -// { -// -// } -//} - -} // namespace diff --git a/moo/gpp/gobjtypes-glib.h b/moo/gpp/gobjtypes-glib.h deleted file mode 100644 index 9d85ef7b..00000000 --- a/moo/gpp/gobjtypes-glib.h +++ /dev/null @@ -1,42 +0,0 @@ -/* - * moocpp/gobjtypes-glib.h - * - * Copyright (C) 2004-2016 by Yevgen Muntyan - * - * This file is part of medit. medit 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. - * - * You should have received a copy of the GNU Lesser General Public - * License along with medit. If not, see . - */ - -#pragma once - -#ifndef __cplusplus -#error "This is a C++ header" -#endif - -#include -#include - -namespace g { - -class Binding; -using BindingPtr = obj_ptr; - -class Binding : public Object -{ - MOO_GOBJ_CLASS_DECL(Binding, Object, GBinding, G_TYPE_BINDING) -}; - -} // namespace g - -MOO_DEFINE_FLAGS(GSignalFlags); -MOO_DEFINE_FLAGS(GConnectFlags); -MOO_DEFINE_FLAGS(GSpawnFlags); -MOO_DEFINE_FLAGS(GLogLevelFlags); -MOO_DEFINE_FLAGS(GRegexCompileFlags); -MOO_DEFINE_FLAGS(GIOCondition); diff --git a/moo/gpp/gobjtypes-gtk.cpp b/moo/gpp/gobjtypes-gtk.cpp deleted file mode 100644 index 40280f0e..00000000 --- a/moo/gpp/gobjtypes-gtk.cpp +++ /dev/null @@ -1,1335 +0,0 @@ -/* - * moocpp/gobjtypes-gtk.cpp - * - * Copyright (C) 2004-2016 by Yevgen Muntyan - * - * This file is part of medit. medit 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. - * - * You should have received a copy of the GNU Lesser General Public - * License along with medit. If not, see . - */ - -#include "moogpp/moogpp.h" - -using namespace gtk; - -#if 0 - -namespace moo { - -namespace _test { - -void test() -{ - ListStorePtr m1 = wrap_new (gtk_list_store_new (1, G_TYPE_STRING)); - TreeStorePtr m2 = wrap_new (gtk_tree_store_new (1, G_TYPE_STRING)); - TreeModelPtr m3 = wrap_new (GTK_TREE_MODEL (gtk_tree_store_new (1, G_TYPE_STRING))); - ListStorePtr m4 = ListStore::create ({ G_TYPE_STRING }); - - if (true) - return; - - //gobj_ptr m4 = m1; - - //create_cpp_gobj(); - //init_cpp_gobj(a); - - //GtkObject* xyz = nullptr; - //init_cpp_gobj(xyz); - - //create_cpp_gobj(GTK_TYPE_TOOLBAR); - - { - gobj_ptr p; - gobj_ref r = *p; - GtkObject* o1 = r.gobj(); - GtkObject* o2 = p->gobj(); - g_assert(o1 == o2); - GObject* o = p.gobj(); - g_assert(o == nullptr); - GtkObject* x = p.gobj(); - GObject* y = p.gobj(); - g_assert((void*) x == (void*) y); - const GObject* c1 = p; - const GtkObject* c2 = p; - g_assert((void*) c1 == (void*) c2); - } - - { - gobj_ptr p = wrap_new(gtk_widget_new(0, "blah", nullptr, nullptr)); - gobj_ref r = *p; - GtkWidget* o1 = r.gobj(); - GtkWidget* o2 = p->gobj(); - g_assert(o1 == o2); - GtkWidget* x = p.gobj(); - GtkWidget* y = p.gobj(); - GtkObject* z = p.gobj(); - GObject* t = p.gobj(); - g_assert((void*) x == (void*) y); - g_assert((void*) z == (void*) t); - const GObject* c1 = p; - const GtkObject* c2 = p; - const GtkWidget* c3 = p; - g_assert((void*) c1 == (void*) c2); - g_assert((void*) c1 == (void*) c3); - - gobj_ref or(*p.gobj()); - or.freeze_notify(); - p->freeze_notify(); - - gobj_raw_ptr rp = p.gobj(); - } -} - -} // namespace _test -} // namespace moo - - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// -// GtkObject -// - -void -Object::destroy () -{ - gtk_object_destroy (gobj ()); -} - -#endif // 0 - - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// -// GtkTreeModel -// - -GtkTreeModelFlags -TreeModel::get_flags () -{ - return gtk_tree_model_get_flags (gobj ()); -} - -int -TreeModel::get_n_columns () -{ - return gtk_tree_model_get_n_columns (gobj ()); -} - -GType -TreeModel::get_column_type (int index_) -{ - return gtk_tree_model_get_column_type (gobj (), index_); -} - -bool -TreeModel::get_iter (GtkTreeIter& iter, const GtkTreePath& path) -{ - return gtk_tree_model_get_iter (gobj (), &iter, const_cast(&path)); -} - -bool -TreeModel::get_iter_from_string (GtkTreeIter& iter, const char* path_string) -{ - return gtk_tree_model_get_iter_from_string (gobj (), &iter, path_string); -} - -gstr -TreeModel::get_string_from_iter (const GtkTreeIter& iter) -{ - return gstr::wrap_new (gtk_tree_model_get_string_from_iter (gobj (), const_cast(&iter))); -} - -bool -TreeModel::get_iter_first (GtkTreeIter& iter) -{ - return gtk_tree_model_get_iter_first (gobj (), &iter); -} - -GtkTreePath* -TreeModel::get_path (const GtkTreeIter& iter) -{ - return gtk_tree_model_get_path (gobj (), const_cast(&iter)); -} - -void -TreeModel::get_value (const GtkTreeIter& iter, int column, GValue* value) -{ - gtk_tree_model_get_value (gobj (), const_cast(&iter), column, value); -} - -bool -TreeModel::iter_next (GtkTreeIter& iter) -{ - return gtk_tree_model_iter_next (gobj (), &iter); -} - -bool -TreeModel::iter_children (GtkTreeIter& iter, const GtkTreeIter& parent) -{ - return gtk_tree_model_iter_children (gobj (), &iter, const_cast(&parent)); -} - -bool -TreeModel::iter_has_child (const GtkTreeIter& iter) -{ - return gtk_tree_model_iter_has_child (gobj (), const_cast(&iter)); -} - -int -TreeModel::iter_n_children (const GtkTreeIter& iter) -{ - return gtk_tree_model_iter_n_children (gobj (), const_cast(&iter)); -} - -bool -TreeModel::iter_nth_child (GtkTreeIter& iter, const GtkTreeIter& parent, int n) -{ - return gtk_tree_model_iter_nth_child (gobj (), &iter, const_cast(&parent), n); -} - -bool -TreeModel::iter_parent (GtkTreeIter& iter, const GtkTreeIter& child) -{ - return gtk_tree_model_iter_parent (gobj (), &iter, const_cast(&child)); -} - - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// -// GtkListStore -// - -ListStorePtr -ListStore::create (size_t n_types, const GType* types) -{ - g_return_val_if_fail (types != nullptr, nullptr); - g_return_val_if_fail (n_types != 0, nullptr); - return wrap_new (gtk_list_store_newv (n_types, const_cast(types))); -} - -void -ListStore::set_value (const GtkTreeIter& iter, - int column, - GValue* value) -{ - gtk_list_store_set_value (gobj (), const_cast(&iter), column, value); -} - -void -ListStore::set_valuesv (const GtkTreeIter& iter, - int* columns, - GValue* values, - int n_values) -{ - gtk_list_store_set_valuesv (gobj (), const_cast(&iter), columns, values, n_values); -} - -bool -ListStore::remove (GtkTreeIter& iter) -{ - return gtk_list_store_remove (gobj (), &iter); -} - -void -ListStore::insert (GtkTreeIter& iter, - int position) -{ - gtk_list_store_insert (gobj (), &iter, position); -} - -void -ListStore::insert_before (GtkTreeIter& iter, - GtkTreeIter& sibling) -{ - gtk_list_store_insert_before (gobj (), &iter, &sibling); -} - -void -ListStore::insert_after (GtkTreeIter& iter, - GtkTreeIter& sibling) -{ - gtk_list_store_insert_after (gobj (), &iter, &sibling); -} - -//void -//ListStore::insert_with_values (GtkTreeIter* iter, -// int position, -// ...) -//{ -// gtk_list_store_insert_with_values (gobj (), &iter, position, ...); -//} -// -//void -//ListStore::insert_with_values (GtkTreeIter* iter, -// int position, -// int* columns, -// GValue* values, -// int n_values) -//{ -// gtk_list_store_insert_with_values (gobj (), &iter, position, columns, values, n_values); -//} - -void -ListStore::prepend (GtkTreeIter& iter) -{ - gtk_list_store_prepend (gobj (), &iter); -} - -void -ListStore::append (GtkTreeIter& iter) -{ - gtk_list_store_append (gobj (), &iter); -} - -void -ListStore::clear () -{ - gtk_list_store_clear (gobj ()); -} - -bool -ListStore::iter_is_valid (const GtkTreeIter& iter) -{ - return gtk_list_store_iter_is_valid (gobj (), const_cast(&iter)); -} - -void -ListStore::reorder (int* new_order) -{ - gtk_list_store_reorder (gobj (), new_order); -} - -void -ListStore::swap (GtkTreeIter& a, - GtkTreeIter& b) -{ - gtk_list_store_swap (gobj (), &a, &b); -} - -void -ListStore::move_after (GtkTreeIter& iter, - GtkTreeIter& position) -{ - gtk_list_store_move_after (gobj (), &iter, &position); -} - -void -ListStore::move_before (GtkTreeIter& iter, - GtkTreeIter& position) -{ - gtk_list_store_move_before (gobj (), &iter, &position); -} - - -#if 0 - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// -// GtkTreeView -// - -TreeViewPtr -TreeView::create (TreeModelPtr model) -{ - GtkWidget* w = model ? gtk_tree_view_new_with_model (model->gobj ()) : gtk_tree_view_new (); - return w ? wrap_new (GTK_TREE_VIEW (w)) : nullptr; -} - -TreeModelPtr -TreeView::get_model () -{ - return wrap (gtk_tree_view_get_model (gobj())); -} - -void -TreeView::set_model (TreeModelPtr model) -{ - gtk_tree_view_set_model (gobj (), model ? model->gobj () : nullptr); -} - -GtkTreeSelection* -TreeView::get_selection () -{ - return gtk_tree_view_get_selection (gobj ()); -} - -GtkAdjustment* -TreeView::get_hadjustment () -{ - return gtk_tree_view_get_hadjustment (gobj ()); -} - -void -TreeView::set_hadjustment (GtkAdjustment* adjustment) -{ - gtk_tree_view_set_hadjustment (gobj (), adjustment); -} - -GtkAdjustment* -TreeView::get_vadjustment () -{ - return gtk_tree_view_get_vadjustment (gobj ()); -} - -void -TreeView::set_vadjustment (GtkAdjustment* adjustment) -{ - gtk_tree_view_set_vadjustment (gobj (), adjustment); -} - -bool -TreeView::get_headers_visible () -{ - return gtk_tree_view_get_headers_visible (gobj ()); -} - -void -TreeView::set_headers_visible (bool headers_visible) -{ - gtk_tree_view_set_headers_visible (gobj (), headers_visible); -} - -void -TreeView::columns_autosize () -{ - gtk_tree_view_columns_autosize (gobj ()); -} - -bool -TreeView::get_headers_clickable () -{ - return gtk_tree_view_get_headers_clickable (gobj ()); -} - -void -TreeView::set_headers_clickable (bool setting) -{ - gtk_tree_view_set_headers_clickable (gobj (), setting); -} - -void -TreeView::set_rules_hint (bool setting) -{ - gtk_tree_view_set_rules_hint (gobj (), setting); -} - -bool -TreeView::get_rules_hint () -{ - return gtk_tree_view_get_rules_hint (gobj ()); -} - -int -TreeView::append_column (TreeViewColumn& column) -{ - return gtk_tree_view_append_column (gobj (), column.gobj ()); -} - -int -TreeView::remove_column (TreeViewColumn& column) -{ - return gtk_tree_view_remove_column (gobj (), column.gobj ()); -} - -int -TreeView::insert_column (TreeViewColumn& column, - int position) -{ - return gtk_tree_view_insert_column (gobj (), column.gobj (), position); -} - -//int -//TreeView::insert_column_with_attributes (int position, -// const char* title, -// CellRenderer& cell, -// ...) -//{ -// gtk_tree_view_insert_column_with_attributes (gobj (), position, -// const char* title, -// CellRenderer& cell, -// ...); -//} - -TreeViewColumnPtr -TreeView::get_column (int n) -{ - return wrap_new (gtk_tree_view_get_column (gobj (), n)); -} - -std::vector -TreeView::get_columns () -{ - GList* list = gtk_tree_view_get_columns (gobj ()); - auto ret = object_list_to_vector (list); - g_list_free (list); - return ret; -} - -void -TreeView::move_column_after (TreeViewColumn& column, - TreeViewColumn& base_column) -{ - return gtk_tree_view_move_column_after (gobj (), column.gobj (), base_column.gobj ()); -} - -void -TreeView::set_expander_column (TreeViewColumn& column) -{ - return gtk_tree_view_set_expander_column (gobj (), column.gobj ()); -} - -TreeViewColumnPtr -TreeView::get_expander_column () -{ - return wrap (gtk_tree_view_get_expander_column (gobj ())); -} - -void -TreeView::set_column_drag_function (GtkTreeViewColumnDropFunc func, - gpointer user_data, - GDestroyNotify destroy) -{ - gtk_tree_view_set_column_drag_function (gobj (), func, user_data, destroy); -} - -void -TreeView::scroll_to_point (int tree_x, - int tree_y) -{ - gtk_tree_view_scroll_to_point (gobj (), tree_x, tree_y); -} - -void -TreeView::scroll_to_cell (GtkTreePath* path, - TreeViewColumn& column, - bool use_align, - float row_align, - float col_align) -{ - gtk_tree_view_scroll_to_cell (gobj (), path, column.gobj (), use_align, row_align, col_align); -} - -void -TreeView::row_activated (GtkTreePath* path, - TreeViewColumn& column) -{ - gtk_tree_view_row_activated (gobj (), path, column.gobj ()); -} - -void -TreeView::expand_all () -{ - gtk_tree_view_expand_all (gobj ()); -} - -void -TreeView::collapse_all () -{ - gtk_tree_view_collapse_all (gobj ()); -} - -void -TreeView::expand_to_path (GtkTreePath* path) -{ - gtk_tree_view_expand_to_path (gobj (), path); -} - -bool -TreeView::expand_row (GtkTreePath* path, - bool open_all) -{ - return gtk_tree_view_expand_row (gobj (), path, open_all); -} - -bool -TreeView::collapse_row (GtkTreePath* path) -{ - return gtk_tree_view_collapse_row (gobj (), path); -} - -void -TreeView::map_expanded_rows (GtkTreeViewMappingFunc func, - gpointer data) -{ - gtk_tree_view_map_expanded_rows (gobj (), func, data); -} - -bool -TreeView::row_expanded (GtkTreePath* path) -{ - return gtk_tree_view_row_expanded (gobj (), path); -} - -void -TreeView::set_reorderable (bool reorderable) -{ - gtk_tree_view_set_reorderable (gobj (), reorderable); -} - -bool -TreeView::get_reorderable () -{ - return gtk_tree_view_get_reorderable (gobj ()); -} - -void -TreeView::set_cursor (GtkTreePath* path, - TreeViewColumn& focus_column, - bool start_editing) -{ - gtk_tree_view_set_cursor (gobj (), path, focus_column.gobj (), start_editing); -} - -void -TreeView::set_cursor_on_cell (GtkTreePath* path, - TreeViewColumn& focus_column, - CellRenderer& focus_cell, - bool start_editing) -{ - gtk_tree_view_set_cursor_on_cell (gobj (), path, focus_column.gobj (), focus_cell.gobj (), start_editing); -} - -void -TreeView::get_cursor (GtkTreePath** path, - TreeViewColumnPtr& focus_column) -{ - GtkTreeViewColumn* col = nullptr; - gtk_tree_view_get_cursor (gobj (), path, &col); - focus_column.set (col); -} - -GdkWindow* -TreeView::get_bin_window () -{ - return gtk_tree_view_get_bin_window (gobj ()); -} - -bool -TreeView::get_path_at_pos (int x, - int y, - GtkTreePath** path, - TreeViewColumnPtr& column, - int* cell_x, - int* cell_y) -{ - GtkTreeViewColumn* col = nullptr; - bool ret = gtk_tree_view_get_path_at_pos (gobj (), x, y, path, &col, cell_x, cell_y); - column.set (col); - return ret; -} - -void -TreeView::get_cell_area (GtkTreePath* path, - TreeViewColumn& column, - GdkRectangle& rect) -{ - gtk_tree_view_get_cell_area (gobj (), path, column.gobj(), &rect); -} - -void -TreeView::get_background_area (GtkTreePath* path, - TreeViewColumn& column, - GdkRectangle& rect) -{ - gtk_tree_view_get_background_area (gobj (), path, column.gobj (), &rect); -} - -void -TreeView::get_visible_rect (GdkRectangle& visible_rect) -{ - gtk_tree_view_get_visible_rect (gobj (), &visible_rect); -} - -bool -TreeView::get_visible_range (GtkTreePath** start_path, - GtkTreePath** end_path) -{ - return gtk_tree_view_get_visible_range (gobj (), start_path, end_path); -} - -void -TreeView::enable_model_drag_source (GdkModifierType start_button_mask, - const GtkTargetEntry* targets, - int n_targets, - GdkDragAction actions) -{ - gtk_tree_view_enable_model_drag_source (gobj (), start_button_mask, - targets, n_targets, actions); -} - -void -TreeView::enable_model_drag_dest (const GtkTargetEntry* targets, - int n_targets, - GdkDragAction actions) -{ - gtk_tree_view_enable_model_drag_dest (gobj (), targets, n_targets, actions); -} - -void -TreeView::unset_rows_drag_source () -{ - gtk_tree_view_unset_rows_drag_source (gobj ()); -} - -void -TreeView::unset_rows_drag_dest () -{ - gtk_tree_view_unset_rows_drag_dest (gobj ()); -} - -void -TreeView::set_drag_dest_row (GtkTreePath* path, - GtkTreeViewDropPosition pos) -{ - gtk_tree_view_set_drag_dest_row (gobj (), path, pos); -} - -void -TreeView::get_drag_dest_row (GtkTreePath** path, - GtkTreeViewDropPosition* pos) -{ - gtk_tree_view_get_drag_dest_row (gobj (), path, pos); -} - -bool -TreeView::get_dest_row_at_pos (int drag_x, - int drag_y, - GtkTreePath** path, - GtkTreeViewDropPosition* pos) -{ - return gtk_tree_view_get_dest_row_at_pos (gobj (), drag_x, drag_y, path, pos); -} - -GdkPixmap* -TreeView::create_row_drag_icon (GtkTreePath* path) -{ - return gtk_tree_view_create_row_drag_icon (gobj (), path); -} - -void -TreeView::set_enable_search (bool enable_search) -{ - gtk_tree_view_set_enable_search (gobj (), enable_search); -} - -bool -TreeView::get_enable_search () -{ - return gtk_tree_view_get_enable_search (gobj ()); -} - -int -TreeView::get_search_column () -{ - return gtk_tree_view_get_search_column (gobj ()); -} - -void -TreeView::set_search_column (int column) -{ - gtk_tree_view_set_search_column (gobj (), column); -} - -GtkTreeViewSearchEqualFunc -TreeView::get_search_equal_func () -{ - return gtk_tree_view_get_search_equal_func (gobj ()); -} - -void -TreeView::set_search_equal_func (GtkTreeViewSearchEqualFunc search_equal_func, - gpointer search_user_data, - GDestroyNotify search_destroy) -{ - gtk_tree_view_set_search_equal_func (gobj (), search_equal_func, search_user_data, search_destroy); -} - -GtkEntry* -TreeView::get_search_entry () -{ - return gtk_tree_view_get_search_entry (gobj ()); -} - -void -TreeView::set_search_entry (GtkEntry* entry) -{ - gtk_tree_view_set_search_entry (gobj (), entry); -} - -GtkTreeViewSearchPositionFunc -TreeView::get_search_position_func () -{ - return gtk_tree_view_get_search_position_func (gobj ()); -} - -void -TreeView::set_search_position_func (GtkTreeViewSearchPositionFunc func, - gpointer data, - GDestroyNotify destroy) -{ - gtk_tree_view_set_search_position_func (gobj (), func, data, destroy); -} - -void -TreeView::convert_widget_to_tree_coords (int wx, - int wy, - int* tx, - int* ty) -{ - gtk_tree_view_convert_widget_to_tree_coords (gobj (), wx, wy, tx, ty); -} - -void -TreeView::convert_tree_to_widget_coords (int tx, - int ty, - int* wx, - int* wy) -{ - gtk_tree_view_convert_tree_to_widget_coords (gobj (), tx, ty, wx, wy); -} - -void -TreeView::convert_widget_to_bin_window_coords (int wx, - int wy, - int* bx, - int* by) -{ - gtk_tree_view_convert_widget_to_bin_window_coords (gobj (), wx, wy, bx, by); -} - -void -TreeView::convert_bin_window_to_widget_coords (int bx, - int by, - int* wx, - int* wy) -{ - gtk_tree_view_convert_bin_window_to_widget_coords (gobj (), bx, by, wx, wy); -} - -void -TreeView::convert_tree_to_bin_window_coords (int tx, - int ty, - int* bx, - int* by) -{ - gtk_tree_view_convert_tree_to_bin_window_coords (gobj (), tx, ty, bx, by); -} - -void -TreeView::convert_bin_window_to_tree_coords (int bx, - int by, - int* tx, - int* ty) -{ - gtk_tree_view_convert_bin_window_to_tree_coords (gobj (), bx, by, tx, ty); -} - -void -TreeView::set_fixed_height_mode (bool enable) -{ - gtk_tree_view_set_fixed_height_mode (gobj (), enable); -} - -bool -TreeView::get_fixed_height_mode () -{ - return gtk_tree_view_get_fixed_height_mode (gobj ()); -} - -void -TreeView::set_hover_selection (bool hover) -{ - gtk_tree_view_set_hover_selection (gobj (), hover); -} - -bool -TreeView::get_hover_selection () -{ - return gtk_tree_view_get_hover_selection (gobj ()); -} - -void -TreeView::set_hover_expand (bool expand) -{ - gtk_tree_view_set_hover_expand (gobj (), expand); -} - -bool -TreeView::get_hover_expand () -{ - return gtk_tree_view_get_hover_expand (gobj ()); -} - -void -TreeView::set_rubber_banding (bool enable) -{ - gtk_tree_view_set_rubber_banding (gobj (), enable); -} - -bool -TreeView::get_rubber_banding () -{ - return gtk_tree_view_get_rubber_banding (gobj ()); -} - -bool -TreeView::is_rubber_banding_active () -{ - return gtk_tree_view_is_rubber_banding_active (gobj ()); -} - -GtkTreeViewRowSeparatorFunc -TreeView::get_row_separator_func () -{ - return gtk_tree_view_get_row_separator_func (gobj ()); -} - -void -TreeView::set_row_separator_func (GtkTreeViewRowSeparatorFunc func, - gpointer data, - GDestroyNotify destroy) -{ - gtk_tree_view_set_row_separator_func (gobj (), func, data, destroy); -} - -GtkTreeViewGridLines -TreeView::get_grid_lines () -{ - return gtk_tree_view_get_grid_lines (gobj ()); -} - -void -TreeView::set_grid_lines (GtkTreeViewGridLines grid_lines) -{ - gtk_tree_view_set_grid_lines (gobj (), grid_lines); -} - -bool -TreeView::get_enable_tree_lines () -{ - return gtk_tree_view_get_enable_tree_lines (gobj ()); -} - -void -TreeView::set_enable_tree_lines (bool enabled) -{ - gtk_tree_view_set_enable_tree_lines (gobj (), enabled); -} - -void -TreeView::set_show_expanders (bool enabled) -{ - gtk_tree_view_set_show_expanders (gobj (), enabled); -} - -bool -TreeView::get_show_expanders () -{ - return gtk_tree_view_get_show_expanders (gobj ()); -} - -void -TreeView::set_level_indentation (int indentation) -{ - gtk_tree_view_set_level_indentation (gobj (), indentation); -} - -int -TreeView::get_level_indentation () -{ - return gtk_tree_view_get_level_indentation (gobj ()); -} - -void -TreeView::set_tooltip_row (GtkTooltip* tooltip, - GtkTreePath* path) -{ - gtk_tree_view_set_tooltip_row (gobj (), tooltip, path); -} - -void -TreeView::set_tooltip_cell (GtkTooltip* tooltip, - GtkTreePath* path, - TreeViewColumn& column, - CellRenderer& cell) -{ - gtk_tree_view_set_tooltip_cell (gobj (), tooltip, path, column.gobj (), cell.gobj ()); -} - -bool -TreeView::get_tooltip_context (int* x, - int* y, - bool keyboard_tip, - GtkTreeModel** model, - GtkTreePath** path, - GtkTreeIter* iter) -{ - return gtk_tree_view_get_tooltip_context (gobj (), x, y, keyboard_tip, model, path, iter); -} - -void -TreeView::set_tooltip_column (int column) -{ - gtk_tree_view_set_tooltip_column (gobj (), column); -} - -int -TreeView::get_tooltip_column () -{ - return gtk_tree_view_get_tooltip_column (gobj ()); -} - - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// -// GtkTreeViewColumn -// - -TreeViewColumnPtr -TreeViewColumn::create () -{ - return wrap_new (gtk_tree_view_column_new ()); -} - -//TreeViewColumnPtr -//TreeViewColumn::create (const char* title, -// CellRendererPtr cell, -// ...) -//{ -//} - -void -TreeViewColumn::pack_start (CellRenderer& cell, bool expand) -{ - gtk_tree_view_column_pack_start (gobj (), cell.gobj(), expand); -} - -void -TreeViewColumn::pack_end (CellRenderer& cell, bool expand) -{ - gtk_tree_view_column_pack_end (gobj (), cell.gobj (), expand); -} - -void -TreeViewColumn::clear () -{ - gtk_tree_view_column_clear (gobj ()); -} - -std::vector -TreeViewColumn::get_cell_renderers () -{ - GList* list = gtk_tree_view_column_get_cell_renderers (gobj ()); - auto ret = object_list_to_vector (list); - g_list_free (list); - return ret; -} - -void -TreeViewColumn::add_attribute (CellRenderer& cell, - const char* attribute, - int column) -{ - gtk_tree_view_column_add_attribute (gobj (), cell.gobj (), attribute, column); -} - -void -TreeViewColumn::set_attributes (gtk::CellRenderer& cell_renderer, const char* prop, int column) -{ - gtk_tree_view_column_set_attributes (gobj (), cell_renderer.gobj (), prop, column, nullptr); -} - -void -TreeViewColumn::clear_attributes (CellRenderer& cell_renderer) -{ - gtk_tree_view_column_clear_attributes (gobj (), cell_renderer.gobj ()); -} - -void -TreeViewColumn::set_spacing (int spacing) -{ - gtk_tree_view_column_set_spacing (gobj (), spacing); -} - -int -TreeViewColumn::get_spacing () -{ - return gtk_tree_view_column_get_spacing (gobj ()); -} - -void -TreeViewColumn::set_visible (bool visible) -{ - gtk_tree_view_column_set_visible (gobj (), visible); -} - -bool -TreeViewColumn::get_visible () -{ - return gtk_tree_view_column_get_visible (gobj ()); -} - -void -TreeViewColumn::set_resizable (bool resizable) -{ - gtk_tree_view_column_set_resizable (gobj (), resizable); -} - -bool -TreeViewColumn::get_resizable () -{ - return gtk_tree_view_column_get_resizable (gobj ()); -} - -void -TreeViewColumn::set_sizing (GtkTreeViewColumnSizing type) -{ - gtk_tree_view_column_set_sizing (gobj (), type); -} - -GtkTreeViewColumnSizing -TreeViewColumn::get_sizing () -{ - return gtk_tree_view_column_get_sizing (gobj ()); -} - -int -TreeViewColumn::get_width () -{ - return gtk_tree_view_column_get_width (gobj ()); -} - -int -TreeViewColumn::get_fixed_width () -{ - return gtk_tree_view_column_get_fixed_width (gobj ()); -} - -void -TreeViewColumn::set_fixed_width (int fixed_width) -{ - gtk_tree_view_column_set_fixed_width (gobj (), fixed_width); -} - -void -TreeViewColumn::set_min_width (int min_width) -{ - gtk_tree_view_column_set_min_width (gobj (), min_width); -} - -int -TreeViewColumn::get_min_width () -{ - return gtk_tree_view_column_get_min_width (gobj ()); -} - -void -TreeViewColumn::set_max_width (int max_width) -{ - gtk_tree_view_column_set_max_width (gobj (), max_width); -} - -int -TreeViewColumn::get_max_width () -{ - return gtk_tree_view_column_get_max_width (gobj ()); -} - -void -TreeViewColumn::clicked () -{ - gtk_tree_view_column_clicked (gobj ()); -} - -void -TreeViewColumn::set_title (const char* title) -{ - gtk_tree_view_column_set_title (gobj (), title); -} - -gstr -TreeViewColumn::get_title () -{ - return gstr::wrap (gtk_tree_view_column_get_title (gobj ())); -} - -void -TreeViewColumn::set_expand (bool expand) -{ - gtk_tree_view_column_set_expand (gobj (), expand); -} - -bool -TreeViewColumn::get_expand () -{ - return gtk_tree_view_column_get_expand (gobj ()); -} - -void -TreeViewColumn::set_clickable (bool clickable) -{ - gtk_tree_view_column_set_clickable (gobj (), clickable); -} - -bool -TreeViewColumn::get_clickable () -{ - return gtk_tree_view_column_get_clickable (gobj ()); -} - -void -TreeViewColumn::set_widget (WidgetPtr widget) -{ - gtk_tree_view_column_set_widget (gobj (), widget.gobj ()); -} - -WidgetPtr -TreeViewColumn::get_widget () -{ - return wrap (gtk_tree_view_column_get_widget (gobj ())); -} - -void -TreeViewColumn::set_alignment (float xalign) -{ - gtk_tree_view_column_set_alignment (gobj (), xalign); -} - -float -TreeViewColumn::get_alignment () -{ - return gtk_tree_view_column_get_alignment (gobj ()); -} - -void -TreeViewColumn::set_reorderable (bool reorderable) -{ - gtk_tree_view_column_set_reorderable (gobj (), reorderable); -} - -bool -TreeViewColumn::get_reorderable () -{ - return gtk_tree_view_column_get_reorderable (gobj ()); -} - -void -TreeViewColumn::set_sort_column_id (int sort_column_id) -{ - gtk_tree_view_column_set_sort_column_id (gobj (), sort_column_id); -} - -int -TreeViewColumn::get_sort_column_id () -{ - return gtk_tree_view_column_get_sort_column_id (gobj ()); -} - -void -TreeViewColumn::set_sort_indicator (bool setting) -{ - gtk_tree_view_column_set_sort_indicator (gobj (), setting); -} - -bool -TreeViewColumn::get_sort_indicator () -{ - return gtk_tree_view_column_get_sort_indicator (gobj ()); -} - -void -TreeViewColumn::set_sort_order (GtkSortType order) -{ - gtk_tree_view_column_set_sort_order (gobj (), order); -} - -GtkSortType -TreeViewColumn::get_sort_order () -{ - return gtk_tree_view_column_get_sort_order (gobj ()); -} - -TreeViewPtr -TreeViewColumn::get_tree_view () -{ - GtkWidget* w = gtk_tree_view_column_get_tree_view (gobj ()); - return w ? wrap (GTK_TREE_VIEW (w)) : nullptr; -} - - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// -// GtkCellRenderer -// - - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// -// GtkCellRendererText -// - -gtk::CellRendererTextPtr -CellRendererText::create () -{ - return wrap_new (up_cast (gtk_cell_renderer_text_new ())); -} - -void CellRendererText::set_fixed_height_from_font (int number_of_rows) -{ - gtk_cell_renderer_text_set_fixed_height_from_font (gobj (), number_of_rows); -} - - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// -// GtkCellRendererPixbuf -// - -gtk::CellRendererPixbufPtr -CellRendererPixbuf::create () -{ - return wrap_new (up_cast (gtk_cell_renderer_pixbuf_new ())); -} - - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// -// GtkCellRendererToggle -// - -gtk::CellRendererTogglePtr -CellRendererToggle::create () -{ - return wrap_new (up_cast (gtk_cell_renderer_toggle_new ())); -} - -bool -CellRendererToggle::get_radio () -{ - return gtk_cell_renderer_toggle_get_radio (gobj ()); -} - -void -CellRendererToggle::set_radio (bool radio) -{ - gtk_cell_renderer_toggle_set_radio (gobj (), radio); -} - -bool -CellRendererToggle::get_active () -{ - return gtk_cell_renderer_toggle_get_active (gobj ()); -} - -void -CellRendererToggle::set_active (bool active) -{ - gtk_cell_renderer_toggle_set_active (gobj(), active); -} - -#endif // 0 diff --git a/moo/gpp/gobjtypes-gtk.h b/moo/gpp/gobjtypes-gtk.h deleted file mode 100644 index 7448d627..00000000 --- a/moo/gpp/gobjtypes-gtk.h +++ /dev/null @@ -1,620 +0,0 @@ -/* - * moogpp/gobjtypes-gtk.h - * - * Copyright (C) 2004-2016 by Yevgen Muntyan - * - * This file is part of medit. medit 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. - * - * You should have received a copy of the GNU Lesser General Public - * License along with medit. If not, see . - */ - -#pragma once - -#ifndef __cplusplus -#error "This is a C++ header" -#endif - -#include - -#include "moogpp/gobjtypes-glib.h" -#include "moogpp/strutils.h" -#include -#include - -#define MOO_DEFINE_GTK_TYPE(Object, Parent, obj_g_type) \ - MOO_DEFINE_SIMPLE_GOBJ_CLASS(Object, Parent, Gtk##Object, obj_g_type) \ - -#define MOO_DEFINE_GTK_IFACE(Iface, iface_g_type) \ - MOO_DEFINE_GIFACE_TYPE(Gtk##Iface, iface_g_type) \ - namespace moo { \ - namespace gtk { \ - MOO_GIFACE_TYPEDEFS(Iface, Gtk##Iface) \ - } \ - } - -namespace gtk -{ - -using gstr = g::gstr; -using gerrp = g::gerrp; - -MOO_DECLARE_GOBJ_CLASS(Object); -MOO_DECLARE_GOBJ_CLASS(Widget); -MOO_DECLARE_GOBJ_CLASS(TextView); -MOO_DECLARE_GOBJ_CLASS(TreeModel); -MOO_DECLARE_GOBJ_CLASS(TreeStore); -MOO_DECLARE_GOBJ_CLASS(ListStore); -MOO_DECLARE_GOBJ_CLASS(TreeView); -MOO_DECLARE_GOBJ_CLASS(TreeViewColumn); -MOO_DECLARE_GOBJ_CLASS(CellRenderer); -MOO_DECLARE_GOBJ_CLASS(CellRendererText); -MOO_DECLARE_GOBJ_CLASS(CellRendererToggle); -MOO_DECLARE_GOBJ_CLASS(CellRendererPixbuf); - -MOO_DEFINE_GTK_TYPE(Object, g::Object, GTK_TYPE_OBJECT); -MOO_DEFINE_GTK_TYPE(Widget, gtk::Object, GTK_TYPE_WIDGET); - -MOO_DEFINE_GTK_TYPE(Entry, gtk::Widget, GTK_TYPE_ENTRY); -MOO_DEFINE_GTK_TYPE(Action, g::Object, GTK_TYPE_ACTION); -MOO_DEFINE_GTK_TYPE(TextBuffer, g::Object, GTK_TYPE_TEXT_BUFFER); -MOO_DEFINE_GTK_TYPE(TextMark, g::Object, GTK_TYPE_TEXT_MARK); -MOO_DEFINE_GTK_TYPE(MenuShell, gtk::Widget, GTK_TYPE_MENU_SHELL); -MOO_DEFINE_GTK_TYPE(Menu, gtk::MenuShell, GTK_TYPE_MENU); - -class TextView : public Widget -{ - MOO_GOBJ_CLASS_DECL(TextView, Widget, GtkTextView, GTK_TYPE_TEXT_VIEW) - -public: - gtk::TextBuffer get_buffer (); -}; - - -class TreeModel : public g::Iface -{ - MOO_GOBJ_IFACE_DECL(TreeModel, GtkTreeModel, GTK_TYPE_TREE_MODEL) - -public: - GtkTreeModelFlags get_flags (); - int get_n_columns (); - GType get_column_type (int index_); - - bool get_iter (GtkTreeIter& iter, const GtkTreePath& path); - bool get_iter_from_string (GtkTreeIter& iter, const char* path_string); - gstr get_string_from_iter (const GtkTreeIter& iter); - bool get_iter_first (GtkTreeIter& iter); - GtkTreePath* get_path (const GtkTreeIter& iter); - void get_value (const GtkTreeIter& iter, int column, GValue* value); - bool iter_next (GtkTreeIter& iter); - bool iter_children (GtkTreeIter& iter, const GtkTreeIter& parent); - bool iter_has_child (const GtkTreeIter& iter); - int iter_n_children (const GtkTreeIter& iter); - bool iter_nth_child (GtkTreeIter& iter, const GtkTreeIter& parent, int n); - bool iter_parent (GtkTreeIter& iter, const GtkTreeIter& child); - - void get (const GtkTreeIter& iter, int column, bool& dest) - { - gboolean val; - gtk_tree_model_get (gobj (), const_cast(&iter), column, &val, -1); - dest = val; - } - - template - void get (const GtkTreeIter& iter, int column, T&& dest) - { - gtk_tree_model_get (gobj (), const_cast(&iter), column, cpp_vararg_dest_fixer::apply (std::forward (dest)), -1); - } - - template - void get (const GtkTreeIter& iter, int column, T&& dest, Args&&... args) - { - get (iter, column, std::forward (dest)); - get (iter, std::forward (args)...); - } - - // bool TFunc (const GtkTreePath&, const GtkTreeIter&) - template - void foreach (const TFunc& func) - { - const void* p = &func; - gtk_tree_model_foreach (gobj (), foreach_func, const_cast(p)); - } - -private: - template - static gboolean foreach_func (GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data) - { - const TFunc& func = *reinterpret_cast(data); - return func (const_cast(*path), const_cast(*iter)); - } -}; - -class ListStore : public g::Object, public TreeModel -{ - MOO_GOBJ_CLASS_DECL(ListStore, g::Object, GtkListStore, GTK_TYPE_LIST_STORE) - -public: - static gtk::ListStorePtr create (std::initializer_list types) - { - return create (types.size (), types.begin ()); - } - - static gtk::ListStorePtr create (size_t n_columns, std::initializer_list types) - { - g_return_val_if_fail (n_columns == types.size (), nullptr); - return create (n_columns, types.begin ()); - } - - static gtk::ListStorePtr create (size_t n_columns, const GType* types); - - template - void set (const GtkTreeIter& iter, int column, T&& value) - { - gtk_list_store_set (gobj (), const_cast(&iter), column, cpp_vararg_value_fixer::apply (std::forward (value)), -1); - } - - template - void set (const GtkTreeIter& iter, int column, T&& value, Args&&... args) - { - set (iter, column, std::forward (value)); - set (iter, std::forward (args)...); - } - - void set_value (const GtkTreeIter& iter, - int column, - GValue* value); - void set_valuesv (const GtkTreeIter& iter, - int* columns, - GValue* values, - int n_values); - bool remove (GtkTreeIter& iter); - void insert (GtkTreeIter& iter, - int position); - void insert_before (GtkTreeIter& iter, - GtkTreeIter& sibling); - void insert_after (GtkTreeIter& iter, - GtkTreeIter& sibling); - //void insert_with_values (GtkTreeIter* iter, - // int position, - // ...); - //void insert_with_values (GtkTreeIter* iter, - // int position, - // int* columns, - // GValue* values, - // int n_values); - void prepend (GtkTreeIter& iter); - void append (GtkTreeIter& iter); - void clear (); - bool iter_is_valid (const GtkTreeIter& iter); - void reorder (int* new_order); - void swap (GtkTreeIter& a, - GtkTreeIter& b); - void move_after (GtkTreeIter& iter, - GtkTreeIter& position); - void move_before (GtkTreeIter& iter, - GtkTreeIter& position); -}; - -class TreeStore : public g::Object, public TreeModel -{ - MOO_GOBJ_CLASS_DECL(TreeStore, g::Object, GtkTreeStore, GTK_TYPE_TREE_STORE) -}; - -MOO_DEFINE_GTK_TYPE(Container, Widget, GTK_TYPE_CONTAINER); -MOO_DEFINE_GTK_TYPE(TreeView, Container, GTK_TYPE_TREE_VIEW); -MOO_DEFINE_GTK_TYPE(TreeViewColumn, Object, GTK_TYPE_TREE_VIEW_COLUMN); -MOO_DEFINE_GTK_TYPE(CellRenderer, Object, GTK_TYPE_CELL_RENDERER); -MOO_DEFINE_GTK_TYPE(CellRendererText, CellRenderer, GTK_TYPE_CELL_RENDERER_TEXT); -MOO_DEFINE_GTK_TYPE(CellRendererPixbuf, CellRenderer, GTK_TYPE_CELL_RENDERER_PIXBUF); -MOO_DEFINE_GTK_TYPE(CellRendererToggle, CellRenderer, GTK_TYPE_CELL_RENDERER_TOGGLE); - -#if 0 - -template -class TreeCellDataFunc -{ -public: - TreeCellDataFunc (TFunc func) : m_func (std::move (func)) {} - ~TreeCellDataFunc () {} - - MOO_DISABLE_COPY_OPS (TreeCellDataFunc); - - static void destroy (gpointer d) { delete reinterpret_cast(d); } - - static void cell_data_func (GtkTreeViewColumn *tree_column, - GtkCellRenderer *cell, - GtkTreeModel *tree_model, - GtkTreeIter *iter, - gpointer p); - -private: - TFunc m_func; -}; - - -template<> -class moo::gobj_ref : public virtual moo::gobj_ref_parent -{ -public: - MOO_DEFINE_GOBJREF_METHODS (GtkTreeView); - - static gtk::TreeViewPtr create (gtk::TreeModelPtr model); - - gtk::TreeModelPtr get_model (); - void set_model (gtk::TreeModelPtr model); - GtkTreeSelection* get_selection (); - GtkAdjustment* get_hadjustment (); - void set_hadjustment (GtkAdjustment* adjustment); - GtkAdjustment* get_vadjustment (); - void set_vadjustment (GtkAdjustment* adjustment); - bool get_headers_visible (); - void set_headers_visible (bool headers_visible); - void columns_autosize (); - bool get_headers_clickable (); - void set_headers_clickable (bool setting); - void set_rules_hint (bool setting); - bool get_rules_hint (); - - /* Column funtions */ - int append_column (gtk::TreeViewColumn& column); - int remove_column (gtk::TreeViewColumn& column); - int insert_column (gtk::TreeViewColumn& column, - int position); - int insert_column_with_attributes (int position, - const char* title, - gtk::CellRenderer& cell, - ...) G_GNUC_NULL_TERMINATED; - - template - int insert_column_with_data_func (int position, - const char* title, - gtk::CellRenderer& cell, - TFunc func); - - gtk::TreeViewColumnPtr get_column (int n); - std::vector get_columns (); - void move_column_after (gtk::TreeViewColumn& column, - gtk::TreeViewColumn& base_column); - void set_expander_column (gtk::TreeViewColumn& column); - gtk::TreeViewColumnPtr get_expander_column (); - void set_column_drag_function (GtkTreeViewColumnDropFunc func, - gpointer user_data, - GDestroyNotify destroy); - - /* Actions */ - void scroll_to_point (int tree_x, - int tree_y); - void scroll_to_cell (GtkTreePath* path, - gtk::TreeViewColumn& column, - bool use_align, - float row_align, - float col_align); - void row_activated (GtkTreePath* path, - gtk::TreeViewColumn& column); - void expand_all (); - void collapse_all (); - void expand_to_path (GtkTreePath* path); - bool expand_row (GtkTreePath* path, - bool open_all); - bool collapse_row (GtkTreePath* path); - void map_expanded_rows (GtkTreeViewMappingFunc func, - gpointer data); - bool row_expanded (GtkTreePath* path); - void set_reorderable (bool reorderable); - bool get_reorderable (); - void set_cursor (GtkTreePath* path, - gtk::TreeViewColumn& focus_column, - bool start_editing); - void set_cursor_on_cell (GtkTreePath* path, - gtk::TreeViewColumn& focus_column, - gtk::CellRenderer& focus_cell, - bool start_editing); - void get_cursor (GtkTreePath** path, - gtk::TreeViewColumnPtr& focus_column); - - /* Layout information */ - GdkWindow* get_bin_window (); - bool get_path_at_pos (int x, - int y, - GtkTreePath** path, - gtk::TreeViewColumnPtr& column, - int* cell_x, - int* cell_y); - void get_cell_area (GtkTreePath* path, - gtk::TreeViewColumn& column, - GdkRectangle& rect); - void get_background_area (GtkTreePath* path, - gtk::TreeViewColumn& column, - GdkRectangle& rect); - void get_visible_rect (GdkRectangle& visible_rect); - - bool get_visible_range (GtkTreePath** start_path, - GtkTreePath** end_path); - - /* Drag-and-Drop support */ - void enable_model_drag_source (GdkModifierType start_button_mask, - const GtkTargetEntry* targets, - int n_targets, - GdkDragAction actions); - void enable_model_drag_dest (const GtkTargetEntry* targets, - int n_targets, - GdkDragAction actions); - void unset_rows_drag_source (); - void unset_rows_drag_dest (); - - /* These are useful to implement your own custom stuff. */ - void set_drag_dest_row (GtkTreePath* path, - GtkTreeViewDropPosition pos); - void get_drag_dest_row (GtkTreePath** path, - GtkTreeViewDropPosition* pos); - bool get_dest_row_at_pos (int drag_x, - int drag_y, - GtkTreePath** path, - GtkTreeViewDropPosition* pos); - GdkPixmap* create_row_drag_icon (GtkTreePath* path); - - /* Interactive search */ - void set_enable_search (bool enable_search); - bool get_enable_search (); - int get_search_column (); - void set_search_column (int column); - GtkTreeViewSearchEqualFunc get_search_equal_func (); - void set_search_equal_func (GtkTreeViewSearchEqualFunc search_equal_func, - gpointer search_user_data, - GDestroyNotify search_destroy); - - GtkEntry* get_search_entry (); - void set_search_entry (GtkEntry* entry); - GtkTreeViewSearchPositionFunc get_search_position_func (); - void set_search_position_func (GtkTreeViewSearchPositionFunc func, - gpointer data, - GDestroyNotify destroy); - - /* Convert between the different coordinate systems */ - void convert_widget_to_tree_coords (int wx, - int wy, - int* tx, - int* ty); - void convert_tree_to_widget_coords (int tx, - int ty, - int* wx, - int* wy); - void convert_widget_to_bin_window_coords (int wx, - int wy, - int* bx, - int* by); - void convert_bin_window_to_widget_coords (int bx, - int by, - int* wx, - int* wy); - void convert_tree_to_bin_window_coords (int tx, - int ty, - int* bx, - int* by); - void convert_bin_window_to_tree_coords (int bx, - int by, - int* tx, - int* ty); - - void set_fixed_height_mode (bool enable); - bool get_fixed_height_mode (); - void set_hover_selection (bool hover); - bool get_hover_selection (); - void set_hover_expand (bool expand); - bool get_hover_expand (); - void set_rubber_banding (bool enable); - bool get_rubber_banding (); - - bool is_rubber_banding_active (); - - GtkTreeViewRowSeparatorFunc get_row_separator_func (); - void set_row_separator_func (GtkTreeViewRowSeparatorFunc func, - gpointer data, - GDestroyNotify destroy); - - GtkTreeViewGridLines get_grid_lines (); - void set_grid_lines (GtkTreeViewGridLines grid_lines); - bool get_enable_tree_lines (); - void set_enable_tree_lines (bool enabled); - void set_show_expanders (bool enabled); - bool get_show_expanders (); - void set_level_indentation (int indentation); - int get_level_indentation (); - - /* Convenience functions for setting tooltips */ - void set_tooltip_row (GtkTooltip* tooltip, - GtkTreePath* path); - void set_tooltip_cell (GtkTooltip* tooltip, - GtkTreePath* path, - gtk::TreeViewColumn& column, - gtk::CellRenderer& cell); - bool get_tooltip_context (int* x, - int* y, - bool keyboard_tip, - GtkTreeModel** model, - GtkTreePath** path, - GtkTreeIter* iter); - void set_tooltip_column (int column); - int get_tooltip_column (); -}; - -template<> -class moo::gobj_ref : public virtual moo::gobj_ref_parent -{ -public: - MOO_DEFINE_GOBJREF_METHODS (GtkTreeViewColumn); - - static gtk::TreeViewColumnPtr create (); - static gtk::TreeViewColumnPtr create (const char* title, - gtk::CellRendererPtr cell, - ...) G_GNUC_NULL_TERMINATED; - - void pack_start (gtk::CellRenderer& cell, - bool expand); - void pack_end (gtk::CellRenderer& cell, - bool expand); - void clear (); - std::vector get_cell_renderers (); - void add_attribute (gtk::CellRenderer& cell, - const char* attribute, - int column); - - void set_attributes (gtk::CellRenderer& cell_renderer, const char* prop, int column); - - template - void set_attributes (gtk::CellRenderer& cell_renderer, const char* prop, int column, Args&&... args) - { - set_attributes (cell_renderer, prop, column); - set_attributes (cell_renderer, std::forward (args)...); - } - - // void TFunc(gtk::TreeViewColumn, gtk::CellRenderer, gtk::TreeModel, const GtkTreeIter&) - template - inline void set_cell_data_func (gtk::CellRenderer& cell_renderer, TFunc func); - - void clear_attributes (gtk::CellRenderer& cell_renderer); - void set_spacing (int spacing); - int get_spacing (); - void set_visible (bool visible); - bool get_visible (); - void set_resizable (bool resizable); - bool get_resizable (); - void set_sizing (GtkTreeViewColumnSizing type); - GtkTreeViewColumnSizing get_sizing (); - int get_width (); - int get_fixed_width (); - void set_fixed_width (int fixed_width); - void set_min_width (int min_width); - int get_min_width (); - void set_max_width (int max_width); - int get_max_width (); - void clicked (); - - /* Options for manipulating the column headers - */ - void set_title (const char* title); - gstr get_title (); - void set_expand (bool expand); - bool get_expand (); - void set_clickable (bool clickable); - bool get_clickable (); - void set_widget (gtk::WidgetPtr widget); - gtk::WidgetPtr get_widget (); - void set_alignment (float xalign); - float get_alignment (); - void set_reorderable (bool reorderable); - bool get_reorderable (); - - /* You probably only want to use gtk_tree_view_column_set_sort_column_id. The - * other sorting functions exist primarily to let others do their own custom sorting. - */ - void set_sort_column_id (int sort_column_id); - int get_sort_column_id (); - void set_sort_indicator (bool setting); - bool get_sort_indicator (); - void set_sort_order (GtkSortType order); - GtkSortType get_sort_order (); - - gtk::TreeViewPtr get_tree_view (); -}; - -template<> -class moo::gobj_ref : public virtual moo::gobj_ref_parent -{ -public: - MOO_DEFINE_GOBJREF_METHODS (GtkCellRenderer); -}; - -template<> -class moo::gobj_ref : public virtual moo::gobj_ref_parent -{ -public: - MOO_DEFINE_GOBJREF_METHODS (GtkCellRendererText); - - static gtk::CellRendererTextPtr create (); - - void set_fixed_height_from_font (int number_of_rows); -}; - -template<> -class moo::gobj_ref : public virtual moo::gobj_ref_parent -{ -public: - MOO_DEFINE_GOBJREF_METHODS (GtkCellRendererToggle); - - static gtk::CellRendererTogglePtr create (); - - bool get_radio (); - void set_radio (bool radio); - bool get_active (); - void set_active (bool active); -}; - -template<> -class moo::gobj_ref : public virtual moo::gobj_ref_parent -{ -public: - MOO_DEFINE_GOBJREF_METHODS (GtkCellRendererPixbuf); - - static gtk::CellRendererPixbufPtr create (); -}; - - -template -inline void -TreeCellDataFunc::cell_data_func (GtkTreeViewColumn *tree_column, - GtkCellRenderer *cell, - GtkTreeModel *tree_model, - GtkTreeIter *iter, - gpointer p) -{ - g_return_if_fail (GTK_IS_TREE_VIEW_COLUMN (tree_column)); - g_return_if_fail (GTK_IS_CELL_RENDERER (cell)); - g_return_if_fail (GTK_IS_TREE_MODEL (tree_model)); - g_return_if_fail (iter != nullptr); - g_return_if_fail (p != nullptr); - TreeCellDataFunc& data = *reinterpret_cast(p); - data.m_func (moo::wrap (*tree_column), moo::wrap (*cell), moo::wrap (*tree_model), - const_cast(*iter)); -} - - -template -inline int -moo::gobj_ref::insert_column_with_data_func (int position, - const char* title, - gtk::CellRenderer& cell, - TFunc func) -{ - TreeCellDataFunc *data = new TreeCellDataFunc{ std::move (func) }; - return gtk_tree_view_insert_column_with_data_func (gobj (), position, title, cell.gobj (), - TreeCellDataFunc::cell_data_func, data, - TreeCellDataFunc::destroy); -} - - -// void TFunc(gtk::TreeViewColumn, gtk::CellRenderer, gtk::TreeModel, const GtkTreeIter&) -template -inline void -moo::gobj_ref::set_cell_data_func (gtk::CellRenderer& cell_renderer, TFunc func) -{ - TreeCellDataFunc *data = new TreeCellDataFunc{ std::move (func) }; - gtk_tree_view_column_set_cell_data_func (gobj (), cell_renderer.gobj (), - TreeCellDataFunc::cell_data_func, data, - TreeCellDataFunc::destroy); -} - -MOO_DEFINE_FLAGS(GdkEventMask); -MOO_DEFINE_FLAGS(GdkModifierType); -MOO_DEFINE_FLAGS(GtkCellRendererState); -MOO_DEFINE_FLAGS(GtkAttachOptions); -MOO_DEFINE_FLAGS(GdkDragAction); - -#endif // 0 - -} // namespace gtk diff --git a/moo/gpp/gparam.h b/moo/gpp/gparam.h deleted file mode 100644 index 24b3837e..00000000 --- a/moo/gpp/gparam.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - * moogpp/gparam.h - * - * Copyright (C) 2004-2016 by Yevgen Muntyan - * - * This file is part of medit. medit 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. - * - * You should have received a copy of the GNU Lesser General Public - * License along with medit. If not, see . - */ - -#pragma once - -#ifndef __cplusplus -#error "This is a C++ header" -#endif - -#include -#include -#include -#include - -namespace g { - -// Bit-compatible with GValue -class Value : public GValue -{ -public: - Value(); - ~Value(); - - Value(Value&&); - Value& operator=(Value&&); - - Value(const Value&) = delete; - Value& operator=(const Value&) = delete; - - void init(GType type); -}; - -// Bit-compatible with GParameter -class Parameter : public GParameter -{ -public: - explicit Parameter(const char* name = nullptr); - ~Parameter(); - - Parameter(Parameter&&); - Parameter& operator=(Parameter&&); - - Parameter(const Parameter&) = delete; - Parameter& operator=(const Parameter&) = delete; -}; - -using ValueArray = std::vector; -using ParameterArray = std::vector; - -} // namespace g diff --git a/moo/gpp/gutil.cpp b/moo/gpp/gutil.cpp deleted file mode 100644 index 34b3afc6..00000000 --- a/moo/gpp/gutil.cpp +++ /dev/null @@ -1,130 +0,0 @@ -/* - * moocpp/gutil.cpp - * - * Copyright (C) 2004-2016 by Yevgen Muntyan - * - * This file is part of medit. medit 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. - * - * You should have received a copy of the GNU Lesser General Public - * License along with medit. If not, see . - */ - -#include "moocpp/gutil.h" - -namespace moo { -namespace g { - -gstr filename_to_utf8 (const char* opsysstring) -{ - return gstr::wrap_new (g_filename_to_utf8 (opsysstring, -1, nullptr, nullptr, nullptr)); -} - -gstr filename_from_utf8 (const gchar* utf8string) -{ - return gstr::wrap_new (g_filename_from_utf8 (utf8string, -1, nullptr, nullptr, nullptr)); -} - -gstr build_filename (const char* c1, const char* c2, const char* c3, const char* c4, const char* c5) -{ - return gstr::wrap_new (g_build_filename (c1, c2, c3, c4, c5, nullptr)); -} - -gstr filename_to_uri (const char* filename) -{ - return gstr::wrap_new (g_filename_to_uri (filename, nullptr, nullptr)); -} - -gstr filename_from_uri (const char *uri) -{ - return gstr::wrap_new (g_filename_from_uri (uri, nullptr, nullptr)); -} - -gstr path_get_dirname (const char* filename) -{ - return gstr::wrap_new (g_path_get_dirname (filename)); -} - -gstr filename_display_name (const char* filename) -{ - return gstr::wrap_new (g_filename_display_name (filename)); -} - -gstr filename_display_basename (const char* filename) -{ - return gstr::wrap_new (g_filename_display_basename (filename)); -} - -bool file_get_contents (const char* path, gstr& data, gsize& data_len, gerrp& error) -{ - gstrp contents; - - if (!g_file_get_contents (path, contents.pp (), &data_len, &error)) - { - data.reset (); - return false; - } - - data = gstr::wrap_new (contents.release ()); - return true; -} - -gstr uri_escape_string (const char* unescaped, const char* reserved_chars_allowed, bool allow_utf8) -{ - return gstr::wrap_new (g_uri_escape_string (unescaped, reserved_chars_allowed, allow_utf8)); -} - -gstr get_current_dir () -{ - return gstr::wrap_new (g_get_current_dir ()); -} - -gstr locale_to_utf8 (const char* str) -{ - return gstr::wrap_new (g_locale_to_utf8 (str, -1, nullptr, nullptr, nullptr)); -} - -gstr convert (const char* str, gssize len, const char* to_codeset, const char* from_codeset, gsize& bytes_read, gsize& bytes_written, gerrp& error) -{ - return gstr::wrap_new (g_convert (str, len, to_codeset, from_codeset, &bytes_read, &bytes_written, &error)); -} - -gstr utf8_normalize (const char* str, GNormalizeMode mode) -{ - return gstr::wrap_new (g_utf8_normalize (str, -1, mode)); -} - -gstr utf8_strup (const char* str) -{ - return gstr::wrap_new (g_utf8_strup (str, -1)); -} - -gstr utf8_strdown (const char* str) -{ - return gstr::wrap_new (g_utf8_strdown (str, -1)); -} - -gstr markup_vprintf_escaped (const char* fmt, va_list args) -{ - return gstr::wrap_new (g_markup_vprintf_escaped (fmt, args)); -} - -#ifdef __WIN32__ - -gstr win32_error_message (guint32 code) -{ - return gstr::wrap_new (g_win32_error_message (code)); -} - -gstr utf16_to_utf8 (const wchar_t* str) -{ - return gstr::wrap_new (g_utf16_to_utf8 (reinterpret_cast(str), -1, nullptr, nullptr, nullptr)); -} - -#endif // __WIN32__ - -} // namespace g -} // namespace moo diff --git a/moo/gpp/gutil.h b/moo/gpp/gutil.h deleted file mode 100644 index 8df840f5..00000000 --- a/moo/gpp/gutil.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - * moogpp/gutil.h - * - * Copyright (C) 2004-2016 by Yevgen Muntyan - * - * This file is part of medit. medit 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. - * - * You should have received a copy of the GNU Lesser General Public - * License along with medit. If not, see . - */ - -#pragma once - -#ifndef __cplusplus -#error "This is a C++ header" -#endif - -#include -#include -#include - -namespace g { - -gstr build_filename(const char* c1, const char* c2, const char* c3 = nullptr, const char* c4 = nullptr, const char* c5 = nullptr); -gstr filename_to_uri(const char* filename); -gstr filename_from_uri(const char *uri); -gstr path_get_dirname (const char* filename); -gstr path_get_basename (const char* filename); -gstr filename_display_name (const char* filename); -gstr filename_display_basename (const char* filename); -bool file_get_contents (const char* path, gstr& data, gsize& data_len, gerrp& error); -gstr uri_escape_string(const char* unescaped, const char* reserved_chars_allowed = nullptr, bool allow_utf8 = false); -gstr filename_to_utf8 (const char* opsysstring); -gstr filename_from_utf8(const gchar* utf8string); - -gstr get_current_dir(); - -gstr locale_to_utf8(const char* str); -gstr convert(const char* str, gssize len, const char* to_codeset, const char* from_codeset, gsize& bytes_read, gsize& bytes_written, gerrp& error); - -gstr utf8_normalize(const char* str, GNormalizeMode mode); -gstr utf8_strup(const char* str); -gstr utf8_strdown(const char* str); - -gstr markup_vprintf_escaped(const char* fmt, va_list args) G_GNUC_PRINTF (1, 0); - -template -inline gstr markup_printf_escaped (const char* format, Args&& ...args) -{ - return gstr::wrap_new (printf_helper::callv (g_markup_printf_escaped, format, std::forward (args)...)); -} - -#ifdef __WIN32__ -gstr win32_error_message(guint32 code); -gstr utf16_to_utf8(const wchar_t* str); -#endif // __WIN32__ - -} // namespace g diff --git a/moo/gpp/memutils.h b/moo/gpp/memutils.h deleted file mode 100644 index de01188d..00000000 --- a/moo/gpp/memutils.h +++ /dev/null @@ -1,166 +0,0 @@ -/* - * moogpp/memutils.h - * - * Copyright (C) 2004-2016 by Yevgen Muntyan - * - * This file is part of medit. medit 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. - * - * You should have received a copy of the GNU Lesser General Public - * License along with medit. If not, see . - */ - -#pragma once - -#ifndef __cplusplus -#error "This is a C++ header" -#endif - -#include -#include -#include -#include - -#include - -void extern_g_free(gpointer); -void extern_g_object_unref(gpointer); -void extern_g_strfreev(char**); - -namespace g { - -enum class mem_transfer -{ - take_ownership, - borrow, - make_copy -}; - -template -class gbuf -{ -public: - explicit gbuf(T* p = nullptr) : m_p(p) {} - ~gbuf() { ::g_free(m_p); } - - void set_new(T* p) { if (m_p != p) { ::g_free(m_p); m_p = p; } } - operator const T*() const { return m_p; } - T* get() const { return m_p; } - T*& _get() { return m_p; } - T* operator->() const { return m_p; } - - operator T*() const = delete; - T** operator&() = delete; - - T* release() { T* p = m_p; m_p = nullptr; return p; } - - gbuf(const gbuf&) = delete; - gbuf& operator=(const gbuf&) = delete; - - gbuf(gbuf&& other) : gbuf() { std::swap(m_p, other.m_p); } - gbuf& operator=(gbuf&& other) { std::swap(m_p, other.m_p); return *this; } - - operator bool() const { return m_p != nullptr; } - bool operator !() const { return m_p == nullptr; } - -private: - T* m_p; -}; - -#define MOO_DEFINE_STANDARD_PTR_METHODS_INLINE(Self, Super) \ - Self() : Super() {} \ - Self(const nullptr_t&) : Super(nullptr) {} \ - Self(const Self& other) = delete; \ - Self(Self&& other) : Super(std::move(other)) {} \ - \ - Self& operator=(const Self& other) = delete; \ - \ - Self& operator=(Self&& other) \ - { \ - static_cast(*this) = std::move(static_cast(other)); \ - return *this; \ - } \ - \ - Self& operator=(const nullptr_t&) \ - { \ - static_cast(*this) = nullptr; \ - return *this; \ - } - -#define MOO_DECLARE_STANDARD_PTR_METHODS(Self, Super) \ - Self(); \ - Self(const nullptr_t&); \ - Self(const Self& other) = delete; \ - Self(Self&& other); \ - Self& operator=(const Self& other) = delete; \ - Self& operator=(Self&& other); \ - Self& operator=(const nullptr_t&); - -#define MOO_DEFINE_STANDARD_PTR_METHODS(Self, Super) \ - Self::Self() : Super() {} \ - Self::Self(const nullptr_t&) : Super(nullptr) {} \ - Self::Self(Self&& other) : Super(std::move(other)) {} \ - \ - Self& Self::operator=(Self&& other) \ - { \ - static_cast(*this) = std::move(static_cast(other)); \ - return *this; \ - } \ - \ - Self& Self::operator=(const nullptr_t&) \ - { \ - static_cast(*this) = nullptr; \ - return *this; \ - } - - -template -class objp -{ -public: - objp (T* p = nullptr) : m_p(p) {} - ~objp () { delete m_p; } - - template - static objp make (Args&&... args) - { - return objp (new T (std::forward (args)...)); - } - - objp (objp&& other) : objp () { *this = std::move (other); } - objp& operator=(objp&& other) { std::swap (m_p, other.m_p); return *this; } - - T* get() const { return m_p; } - T** pp () { g_return_val_if_fail (m_p == nullptr, nullptr); return &m_p; } - T* operator->() const { return m_p; } - operator const T*() const { return m_p; } - - operator T*() const = delete; - T** operator&() = delete; - - objp(const objp&) = delete; - objp& operator=(const objp&) = delete; - - void set (T* p) { if (m_p != p) { delete m_p; m_p = p; } } - void reset (T* p = nullptr) { set (p); } - T* release () { T* p = m_p; m_p = nullptr; return p; } - - bool operator==(const T* p) const { return m_p == p; } - bool operator!=(const T* p) const { return m_p != p; } - - operator bool () const { return m_p != nullptr; } - bool operator !() const { return m_p == nullptr; } - -private: - T* m_p; -}; - -} // namespace g - -template -void g_free(const g::gbuf&) = delete; -template -void g_free (const g::objp&) = delete; diff --git a/moo/gpp/moogpp.cmake b/moo/gpp/moogpp.cmake deleted file mode 100644 index 8bfa2dd1..00000000 --- a/moo/gpp/moogpp.cmake +++ /dev/null @@ -1,20 +0,0 @@ -SET(moogpp_sources - moogpp/moogpp.cmake - moogpp/gobjectutils.h - moogpp/gobj.h - moogpp/gobj.cpp - moogpp/gobjtypes-gio.h - moogpp/gobjtypes-gio.cpp - moogpp/gobjtypes-glib.h - moogpp/gobjtypes-glib.cpp - moogpp/gobjtypes-gtk.h - moogpp/gobjtypes-gtk.cpp - moogpp/gparam.h - moogpp/moogpp.h - moogpp/gutil.h - moogpp/gutil.cpp - moogpp/memutils.h - moogpp/strutils.h - moogpp/strutils.cpp - moogpp/utils.h -) diff --git a/moo/gpp/moogpp.h b/moo/gpp/moogpp.h deleted file mode 100644 index c2211bde..00000000 --- a/moo/gpp/moogpp.h +++ /dev/null @@ -1,32 +0,0 @@ -/* - * moogpp/moogpp.h - * - * Copyright (C) 2004-2016 by Yevgen Muntyan - * - * This file is part of medit. medit 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. - * - * You should have received a copy of the GNU Lesser General Public - * License along with medit. If not, see . - */ - -#pragma once - -#ifndef __cplusplus -#error "This is a C++ header" -#endif - -#include - -#include -#include -#include -#include -#include - -#include -#include -#include diff --git a/moo/gpp/old/gobjinfo.h b/moo/gpp/old/gobjinfo.h deleted file mode 100644 index 96720c1d..00000000 --- a/moo/gpp/old/gobjinfo.h +++ /dev/null @@ -1,134 +0,0 @@ -/* - * moocpp/gobjinfo.h - * - * Copyright (C) 2004-2016 by Yevgen Muntyan - * - * This file is part of medit. medit 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. - * - * You should have received a copy of the GNU Lesser General Public - * License along with medit. If not, see . - */ - -#pragma once - -#ifdef __cplusplus - -#include -#include -#include - -namespace moo { - -void init_gobj_system (); - -/////////////////////////////////////////////////////////////////////////////////////////// -// -// gobjinfo -// - -template -struct gobj_is_subclass -{ - static const bool value = false; -}; - -// Generic implementation, all we know it's a subclass of GObject; we don't -// even know its GType. This implementation is needed so that it's possible -// to have gobj_ptr without having to define gobjinfo for it. -template -struct gobjinfo -{ - static const bool is_gobject = true; - using object_type = Object; - using parent_type = GObject; - // object_g_type() is not defined -}; - -template<> -struct gobjinfo -{ - static const bool is_gobject = true; - using object_type = GObject; - static GType object_g_type() { return G_TYPE_OBJECT; } -}; - -template -inline GType get_g_type() -{ - return gobjinfo::object_g_type(); -} - -template<> -struct gobj_is_subclass -{ - static const bool value = true; - static GObject* down_cast(GObject* o) { return o; } -}; - -#define MOO_DEFINE_GOBJ_TYPE(Object, Parent, g_type) \ -namespace moo { \ - \ - template<> \ - struct gobjinfo \ - { \ - static const bool is_gobject = true; \ - using object_type = Object; \ - using parent_type = Parent; \ - static GType object_g_type() { return g_type; } \ - }; \ - \ - template<> \ - struct gobj_is_subclass \ - { \ - static const bool value = true; \ - static Object* down_cast(Object* o) { return o; } \ - }; \ - \ - template \ - struct gobj_is_subclass \ - { \ - static const bool value = true; \ - static Super* down_cast(Object *o) \ - { \ - static_assert(gobj_is_subclass::value, \ - "Super is not a superclass of " #Object); \ - Parent* p = reinterpret_cast(o); \ - Super* s = gobj_is_subclass::down_cast(p); \ - return s; \ - } \ - }; \ -} \ - -#define MOO_DEFINE_GIFACE_TYPE(Iface, g_type) \ - MOO_DEFINE_GOBJ_TYPE(Iface, GObject, g_type) - -#define MOO_GOBJ_IMPLEMENTS_IFACE(Object, Iface) \ -namespace moo { \ - \ - template<> \ - struct gobj_is_subclass \ - { \ - static const bool value = true; \ - static Iface* down_cast(Object *o) \ - { \ - return reinterpret_cast(o); \ - } \ - }; \ -} \ - - -#define MOO_DEFINE_NON_GOBJ_TYPE(Object) \ -namespace moo { \ - template<> struct gobjinfo { static const bool is_gobject = false; }; \ -} - -template -using gobj_parent_type = typename gobjinfo::parent_type; - -} // namespace moo - -#endif // __cplusplus diff --git a/moo/gpp/old/gobjptr.h b/moo/gpp/old/gobjptr.h deleted file mode 100644 index 5dd0f508..00000000 --- a/moo/gpp/old/gobjptr.h +++ /dev/null @@ -1,313 +0,0 @@ -/* - * moocpp/gobjptr.h - * - * Copyright (C) 2004-2016 by Yevgen Muntyan - * - * This file is part of medit. medit 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. - * - * You should have received a copy of the GNU Lesser General Public - * License along with medit. If not, see . - */ - -#pragma once - -#include "moocpp/gobjrawptr.h" -#include "moocpp/grefptr.h" -#include "moocpp/gobjectutils.h" - -namespace moo { - -/////////////////////////////////////////////////////////////////////////////////////////// -// -// gobj_ptr -// - -template -class gobj_ptr -{ - using ref_type = gobj_ref; - - static_assert(gobjinfo::is_gobject, "Not a GObject"); - -public: - gobj_ptr() {} - - gobj_ptr(Object* obj, ref_transfer policy) - { - assign(obj, policy); - } - - gobj_ptr(const nullptr_t&) - : gobj_ptr() - { - } - - static gobj_ptr wrap_new(Object* obj) - { - return gobj_ptr(obj, ref_transfer::take_ownership); - } - - static gobj_ptr wrap(Object* obj) - { - return gobj_ptr(obj, ref_transfer::make_copy); - } - - ~gobj_ptr() - { - reset(); - } - - void ref(Object* obj) - { - assign(obj, ref_transfer::make_copy); - } - - void set(Object* obj) - { - assign(obj, ref_transfer::make_copy); - } - - void set_new(Object* obj) - { - assign(obj, ref_transfer::take_ownership); - } - - Object* release() - { - auto* tmp = gobj(); - m_ref._set_gobj(nullptr); - return tmp; - } - - void reset() - { - auto* tmp = gobj(); - if (tmp) - { - m_ref._set_gobj(nullptr); - g_object_unref(tmp); - } - } - - // Implicit conversion to non-const Object* is dangerous because there is a lot - // of code still which frees/steals objects directly. For example: - // FooObject* tmp = x->s; - // x->s = NULL; - // g_object_unref (tmp); - operator const Object* () const { return gobj(); } - operator ref_type*() const { return m_ref.self(); } - ref_type* operator->() const { return m_ref.self(); } - ref_type& operator*() { return m_ref; } - const ref_type& operator*() const { return m_ref; } - - // These are nasty. Because of ref_type* conversion this can be converted to void*, - // which in turn can be passed to g_object_ref or g_free, etc. - operator void*() const = delete; - operator const void*() const = delete; - - Object* gobj() const { return m_ref.gobj(); } - Object** pp() { return m_ref._pp(); } - - template - Super* gobj() const - { - return gobj_is_subclass::down_cast(m_ref.gobj()); - } - - template - operator const Super* () const { return gobj(); } - - template - operator gobj_ptr () const { return gobj_ptr::wrap (gobj ()); } - - operator bool() const { return gobj() != nullptr; } - bool operator!() const { return gobj() == nullptr; } - - gobj_ptr(const gobj_ptr& other) - : gobj_ptr() - { - ref(other.gobj()); - } - - gobj_ptr& operator=(const gobj_ptr& other) - { - ref(other.gobj()); - return *this; - } - - gobj_ptr(gobj_ptr&& other) - : gobj_ptr() - { - m_ref._set_gobj(other.gobj()); - other.m_ref._set_gobj(nullptr); - } - - gobj_ptr& operator=(const nullptr_t&) - { - reset(); - return *this; - } - - gobj_ptr& operator=(gobj_ptr&& other) - { - if (gobj() != other.gobj()) - { - assign(other.gobj(), ref_transfer::take_ownership); - other.m_ref._set_gobj(nullptr); - } - - return *this; - } - -private: - void assign(Object* obj, ref_transfer policy) - { - g_assert(!obj || G_IS_OBJECT(obj)); - - if (gobj() != obj) - { - Object* tmp = gobj(); - m_ref._set_gobj(obj); - - if (obj) - { - if (policy == ref_transfer::make_copy) - g_object_ref(obj); - else if (g_object_is_floating(obj)) - g_object_ref_sink(obj); - } - - if (tmp) - g_object_unref(tmp); - } - } - -private: - mutable gobj_ref m_ref; -}; - -template -inline gobj_ptr wrap_new(Object *obj) -{ - return gobj_ptr::wrap_new(obj); -} - -template -inline gobj_ptr wrap(Object* obj) -{ - return gobj_ptr::wrap(obj); -} - -template -inline gobj_ptr wrap(const gobj_raw_ptr& obj) -{ - return gobj_ptr::wrap(obj); -} - -template -inline gobj_ref wrap (Object& obj) -{ - return *wrap (&obj); -} - -template -inline gobj_ptr create_gobj(GType obj_type, Args&& ...args) -{ - return wrap_new(reinterpret_cast(g_object_new(obj_type, std::forward(args)...))); -} - -template -inline gobj_ptr create_gobj(Args&& ...args) -{ - // object_g_type() will produce a compiler error if the type wasn't registered - return create_gobj(gobjinfo::object_g_type(), std::forward(args)...); -} - -template -inline gobj_ptr create_gobj() -{ - // object_g_type() will produce a compiler error if the type wasn't registered - return create_gobj(gobjinfo::object_g_type(), nullptr); -} - -template -Object* up_cast (Super* o) -{ - return G_TYPE_CHECK_INSTANCE_CAST ((o), gobjinfo::object_g_type(), Object); -} - -} // namespace moo - -template -void g_object_unref(const moo::gobj_ptr&) = delete; -template -void g_free(const moo::gobj_ptr&) = delete; - -template -inline bool operator==(const moo::gobj_ptr& p, const nullptr_t&) -{ - return p.gobj() == nullptr; -} - -template -inline bool operator==(const nullptr_t&, const moo::gobj_ptr& p) -{ - return p.gobj() == nullptr; -} - -template -inline bool operator==(const moo::gobj_ptr& p1, const moo::gobj_ptr& p2) -{ - return p1.gobj() == p2.gobj(); -} - -template -inline bool operator==(const moo::gobj_ptr& p1, const Y* p2) -{ - return p1.gobj() == p2; -} - -template -inline bool operator==(const X* p1, const moo::gobj_ptr& p2) -{ - return p1 == p2.gobj(); -} - -template -inline bool operator==(const moo::gobj_ptr& p1, const moo::gobj_raw_ptr& p2) -{ - return p1.gobj() == p2.gobj(); -} - -template -inline bool operator==(const moo::gobj_raw_ptr& p1, const moo::gobj_ptr& p2) -{ - return p1.gobj() == p2.gobj(); -} - -template -bool operator!=(const moo::gobj_ptr& p1, const moo::gobj_ptr& p2) -{ - return !(p1 == p2); -} - -template -bool operator!=(const moo::gobj_ptr& p1, const Y& p2) -{ - return !(p1 == p2); -} - -template -bool operator!=(const X& p1, const moo::gobj_ptr& p2) -{ - return !(p1 == p2); -} - -template bool operator==(const moo::gobj_ptr& p1, int) = delete; -template bool operator==(int, const moo::gobj_ptr& p2) = delete; -template bool operator!=(const moo::gobj_ptr& p1, int) = delete; -template bool operator!=(int, const moo::gobj_ptr& p2) = delete; diff --git a/moo/gpp/old/gobjrawptr.h b/moo/gpp/old/gobjrawptr.h deleted file mode 100644 index 7fb674a4..00000000 --- a/moo/gpp/old/gobjrawptr.h +++ /dev/null @@ -1,147 +0,0 @@ -/* - * moocpp/gobjrawptr.h - * - * Copyright (C) 2004-2016 by Yevgen Muntyan - * - * This file is part of medit. medit 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. - * - * You should have received a copy of the GNU Lesser General Public - * License along with medit. If not, see . - */ - -#pragma once - -#include "moocpp/gobjref.h" - -namespace moo { - -/////////////////////////////////////////////////////////////////////////////////////////// -// -// gobj_raw_ptr -// - -template -class gobj_raw_ptr -{ - using ref_type = gobj_ref; - -public: - gobj_raw_ptr(Object* obj = nullptr) { m_ref._set_gobj(obj); } - - operator Object*() const { return gobj(); } - operator GTypeInstance*() const { return reinterpret_cast(gobj()); } - operator gpointer() const { return gobj(); } - operator gobj_ref*() const { return m_ref.self(); } - - ref_type* operator->() const { return m_ref.self(); } - ref_type& operator*() const { return m_ref; } - - Object* gobj() const { return m_ref.gobj(); } - void set(Object* p) { m_ref._set_gobj(p); } - - template - Super* gobj() const - { - return gobj_is_subclass::down_cast(m_ref.gobj()); - } - - template - void set(Subclass* p) - { - set(gobj_is_subclass::down_cast(p)); - } - - operator bool() const { return gobj() != nullptr; } - bool operator!() const { return gobj() == nullptr; } - - gobj_raw_ptr(const gobj_raw_ptr& other) = default; - gobj_raw_ptr& operator=(const gobj_raw_ptr& other) = default; - - gobj_raw_ptr(gobj_raw_ptr&& other) - : m_ref(std::move(other.m_ref)) - { - other.set(nullptr); - } - - gobj_raw_ptr& operator=(gobj_raw_ptr&& other) - { - m_ref = std::move(other.m_ref); - return *this; - } - - template - gobj_raw_ptr& operator=(T* p) - { - set(p); - return *this; - } - -private: - mutable gobj_ref m_ref; -}; - -} // namespace moo - -template -inline bool operator==(const moo::gobj_raw_ptr& p, const nullptr_t&) -{ - return p.gobj() == nullptr; -} - -template -inline bool operator==(const nullptr_t&, const moo::gobj_raw_ptr& p) -{ - return p.gobj() == nullptr; -} - -template -inline bool operator==(const moo::gobj_raw_ptr& p1, const moo::gobj_raw_ptr& p2) -{ - return p1.gobj() == p2.gobj(); -} - -template -inline bool operator==(const moo::gobj_raw_ptr& p1, const X* p2) -{ - return p1.gobj() == p2; -} - -template -inline bool operator==(const moo::gobj_raw_ptr& p1, X* p2) -{ - return p1.gobj() == p2; -} - -template -inline bool operator==(const X* p1, const moo::gobj_raw_ptr& p2) -{ - return p1 == p2.gobj(); -} - -template -inline bool operator==(X* p1, const moo::gobj_raw_ptr& p2) -{ - return p1 == p2.gobj(); -} - -template -bool operator!=(const moo::gobj_raw_ptr& p1, const moo::gobj_raw_ptr& p2) -{ - return !(p1 == p2); -} - -template -bool operator!=(const moo::gobj_raw_ptr& p1, const Y& p2) -{ - return !(p1 == p2); -} - -template -bool operator!=(const X& p1, const moo::gobj_raw_ptr& p2) -{ - return !(p1 == p2); -} diff --git a/moo/gpp/old/gobjref.h b/moo/gpp/old/gobjref.h deleted file mode 100644 index af9ccbc9..00000000 --- a/moo/gpp/old/gobjref.h +++ /dev/null @@ -1,174 +0,0 @@ -/* - * moocpp/gobjref.h - * - * Copyright (C) 2004-2016 by Yevgen Muntyan - * - * This file is part of medit. medit 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. - * - * You should have received a copy of the GNU Lesser General Public - * License along with medit. If not, see . - */ - -#pragma once - -#include "moocpp/gobjinfo.h" - -namespace moo { - -template -class gobj_ref; -template -class gobj_ptr; -template -class gobj_raw_ptr; -template -class gobj_wrapper; - -/////////////////////////////////////////////////////////////////////////////////////////// -// -// gobj_ref -// - -class gobj_ref_base -{ -protected: - gobj_ref_base() : m_gobj(nullptr) {} - using object_type = GObject; - -public: - gobj_ref_base(const gobj_ref_base&) = default; - gobj_ref_base& operator=(const gobj_ref_base&) = default; - - gobj_ref_base(gobj_ref_base&& other) - : m_gobj(other.m_gobj) - { - other.m_gobj = nullptr; - } - - gobj_ref_base& operator=(gobj_ref_base&& other) - { - m_gobj = other.m_gobj; - other.m_gobj = nullptr; - return *this; - } - - GObject* gobj() const { return m_gobj; } - operator GObject&() const { return *m_gobj; } - operator GTypeInstance&() const { return *reinterpret_cast(m_gobj); } - -protected: - GObject* raw_gobj() const { return const_cast(m_gobj); } - - void** _pp () - { - g_return_val_if_fail(m_gobj == nullptr, nullptr); - return reinterpret_cast(&m_gobj); - } - -private: - template friend class gobj_ptr; - template friend class gobj_raw_ptr; - template friend class gobj_ref; - template friend class gobj_wrapper; - - void _set_gobj(gpointer gobj) { m_gobj = reinterpret_cast(gobj); } - -private: - GObject* m_gobj; -}; - -template<> -class gobj_ref; // : public gobj_ref_base - -#define MOO_DEFINE_GOBJREF_METHODS_IMPL(Object, Super) \ - using super = Super; \ - using object_type = Object; \ - using ptrtype = gobj_ptr; \ - \ -protected: \ - friend class gobj_ptr; \ - friend class gobj_raw_ptr; \ - \ - gobj_ref() {} \ - \ - object_type** _pp () \ - { \ - return reinterpret_cast(gobj_ref_base::_pp()); \ - } \ - \ -public: \ - gobj_ref(object_type& gobj) \ - { \ - super::_set_gobj(&gobj); \ - } \ - \ - object_type* gobj() const \ - { \ - return reinterpret_cast(super::raw_gobj()); \ - } \ - \ - template \ - X* gobj() const \ - { \ - return nc_gobj(); \ - } \ - \ - object_type* nc_gobj() const \ - { \ - return const_cast(gobj()); \ - } \ - \ - template \ - X* nc_gobj() const \ - { \ - object_type* o = const_cast(gobj()); \ - return gobj_is_subclass::down_cast(o); \ - } \ - \ - gobj_ref* self() { return this; } \ - const gobj_ref* self() const { return this; } \ - \ - operator object_type&() const { return *gobj(); } \ - gobj_raw_ptr operator&() const { return nc_gobj(); } \ - \ - gobj_ref(const gobj_ref&) = default; \ - gobj_ref& operator=(const gobj_ref&) = default; \ - \ - gobj_ref(gobj_ref&& other) \ - : super(std::move(static_cast(other))) \ - { \ - } \ - \ - gobj_ref& operator=(gobj_ref&& other) \ - { \ - super::operator=(std::move(static_cast(other))); \ - return *this; \ - } - -#define MOO_DEFINE_GOBJREF_METHODS(Object) \ - MOO_DEFINE_GOBJREF_METHODS_IMPL(Object, gobj_ref>) - - -template -using gobj_ref_parent = gobj_ref>; - -// Generic implementation, falls back to the parent type's gobj_ref implementation -// if that's known, or to GObject's one, coming from the generic gobjinfo. -template -class gobj_ref : public virtual gobj_ref_parent -{ -public: - MOO_DEFINE_GOBJREF_METHODS(Object) -}; - -} // namespace moo - -// Make sure these aren't called in code ported from pure glib C -template -void g_object_unref(const moo::gobj_ref*) = delete; -template -void g_free(const moo::gobj_ref*) = delete; diff --git a/moo/gpp/old/gobjtypes-gio.cpp b/moo/gpp/old/gobjtypes-gio.cpp deleted file mode 100644 index aab582d6..00000000 --- a/moo/gpp/old/gobjtypes-gio.cpp +++ /dev/null @@ -1,330 +0,0 @@ -/* - * moocpp/gobjtypes-gio.cpp - * - * Copyright (C) 2004-2016 by Yevgen Muntyan - * - * This file is part of medit. medit 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. - * - * You should have received a copy of the GNU Lesser General Public - * License along with medit. If not, see . - */ - -#include "moocpp/moocpp.h" - -using namespace moo; -using namespace moo::g; - -////////////////////////////////////////////////////////////////////////////////////////////////////////// -// -// GFile -// - -FilePtr File::new_for_path(const char* path) -{ - return wrap_new(g_file_new_for_path(path)); -} - -FilePtr File::new_for_uri(const char* uri) -{ - return wrap_new(g_file_new_for_uri(uri)); -} - -FilePtr File::new_for_commandline_arg(const char* arg) -{ - return wrap_new(g_file_new_for_commandline_arg(arg)); -} - -FilePtr File::parse_name(const char* parse_name) -{ - return wrap_new(g_file_parse_name(parse_name)); -} - -FilePtr File::dup() -{ - return FilePtr::wrap_new(g_file_dup(nc_gobj())); -} - -bool File::equal(File file2) -{ - return g_file_equal(nc_gobj(), file2.gobj()); -} - -gstr File::get_basename() -{ - return gstr::wrap_new(g_file_get_basename(nc_gobj())); -} - -gstr File::get_path() -{ - return gstr::wrap_new(g_file_get_path(nc_gobj())); -} - -gstr File::get_uri() -{ - return gstr::wrap_new(g_file_get_uri(nc_gobj())); -} - -gstr File::get_parse_name() -{ - return gstr::wrap_new(g_file_get_parse_name(nc_gobj())); -} - -FilePtr File::get_parent() -{ - return FilePtr::wrap_new(g_file_get_parent(nc_gobj())); -} - -bool File::has_parent(File parent) -{ - return g_file_has_parent(nc_gobj(), parent.gobj()); -} - -FilePtr File::get_child(const char* name) -{ - return FilePtr::wrap_new(g_file_get_child(nc_gobj(), name)); -} - -FilePtr File::get_child_for_display_name(const char* display_name, gerrp& error) -{ - return FilePtr::wrap_new(g_file_get_child_for_display_name(nc_gobj(), display_name, &error)); -} - -bool File::has_prefix(File prefix) -{ - return g_file_has_prefix(nc_gobj(), prefix.gobj()); -} - -gstr File::get_relative_path(File descendant) -{ - return gstr::wrap_new(g_file_get_relative_path(nc_gobj(), descendant.gobj())); -} - -FilePtr File::resolve_relative_path(const char *relative_path) -{ - return FilePtr::wrap_new(g_file_resolve_relative_path(nc_gobj(), relative_path)); -} - -bool File::is_native() -{ - return g_file_is_native(nc_gobj()); -} - -bool File::has_uri_scheme(const char *uri_scheme) -{ - return g_file_has_uri_scheme(nc_gobj(), uri_scheme); -} - -gstr File::get_uri_scheme() -{ - return gstr::wrap_new(g_file_get_uri_scheme(nc_gobj())); -} - -g::FileInputStreamPtr File::read(GCancellable* cancellable, gerrp& error) -{ - return wrap_new (g_file_read(gobj(), cancellable, &error)); -} - -g::FileOutputStreamPtr File::append_to(GFileCreateFlags flags, GCancellable* cancellable, gerrp& error) -{ - return wrap_new (g_file_append_to(gobj(), flags, cancellable, &error)); -} - -g::FileOutputStreamPtr File::create(GFileCreateFlags flags, GCancellable* cancellable, gerrp& error) -{ - return wrap_new (g_file_create(gobj(), flags, cancellable, &error)); -} - -g::FileOutputStreamPtr File::replace(const char* etag, gboolean make_backup, GFileCreateFlags flags, GCancellable* cancellable, gerrp& error) -{ - return wrap_new (g_file_replace(gobj(), etag, make_backup, flags, cancellable, &error)); -} - -g::FileIOStreamPtr File::open_readwrite(GCancellable* cancellable, gerrp& error) -{ - return wrap_new (g_file_open_readwrite(gobj(), cancellable, &error)); -} - -g::FileIOStreamPtr File::create_readwrite(GFileCreateFlags flags, GCancellable* cancellable, gerrp& error) -{ - return wrap_new (g_file_create_readwrite(gobj(), flags, cancellable, &error)); -} - -g::FileIOStreamPtr File::replace_readwrite(const char* etag, gboolean make_backup, GFileCreateFlags flags, GCancellable* cancellable, gerrp& error) -{ - return wrap_new (g_file_replace_readwrite(gobj(), etag, make_backup, flags, cancellable, &error)); -} - -bool File::query_exists(GCancellable* cancellable) -{ - return g_file_query_exists(nc_gobj(), cancellable); -} - -GFileType File::query_file_type(GFileQueryInfoFlags flags, GCancellable* cancellable) -{ - return g_file_query_file_type(nc_gobj(), flags, cancellable); -} - -FileInfoPtr File::query_info(const char *attributes, GFileQueryInfoFlags flags, GCancellable* cancellable, gerrp& error) -{ - return wrap_new(g_file_query_info(nc_gobj(), attributes, flags, cancellable, &error)); -} - -FileInfoPtr File::query_filesystem_info(const char *attributes, GCancellable* cancellable, gerrp& error) -{ - return wrap_new(g_file_query_filesystem_info(nc_gobj(), attributes, cancellable, &error)); -} - -GFileEnumerator* File::enumerate_children(const char *attributes, GFileQueryInfoFlags flags, GCancellable* cancellable, gerrp& error) -{ - return g_file_enumerate_children(nc_gobj(), attributes, flags, cancellable, &error); -} - -FilePtr File::set_display_name(const char* display_name, GCancellable* cancellable, gerrp& error) -{ - return FilePtr::wrap_new(g_file_set_display_name(nc_gobj(), display_name, cancellable, &error)); -} - -bool File::delete_(GCancellable* cancellable, gerrp& error) -{ - return g_file_delete(nc_gobj(), cancellable, &error); -} - -bool File::trash(GCancellable* cancellable, gerrp& error) -{ - return g_file_trash(nc_gobj(), cancellable, &error); -} - -bool File::copy(File destination, GFileCopyFlags flags, GCancellable* cancellable, GFileProgressCallback progress_callback, gpointer progress_callback_data, gerrp& error) -{ - return g_file_copy(nc_gobj(), destination.gobj(), flags, cancellable, progress_callback, progress_callback_data, &error); -} - -bool File::move(File destination, GFileCopyFlags flags, GCancellable* cancellable, GFileProgressCallback progress_callback, gpointer progress_callback_data, gerrp& error) -{ - return g_file_move(nc_gobj(), destination.gobj(), flags, cancellable, progress_callback, progress_callback_data, &error); -} - -bool File::make_directory(GCancellable* cancellable, gerrp& error) -{ - return g_file_make_directory(nc_gobj(), cancellable, &error); -} - -bool File::make_directory_with_parents(GCancellable* cancellable, gerrp& error) -{ - return g_file_make_directory_with_parents(nc_gobj(), cancellable, &error); -} - -bool File::make_symbolic_link(const char *symlink_value, GCancellable* cancellable, gerrp& error) -{ - return g_file_make_symbolic_link(nc_gobj(), symlink_value, cancellable, &error); -} - -bool File::load_contents(GCancellable* cancellable, char** contents, gsize* length, char** etag_out, gerrp& error) -{ - return g_file_load_contents(nc_gobj(), cancellable, contents, length, etag_out, &error); -} - -bool File::replace_contents(const char* contents, gsize length, const char* etag, gboolean make_backup, GFileCreateFlags flags, char** new_etag, GCancellable* cancellable, gerrp& error) -{ - return g_file_replace_contents(nc_gobj(), contents, length, etag, make_backup, flags, new_etag, cancellable, &error); -} - - -////////////////////////////////////////////////////////////////////////////////////////////////////////// -// -// GOutputStream -// - -gssize OutputStream::write(const void* buffer, gsize count, GCancellable* cancellable, gerrp& error) -{ - return g_output_stream_write(gobj(), buffer, count, cancellable, &error); -} - -bool OutputStream::write_all(const void* buffer, gsize count, gsize* bytes_written, GCancellable* cancellable, gerrp& error) -{ - return g_output_stream_write_all(gobj(), buffer, count, bytes_written, cancellable, &error); -} - -gssize OutputStream::splice(g::InputStream source, GOutputStreamSpliceFlags flags, GCancellable* cancellable, gerrp& error) -{ - return g_output_stream_splice(gobj(), source.gobj(), flags, cancellable, &error); -} - -bool OutputStream::flush(GCancellable* cancellable, gerrp& error) -{ - return g_output_stream_flush(gobj(), cancellable, &error); -} - -bool OutputStream::close(GCancellable* cancellable, gerrp& error) -{ - return g_output_stream_close(gobj(), cancellable, &error); -} - -void OutputStream::write_async(const void* buffer, gsize count, int io_priority, GCancellable* cancellable, GAsyncReadyCallback callback, gpointer user_data) -{ - g_output_stream_write_async(gobj(), buffer, count, io_priority, cancellable, callback, user_data); -} - -gssize OutputStream::write_finish(GAsyncResult* result, gerrp& error) -{ - return g_output_stream_write_finish(gobj(), result, &error); -} - -void OutputStream::splice_async(g::InputStream source, GOutputStreamSpliceFlags flags, int io_priority, GCancellable* cancellable, GAsyncReadyCallback callback, gpointer user_data) -{ - g_output_stream_splice_async(gobj(), source.gobj(), flags, io_priority, cancellable, callback, user_data); -} - -gssize OutputStream::splice_finish(GAsyncResult* result, gerrp& error) -{ - return g_output_stream_splice_finish(gobj(), result, &error); -} - -void OutputStream::flush_async(int io_priority, GCancellable* cancellable, GAsyncReadyCallback callback, gpointer user_data) -{ - g_output_stream_flush_async(gobj(), io_priority, cancellable, callback, user_data); -} - -bool OutputStream::flush_finish(GAsyncResult* result, gerrp& error) -{ - return g_output_stream_flush_finish(gobj(), result, &error); -} - -void OutputStream::close_async(int io_priority, GCancellable* cancellable, GAsyncReadyCallback callback, gpointer user_data) -{ - g_output_stream_close_async(gobj(), io_priority, cancellable, callback, user_data); -} - -bool OutputStream::close_finish(GAsyncResult* result, gerrp& error) -{ - return g_output_stream_close_finish(gobj(), result, &error); -} - -bool OutputStream::is_closed() -{ - return g_output_stream_is_closed(gobj()); -} - -bool OutputStream::is_closing() -{ - return g_output_stream_is_closing(gobj()); -} - -bool OutputStream::has_pending() -{ - return g_output_stream_has_pending(gobj()); -} - -bool OutputStream::set_pending(gerrp& error) -{ - return g_output_stream_set_pending(gobj(), &error); -} - -void OutputStream::clear_pending() -{ - g_output_stream_clear_pending(gobj()); -} diff --git a/moo/gpp/old/gobjtypes-gio.h b/moo/gpp/old/gobjtypes-gio.h deleted file mode 100644 index c6ac6bad..00000000 --- a/moo/gpp/old/gobjtypes-gio.h +++ /dev/null @@ -1,225 +0,0 @@ -/* - * moocpp/gobjtypes-gio.h - * - * Copyright (C) 2004-2016 by Yevgen Muntyan - * - * This file is part of medit. medit 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. - * - * You should have received a copy of the GNU Lesser General Public - * License along with medit. If not, see . - */ - -#pragma once - -#include -#include - -#ifdef __cplusplus - -#include "moocpp/gobjtypes-glib.h" -#include "moocpp/strutils.h" - -MOO_DEFINE_GOBJ_TYPE(GFile, GObject, G_TYPE_FILE) -MOO_DEFINE_GOBJ_TYPE(GFileInfo, GObject, G_TYPE_FILE_INFO) - -MOO_DEFINE_GOBJ_TYPE(GOutputStream, GObject, G_TYPE_OUTPUT_STREAM) -MOO_DEFINE_GOBJ_TYPE(GFileOutputStream, GOutputStream, G_TYPE_FILE_OUTPUT_STREAM) -MOO_DEFINE_GOBJ_TYPE(GInputStream, GObject, G_TYPE_INPUT_STREAM) -MOO_DEFINE_GOBJ_TYPE(GFileInputStream, GInputStream, G_TYPE_FILE_INPUT_STREAM) -MOO_DEFINE_GOBJ_TYPE(GIOStream, GObject, G_TYPE_IO_STREAM) -MOO_DEFINE_GOBJ_TYPE(GFileIOStream, GIOStream, G_TYPE_FILE_IO_STREAM) - -MOO_DECLARE_CUSTOM_GOBJ_TYPE(GFile) -MOO_DECLARE_CUSTOM_GOBJ_TYPE(GOutputStream) - -namespace moo { - -namespace g { - -MOO_GOBJ_TYPEDEFS(File, GFile); -MOO_GOBJ_TYPEDEFS(FileInfo, GFileInfo); -MOO_GOBJ_TYPEDEFS(OutputStream, GOutputStream); -MOO_GOBJ_TYPEDEFS(FileOutputStream, GFileOutputStream); -MOO_GOBJ_TYPEDEFS(InputStream, GInputStream); -MOO_GOBJ_TYPEDEFS(FileInputStream, GFileInputStream); -MOO_GOBJ_TYPEDEFS(IOStream, GIOStream); -MOO_GOBJ_TYPEDEFS(FileIOStream, GFileIOStream); - -} // namespace g - -template<> -class gobj_ref : public virtual gobj_ref_parent -{ -public: - MOO_DEFINE_GOBJREF_METHODS(GFile) - - static g::FilePtr new_for_path (const char* path); - static g::FilePtr new_for_uri (const char* uri); - static g::FilePtr new_for_commandline_arg (const char* arg); - static g::FilePtr parse_name (const char* parse_name); - - g::FilePtr dup (); - - bool equal (g::File file2); - gstr get_basename (); - gstr get_path (); - gstr get_uri (); - gstr get_parse_name (); - g::FilePtr get_parent (); - bool has_parent (g::File parent); - g::FilePtr get_child (const char* name); - g::FilePtr get_child_for_display_name (const char* display_name, - gerrp& error); - bool has_prefix (g::File prefix); - gstr get_relative_path (g::File descendant); - g::FilePtr resolve_relative_path (const char *relative_path); - bool is_native (); - bool has_uri_scheme (const char *uri_scheme); - gstr get_uri_scheme (); - g::FileInputStreamPtr read (GCancellable* cancellable, - gerrp& error); - g::FileOutputStreamPtr append_to (GFileCreateFlags flags, - GCancellable* cancellable, - gerrp& error); - g::FileOutputStreamPtr create (GFileCreateFlags flags, - GCancellable* cancellable, - gerrp& error); - g::FileOutputStreamPtr replace (const char *etag, - gboolean make_backup, - GFileCreateFlags flags, - GCancellable* cancellable, - gerrp& error); - g::FileIOStreamPtr open_readwrite (GCancellable* cancellable, - gerrp& error); - g::FileIOStreamPtr create_readwrite (GFileCreateFlags flags, - GCancellable* cancellable, - gerrp& error); - g::FileIOStreamPtr replace_readwrite (const char *etag, - gboolean make_backup, - GFileCreateFlags flags, - GCancellable* cancellable, - gerrp& error); - bool query_exists (GCancellable* cancellable); - GFileType query_file_type (GFileQueryInfoFlags flags, - GCancellable* cancellable); - g::FileInfoPtr query_info (const char *attributes, - GFileQueryInfoFlags flags, - GCancellable* cancellable, - gerrp& error); - g::FileInfoPtr query_filesystem_info (const char *attributes, - GCancellable* cancellable, - gerrp& error); - GFileEnumerator* enumerate_children (const char *attributes, - GFileQueryInfoFlags flags, - GCancellable* cancellable, - gerrp& error); - g::FilePtr set_display_name (const char* display_name, - GCancellable* cancellable, - gerrp& error); - bool delete_ (GCancellable* cancellable, - gerrp& error); - bool trash (GCancellable* cancellable, - gerrp& error); - bool copy (g::File destination, - GFileCopyFlags flags, - GCancellable* cancellable, - GFileProgressCallback progress_callback, - gpointer progress_callback_data, - gerrp& error); - bool move (g::File destination, - GFileCopyFlags flags, - GCancellable* cancellable, - GFileProgressCallback progress_callback, - gpointer progress_callback_data, - gerrp& error); - bool make_directory (GCancellable* cancellable, - gerrp& error); - bool make_directory_with_parents (GCancellable* cancellable, - gerrp& error); - bool make_symbolic_link (const char *symlink_value, - GCancellable* cancellable, - gerrp& error); - - bool load_contents (GCancellable* cancellable, - char** contents, - gsize* length, - char** etag_out, - gerrp& error); - bool replace_contents (const char* contents, - gsize length, - const char* etag, - gboolean make_backup, - GFileCreateFlags flags, - char** new_etag, - GCancellable* cancellable, - gerrp& error); -}; - - -template<> -class gobj_ref : public virtual gobj_ref_parent -{ -public: - MOO_DEFINE_GOBJREF_METHODS(GOutputStream) - - gssize write (const void *buffer, - gsize count, - GCancellable *cancellable, - gerrp& error); - bool write_all (const void *buffer, - gsize count, - gsize *bytes_written, - GCancellable *cancellable, - gerrp& error); - gssize splice (g::InputStream source, - GOutputStreamSpliceFlags flags, - GCancellable *cancellable, - gerrp& error); - bool flush (GCancellable *cancellable, - gerrp& error); - bool close (GCancellable *cancellable, - gerrp& error); - void write_async (const void *buffer, - gsize count, - int io_priority, - GCancellable *cancellable, - GAsyncReadyCallback callback, - gpointer user_data); - gssize write_finish (GAsyncResult *result, - gerrp& error); - void splice_async (g::InputStream source, - GOutputStreamSpliceFlags flags, - int io_priority, - GCancellable *cancellable, - GAsyncReadyCallback callback, - gpointer user_data); - gssize splice_finish (GAsyncResult *result, - gerrp& error); - void flush_async (int io_priority, - GCancellable *cancellable, - GAsyncReadyCallback callback, - gpointer user_data); - bool flush_finish (GAsyncResult *result, - gerrp& error); - void close_async (int io_priority, - GCancellable *cancellable, - GAsyncReadyCallback callback, - gpointer user_data); - bool close_finish (GAsyncResult *result, - gerrp& error); - - bool is_closed (); - bool is_closing (); - bool has_pending (); - bool set_pending (gerrp& error); - void clear_pending (); -}; - - -} // namespace moo - -#endif // __cplusplus diff --git a/moo/gpp/old/gobjtypes-glib.cpp b/moo/gpp/old/gobjtypes-glib.cpp deleted file mode 100644 index b94952e8..00000000 --- a/moo/gpp/old/gobjtypes-glib.cpp +++ /dev/null @@ -1,194 +0,0 @@ -/* - * moocpp/gobjtypes-glib.cpp - * - * Copyright (C) 2004-2016 by Yevgen Muntyan - * - * This file is part of medit. medit 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. - * - * You should have received a copy of the GNU Lesser General Public - * License along with medit. If not, see . - */ - -#include "moocpp/moocpp.h" - -using namespace moo; -using namespace g; - -void extern_g_free(gpointer p) -{ - g_free(p); -} - -void extern_g_object_unref(gpointer o) -{ - g_object_unref(o); -} - -void extern_g_strfreev(char** p) -{ - if (p) - g_strfreev (p); -} - - -void moo::init_gobj_system () -{ -} - - -GQuark gobj_wrapper_base::qdata_key = g_quark_from_static_string ("__moo_gobj_wrapper__"); - -gobj_wrapper_base& gobj_wrapper_base::get(Object g) -{ - void* o = g.get_data(qdata_key); - g_assert(o != nullptr); - return *reinterpret_cast(o); -} - -gobj_wrapper_base::gobj_wrapper_base(gobj_ref g) -{ - g.set_data(qdata_key, this, free_qdata); -} - -gobj_wrapper_base::~gobj_wrapper_base() -{ -} - -void gobj_wrapper_base::free_qdata(gpointer d) -{ - gobj_wrapper_base* self = reinterpret_cast(d); - delete self; -} - - -gulong Object::connect(const char *detailed_signal, GCallback c_handler, void *data) -{ - return g_signal_connect(gobj(), detailed_signal, c_handler, data); -} - -gulong Object::connect_swapped(const char *detailed_signal, GCallback c_handler, void *data) -{ - return g_signal_connect_swapped(gobj(), detailed_signal, c_handler, data); -} - -void Object::signal_emit_by_name(const char* detailed_signal, ...) -{ - guint signal_id; - GQuark detail; - g_return_if_fail(g_signal_parse_name(detailed_signal, - G_OBJECT_TYPE(gobj()), - &signal_id, &detail, - true)); - - va_list args; - va_start(args, detailed_signal); - g_signal_emit_valist(gobj(), signal_id, detail, args); - va_end(args); -} - -void Object::signal_emit(guint signal_id, GQuark detail, ...) -{ - va_list args; - va_start(args, detail); - g_signal_emit_valist(gobj(), signal_id, detail, args); - va_end(args); -} - -bool Object::signal_has_handler_pending(guint signal_id, GQuark detail, bool may_be_blocked) -{ - return g_signal_has_handler_pending(gobj(), signal_id, detail, may_be_blocked); -} - -gulong Object::signal_connect_closure_by_id(guint signal_id, GQuark detail, GClosure* closure, bool after) -{ - return g_signal_connect_closure_by_id(gobj(), signal_id, detail, closure, after); -} - -gulong Object::signal_connect_closure(const char* detailed_signal, GClosure* closure, bool after) -{ - return g_signal_connect_closure(gobj(), detailed_signal, closure, after); -} - -gulong Object::signal_connect_data(const char* detailed_signal, GCallback c_handler, gpointer data, GClosureNotify destroy_data, GConnectFlags connect_flags) -{ - return g_signal_connect_data(gobj(), detailed_signal, c_handler, data, destroy_data, connect_flags); -} - -void Object::signal_handler_block(gulong handler_id) -{ - g_signal_handler_block(gobj(), handler_id); -} - -void Object::signal_handler_unblock(gulong handler_id) -{ - g_signal_handler_unblock(gobj(), handler_id); -} - -void Object::signal_handler_disconnect(gulong handler_id) -{ - g_signal_handler_disconnect(gobj(), handler_id); -} - -gulong Object::signal_handler_find(GSignalMatchType mask, guint signal_id, GQuark detail, GClosure* closure, gpointer func, gpointer data) -{ - return g_signal_handler_find(gobj(), mask, signal_id, detail, closure, func, data); -} - -guint Object::signal_handlers_block_matched(GSignalMatchType mask, guint signal_id, GQuark detail, GClosure* closure, gpointer func, gpointer data) -{ - return g_signal_handlers_block_matched(gobj(), mask, signal_id, detail, closure, func, data); -} - -guint Object::signal_handlers_unblock_matched(GSignalMatchType mask, guint signal_id, GQuark detail, GClosure* closure, gpointer func, gpointer data) -{ - return g_signal_handlers_unblock_matched(gobj(), mask, signal_id, detail, closure, func, data); -} - -guint Object::signal_handlers_disconnect_matched(GSignalMatchType mask, guint signal_id, GQuark detail, GClosure* closure, gpointer func, gpointer data) -{ - return g_signal_handlers_disconnect_matched(gobj(), mask, signal_id, detail, closure, func, data); -} - -void Object::set_data(const char* key, gpointer value, GDestroyNotify destroy) -{ - g_object_set_data_full(gobj(), key, value, destroy); -} - -void Object::set_data(GQuark q, gpointer data, GDestroyNotify destroy) -{ - g_object_set_qdata_full(gobj(), q, data, destroy); -} - -void* Object::get_data(const char* key) -{ - return g_object_get_data(gobj(), key); -} - -void* Object::get_data(GQuark q) -{ - return g_object_get_qdata(gobj(), q); -} - -void Object::set_property(const gchar *property_name, const GValue *value) -{ - g_object_set_property(gobj(), property_name, value); -} - -void Object::notify(const char* property_name) -{ - g_object_notify(gobj(), property_name); -} - -void Object::freeze_notify() -{ - g_object_freeze_notify(gobj()); -} - -void Object::thaw_notify() -{ - g_object_thaw_notify(gobj()); -} diff --git a/moo/gpp/old/gobjtypes-glib.h b/moo/gpp/old/gobjtypes-glib.h deleted file mode 100644 index ac54b307..00000000 --- a/moo/gpp/old/gobjtypes-glib.h +++ /dev/null @@ -1,134 +0,0 @@ -/* - * moocpp/gobjtypes-glib.h - * - * Copyright (C) 2004-2016 by Yevgen Muntyan - * - * This file is part of medit. medit 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. - * - * You should have received a copy of the GNU Lesser General Public - * License along with medit. If not, see . - */ - -#pragma once - -#include -#include - -#ifdef __cplusplus - -#include "moocpp/gobjptr.h" -#include "moocpp/gobjectutils.h" - -#include - -#define MOO_GOBJ_TYPEDEFS(CppObject, CObject) \ - using CppObject = ::moo::gobj_ref; \ - using CppObject##Ptr = ::moo::gobj_ptr; \ - using CppObject##RawPtr = ::moo::gobj_raw_ptr; \ - -#define MOO_GIFACE_TYPEDEFS(CppObject, CObject) \ - MOO_GOBJ_TYPEDEFS(CppObject, CObject) - -#define MOO_DECLARE_CUSTOM_GOBJ_TYPE(CObject) \ -namespace moo { \ -template<> class gobj_ref; \ -} - -MOO_DEFINE_FLAGS(GSignalFlags); -MOO_DEFINE_FLAGS(GConnectFlags); -MOO_DEFINE_FLAGS(GSpawnFlags); -MOO_DEFINE_FLAGS(GLogLevelFlags); -MOO_DEFINE_FLAGS(GRegexCompileFlags); -MOO_DEFINE_FLAGS(GIOCondition); - -namespace moo { - -/////////////////////////////////////////////////////////////////////////////////////////// -// -// GObject -// - -template<> -class gobj_ref : public gobj_ref_base -{ -public: - MOO_DEFINE_GOBJREF_METHODS_IMPL(GObject, gobj_ref_base) - - gulong connect (const char* detailed_signal, GCallback c_handler, void* data); - gulong connect_swapped (const char* detailed_signal, GCallback c_handler, void* data); - - void signal_emit_by_name (const char* detailed_signal, ...); - void signal_emit (guint signal_id, GQuark detail, ...); - - bool signal_has_handler_pending (guint signal_id, GQuark detail, bool may_be_blocked); - gulong signal_connect_closure_by_id (guint signal_id, GQuark detail, GClosure* closure, bool after); - gulong signal_connect_closure (const char* detailed_signal, GClosure* closure, bool after); - gulong signal_connect_data (const char* detailed_signal, GCallback c_handler, gpointer data, GClosureNotify destroy_data, GConnectFlags connect_flags); - void signal_handler_block (gulong handler_id); - void signal_handler_unblock (gulong handler_id); - void signal_handler_disconnect (gulong handler_id); - bool signal_handler_is_connected (gulong handler_id); - gulong signal_handler_find (GSignalMatchType mask, guint signal_id, GQuark detail, GClosure* closure, gpointer func, gpointer data); - guint signal_handlers_block_matched (GSignalMatchType mask, guint signal_id, GQuark detail, GClosure* closure, gpointer func, gpointer data); - guint signal_handlers_unblock_matched (GSignalMatchType mask, guint signal_id, GQuark detail, GClosure* closure, gpointer func, gpointer data); - guint signal_handlers_disconnect_matched (GSignalMatchType mask, guint signal_id, GQuark detail, GClosure* closure, gpointer func, gpointer data); - guint signal_handlers_disconnect_by_func (GCallback c_handler, void* data); - - void* get_data (const char* key); - void* get_data (GQuark q); - void set_data (const char* key, gpointer value, GDestroyNotify destroy = nullptr); - void set_data (GQuark q, gpointer value, GDestroyNotify destroy = nullptr); - - void set_property (const char* property_name, const GValue* value); - - template - void set (const char* prop, const T& value) - { - g_object_set (gobj (), prop, cpp_vararg_value_fixer::apply (value), nullptr); - } - - template - void set (const char* prop, const T& value, Args&&... args) - { - set (prop, value); - set (std::forward (args)...); - } - - void get (const char* prop, bool& dest) - { - gboolean val; - g_object_get (gobj (), prop, &val, nullptr); - dest = val; - } - - template - void get (const char* prop, T&& dest) - { - g_object_get (gobj (), prop, cpp_vararg_dest_fixer::apply (std::forward (dest)), nullptr); - } - - template - void get (const char* prop, T&& dest, Args&&... args) - { - get (prop, std::forward (dest)); - get (std::forward (args)...); - } - - void notify (const char* property_name); - void freeze_notify (); - void thaw_notify (); -}; - -namespace g { - -MOO_GOBJ_TYPEDEFS(Object, GObject); - -} // namespace g - -} // namespace moo - -#endif // __cplusplus diff --git a/moo/gpp/old/gobjtypes-gtk.cpp b/moo/gpp/old/gobjtypes-gtk.cpp deleted file mode 100644 index 7cefe210..00000000 --- a/moo/gpp/old/gobjtypes-gtk.cpp +++ /dev/null @@ -1,1332 +0,0 @@ -/* - * moocpp/gobjtypes-gtk.cpp - * - * Copyright (C) 2004-2016 by Yevgen Muntyan - * - * This file is part of medit. medit 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. - * - * You should have received a copy of the GNU Lesser General Public - * License along with medit. If not, see . - */ - -#include "moocpp/moocpp.h" - -using namespace moo; -using namespace moo::gtk; - -#if 0 - -namespace moo { - -namespace _test { - -void test() -{ - ListStorePtr m1 = wrap_new (gtk_list_store_new (1, G_TYPE_STRING)); - TreeStorePtr m2 = wrap_new (gtk_tree_store_new (1, G_TYPE_STRING)); - TreeModelPtr m3 = wrap_new (GTK_TREE_MODEL (gtk_tree_store_new (1, G_TYPE_STRING))); - ListStorePtr m4 = ListStore::create ({ G_TYPE_STRING }); - - if (true) - return; - - //gobj_ptr m4 = m1; - - //create_cpp_gobj(); - //init_cpp_gobj(a); - - //GtkObject* xyz = nullptr; - //init_cpp_gobj(xyz); - - //create_cpp_gobj(GTK_TYPE_TOOLBAR); - - { - gobj_ptr p; - gobj_ref r = *p; - GtkObject* o1 = r.gobj(); - GtkObject* o2 = p->gobj(); - g_assert(o1 == o2); - GObject* o = p.gobj(); - g_assert(o == nullptr); - GtkObject* x = p.gobj(); - GObject* y = p.gobj(); - g_assert((void*) x == (void*) y); - const GObject* c1 = p; - const GtkObject* c2 = p; - g_assert((void*) c1 == (void*) c2); - } - - { - gobj_ptr p = wrap_new(gtk_widget_new(0, "blah", nullptr, nullptr)); - gobj_ref r = *p; - GtkWidget* o1 = r.gobj(); - GtkWidget* o2 = p->gobj(); - g_assert(o1 == o2); - GtkWidget* x = p.gobj(); - GtkWidget* y = p.gobj(); - GtkObject* z = p.gobj(); - GObject* t = p.gobj(); - g_assert((void*) x == (void*) y); - g_assert((void*) z == (void*) t); - const GObject* c1 = p; - const GtkObject* c2 = p; - const GtkWidget* c3 = p; - g_assert((void*) c1 == (void*) c2); - g_assert((void*) c1 == (void*) c3); - - gobj_ref or(*p.gobj()); - or.freeze_notify(); - p->freeze_notify(); - - gobj_raw_ptr rp = p.gobj(); - } -} - -} // namespace _test -} // namespace moo - -#endif // 0 - - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// -// GtkObject -// - -void -Object::destroy () -{ - gtk_object_destroy (gobj ()); -} - - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// -// GtkTreeModel -// - -GtkTreeModelFlags -TreeModel::get_flags () -{ - return gtk_tree_model_get_flags (gobj ()); -} - -int -TreeModel::get_n_columns () -{ - return gtk_tree_model_get_n_columns (gobj ()); -} - -GType -TreeModel::get_column_type (int index_) -{ - return gtk_tree_model_get_column_type (gobj (), index_); -} - -bool -TreeModel::get_iter (GtkTreeIter& iter, const GtkTreePath& path) -{ - return gtk_tree_model_get_iter (gobj (), &iter, const_cast(&path)); -} - -bool -TreeModel::get_iter_from_string (GtkTreeIter& iter, const char* path_string) -{ - return gtk_tree_model_get_iter_from_string (gobj (), &iter, path_string); -} - -gstr -TreeModel::get_string_from_iter (const GtkTreeIter& iter) -{ - return gstr::wrap_new (gtk_tree_model_get_string_from_iter (gobj (), const_cast(&iter))); -} - -bool -TreeModel::get_iter_first (GtkTreeIter& iter) -{ - return gtk_tree_model_get_iter_first (gobj (), &iter); -} - -GtkTreePath* -TreeModel::get_path (const GtkTreeIter& iter) -{ - return gtk_tree_model_get_path (gobj (), const_cast(&iter)); -} - -void -TreeModel::get_value (const GtkTreeIter& iter, int column, GValue* value) -{ - gtk_tree_model_get_value (gobj (), const_cast(&iter), column, value); -} - -bool -TreeModel::iter_next (GtkTreeIter& iter) -{ - return gtk_tree_model_iter_next (gobj (), &iter); -} - -bool -TreeModel::iter_children (GtkTreeIter& iter, const GtkTreeIter& parent) -{ - return gtk_tree_model_iter_children (gobj (), &iter, const_cast(&parent)); -} - -bool -TreeModel::iter_has_child (const GtkTreeIter& iter) -{ - return gtk_tree_model_iter_has_child (gobj (), const_cast(&iter)); -} - -int -TreeModel::iter_n_children (const GtkTreeIter& iter) -{ - return gtk_tree_model_iter_n_children (gobj (), const_cast(&iter)); -} - -bool -TreeModel::iter_nth_child (GtkTreeIter& iter, const GtkTreeIter& parent, int n) -{ - return gtk_tree_model_iter_nth_child (gobj (), &iter, const_cast(&parent), n); -} - -bool -TreeModel::iter_parent (GtkTreeIter& iter, const GtkTreeIter& child) -{ - return gtk_tree_model_iter_parent (gobj (), &iter, const_cast(&child)); -} - - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// -// GtkListStore -// - -ListStorePtr -ListStore::create (size_t n_types, const GType* types) -{ - g_return_val_if_fail (types != nullptr, nullptr); - g_return_val_if_fail (n_types != 0, nullptr); - return wrap_new (gtk_list_store_newv (n_types, const_cast(types))); -} - -void -ListStore::set_value (const GtkTreeIter& iter, - int column, - GValue* value) -{ - gtk_list_store_set_value (gobj (), const_cast(&iter), column, value); -} - -void -ListStore::set_valuesv (const GtkTreeIter& iter, - int* columns, - GValue* values, - int n_values) -{ - gtk_list_store_set_valuesv (gobj (), const_cast(&iter), columns, values, n_values); -} - -bool -ListStore::remove (GtkTreeIter& iter) -{ - return gtk_list_store_remove (gobj (), &iter); -} - -void -ListStore::insert (GtkTreeIter& iter, - int position) -{ - gtk_list_store_insert (gobj (), &iter, position); -} - -void -ListStore::insert_before (GtkTreeIter& iter, - GtkTreeIter& sibling) -{ - gtk_list_store_insert_before (gobj (), &iter, &sibling); -} - -void -ListStore::insert_after (GtkTreeIter& iter, - GtkTreeIter& sibling) -{ - gtk_list_store_insert_after (gobj (), &iter, &sibling); -} - -//void -//ListStore::insert_with_values (GtkTreeIter* iter, -// int position, -// ...) -//{ -// gtk_list_store_insert_with_values (gobj (), &iter, position, ...); -//} -// -//void -//ListStore::insert_with_values (GtkTreeIter* iter, -// int position, -// int* columns, -// GValue* values, -// int n_values) -//{ -// gtk_list_store_insert_with_values (gobj (), &iter, position, columns, values, n_values); -//} - -void -ListStore::prepend (GtkTreeIter& iter) -{ - gtk_list_store_prepend (gobj (), &iter); -} - -void -ListStore::append (GtkTreeIter& iter) -{ - gtk_list_store_append (gobj (), &iter); -} - -void -ListStore::clear () -{ - gtk_list_store_clear (gobj ()); -} - -bool -ListStore::iter_is_valid (const GtkTreeIter& iter) -{ - return gtk_list_store_iter_is_valid (gobj (), const_cast(&iter)); -} - -void -ListStore::reorder (int* new_order) -{ - gtk_list_store_reorder (gobj (), new_order); -} - -void -ListStore::swap (GtkTreeIter& a, - GtkTreeIter& b) -{ - gtk_list_store_swap (gobj (), &a, &b); -} - -void -ListStore::move_after (GtkTreeIter& iter, - GtkTreeIter& position) -{ - gtk_list_store_move_after (gobj (), &iter, &position); -} - -void -ListStore::move_before (GtkTreeIter& iter, - GtkTreeIter& position) -{ - gtk_list_store_move_before (gobj (), &iter, &position); -} - - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// -// GtkTreeView -// - -TreeViewPtr -TreeView::create (TreeModelPtr model) -{ - GtkWidget* w = model ? gtk_tree_view_new_with_model (model->gobj ()) : gtk_tree_view_new (); - return w ? wrap_new (GTK_TREE_VIEW (w)) : nullptr; -} - -TreeModelPtr -TreeView::get_model () -{ - return wrap (gtk_tree_view_get_model (gobj())); -} - -void -TreeView::set_model (TreeModelPtr model) -{ - gtk_tree_view_set_model (gobj (), model ? model->gobj () : nullptr); -} - -GtkTreeSelection* -TreeView::get_selection () -{ - return gtk_tree_view_get_selection (gobj ()); -} - -GtkAdjustment* -TreeView::get_hadjustment () -{ - return gtk_tree_view_get_hadjustment (gobj ()); -} - -void -TreeView::set_hadjustment (GtkAdjustment* adjustment) -{ - gtk_tree_view_set_hadjustment (gobj (), adjustment); -} - -GtkAdjustment* -TreeView::get_vadjustment () -{ - return gtk_tree_view_get_vadjustment (gobj ()); -} - -void -TreeView::set_vadjustment (GtkAdjustment* adjustment) -{ - gtk_tree_view_set_vadjustment (gobj (), adjustment); -} - -bool -TreeView::get_headers_visible () -{ - return gtk_tree_view_get_headers_visible (gobj ()); -} - -void -TreeView::set_headers_visible (bool headers_visible) -{ - gtk_tree_view_set_headers_visible (gobj (), headers_visible); -} - -void -TreeView::columns_autosize () -{ - gtk_tree_view_columns_autosize (gobj ()); -} - -bool -TreeView::get_headers_clickable () -{ - return gtk_tree_view_get_headers_clickable (gobj ()); -} - -void -TreeView::set_headers_clickable (bool setting) -{ - gtk_tree_view_set_headers_clickable (gobj (), setting); -} - -void -TreeView::set_rules_hint (bool setting) -{ - gtk_tree_view_set_rules_hint (gobj (), setting); -} - -bool -TreeView::get_rules_hint () -{ - return gtk_tree_view_get_rules_hint (gobj ()); -} - -int -TreeView::append_column (TreeViewColumn& column) -{ - return gtk_tree_view_append_column (gobj (), column.gobj ()); -} - -int -TreeView::remove_column (TreeViewColumn& column) -{ - return gtk_tree_view_remove_column (gobj (), column.gobj ()); -} - -int -TreeView::insert_column (TreeViewColumn& column, - int position) -{ - return gtk_tree_view_insert_column (gobj (), column.gobj (), position); -} - -//int -//TreeView::insert_column_with_attributes (int position, -// const char* title, -// CellRenderer& cell, -// ...) -//{ -// gtk_tree_view_insert_column_with_attributes (gobj (), position, -// const char* title, -// CellRenderer& cell, -// ...); -//} - -TreeViewColumnPtr -TreeView::get_column (int n) -{ - return wrap_new (gtk_tree_view_get_column (gobj (), n)); -} - -std::vector -TreeView::get_columns () -{ - GList* list = gtk_tree_view_get_columns (gobj ()); - auto ret = object_list_to_vector (list); - g_list_free (list); - return ret; -} - -void -TreeView::move_column_after (TreeViewColumn& column, - TreeViewColumn& base_column) -{ - return gtk_tree_view_move_column_after (gobj (), column.gobj (), base_column.gobj ()); -} - -void -TreeView::set_expander_column (TreeViewColumn& column) -{ - return gtk_tree_view_set_expander_column (gobj (), column.gobj ()); -} - -TreeViewColumnPtr -TreeView::get_expander_column () -{ - return wrap (gtk_tree_view_get_expander_column (gobj ())); -} - -void -TreeView::set_column_drag_function (GtkTreeViewColumnDropFunc func, - gpointer user_data, - GDestroyNotify destroy) -{ - gtk_tree_view_set_column_drag_function (gobj (), func, user_data, destroy); -} - -void -TreeView::scroll_to_point (int tree_x, - int tree_y) -{ - gtk_tree_view_scroll_to_point (gobj (), tree_x, tree_y); -} - -void -TreeView::scroll_to_cell (GtkTreePath* path, - TreeViewColumn& column, - bool use_align, - float row_align, - float col_align) -{ - gtk_tree_view_scroll_to_cell (gobj (), path, column.gobj (), use_align, row_align, col_align); -} - -void -TreeView::row_activated (GtkTreePath* path, - TreeViewColumn& column) -{ - gtk_tree_view_row_activated (gobj (), path, column.gobj ()); -} - -void -TreeView::expand_all () -{ - gtk_tree_view_expand_all (gobj ()); -} - -void -TreeView::collapse_all () -{ - gtk_tree_view_collapse_all (gobj ()); -} - -void -TreeView::expand_to_path (GtkTreePath* path) -{ - gtk_tree_view_expand_to_path (gobj (), path); -} - -bool -TreeView::expand_row (GtkTreePath* path, - bool open_all) -{ - return gtk_tree_view_expand_row (gobj (), path, open_all); -} - -bool -TreeView::collapse_row (GtkTreePath* path) -{ - return gtk_tree_view_collapse_row (gobj (), path); -} - -void -TreeView::map_expanded_rows (GtkTreeViewMappingFunc func, - gpointer data) -{ - gtk_tree_view_map_expanded_rows (gobj (), func, data); -} - -bool -TreeView::row_expanded (GtkTreePath* path) -{ - return gtk_tree_view_row_expanded (gobj (), path); -} - -void -TreeView::set_reorderable (bool reorderable) -{ - gtk_tree_view_set_reorderable (gobj (), reorderable); -} - -bool -TreeView::get_reorderable () -{ - return gtk_tree_view_get_reorderable (gobj ()); -} - -void -TreeView::set_cursor (GtkTreePath* path, - TreeViewColumn& focus_column, - bool start_editing) -{ - gtk_tree_view_set_cursor (gobj (), path, focus_column.gobj (), start_editing); -} - -void -TreeView::set_cursor_on_cell (GtkTreePath* path, - TreeViewColumn& focus_column, - CellRenderer& focus_cell, - bool start_editing) -{ - gtk_tree_view_set_cursor_on_cell (gobj (), path, focus_column.gobj (), focus_cell.gobj (), start_editing); -} - -void -TreeView::get_cursor (GtkTreePath** path, - TreeViewColumnPtr& focus_column) -{ - GtkTreeViewColumn* col = nullptr; - gtk_tree_view_get_cursor (gobj (), path, &col); - focus_column.set (col); -} - -GdkWindow* -TreeView::get_bin_window () -{ - return gtk_tree_view_get_bin_window (gobj ()); -} - -bool -TreeView::get_path_at_pos (int x, - int y, - GtkTreePath** path, - TreeViewColumnPtr& column, - int* cell_x, - int* cell_y) -{ - GtkTreeViewColumn* col = nullptr; - bool ret = gtk_tree_view_get_path_at_pos (gobj (), x, y, path, &col, cell_x, cell_y); - column.set (col); - return ret; -} - -void -TreeView::get_cell_area (GtkTreePath* path, - TreeViewColumn& column, - GdkRectangle& rect) -{ - gtk_tree_view_get_cell_area (gobj (), path, column.gobj(), &rect); -} - -void -TreeView::get_background_area (GtkTreePath* path, - TreeViewColumn& column, - GdkRectangle& rect) -{ - gtk_tree_view_get_background_area (gobj (), path, column.gobj (), &rect); -} - -void -TreeView::get_visible_rect (GdkRectangle& visible_rect) -{ - gtk_tree_view_get_visible_rect (gobj (), &visible_rect); -} - -bool -TreeView::get_visible_range (GtkTreePath** start_path, - GtkTreePath** end_path) -{ - return gtk_tree_view_get_visible_range (gobj (), start_path, end_path); -} - -void -TreeView::enable_model_drag_source (GdkModifierType start_button_mask, - const GtkTargetEntry* targets, - int n_targets, - GdkDragAction actions) -{ - gtk_tree_view_enable_model_drag_source (gobj (), start_button_mask, - targets, n_targets, actions); -} - -void -TreeView::enable_model_drag_dest (const GtkTargetEntry* targets, - int n_targets, - GdkDragAction actions) -{ - gtk_tree_view_enable_model_drag_dest (gobj (), targets, n_targets, actions); -} - -void -TreeView::unset_rows_drag_source () -{ - gtk_tree_view_unset_rows_drag_source (gobj ()); -} - -void -TreeView::unset_rows_drag_dest () -{ - gtk_tree_view_unset_rows_drag_dest (gobj ()); -} - -void -TreeView::set_drag_dest_row (GtkTreePath* path, - GtkTreeViewDropPosition pos) -{ - gtk_tree_view_set_drag_dest_row (gobj (), path, pos); -} - -void -TreeView::get_drag_dest_row (GtkTreePath** path, - GtkTreeViewDropPosition* pos) -{ - gtk_tree_view_get_drag_dest_row (gobj (), path, pos); -} - -bool -TreeView::get_dest_row_at_pos (int drag_x, - int drag_y, - GtkTreePath** path, - GtkTreeViewDropPosition* pos) -{ - return gtk_tree_view_get_dest_row_at_pos (gobj (), drag_x, drag_y, path, pos); -} - -GdkPixmap* -TreeView::create_row_drag_icon (GtkTreePath* path) -{ - return gtk_tree_view_create_row_drag_icon (gobj (), path); -} - -void -TreeView::set_enable_search (bool enable_search) -{ - gtk_tree_view_set_enable_search (gobj (), enable_search); -} - -bool -TreeView::get_enable_search () -{ - return gtk_tree_view_get_enable_search (gobj ()); -} - -int -TreeView::get_search_column () -{ - return gtk_tree_view_get_search_column (gobj ()); -} - -void -TreeView::set_search_column (int column) -{ - gtk_tree_view_set_search_column (gobj (), column); -} - -GtkTreeViewSearchEqualFunc -TreeView::get_search_equal_func () -{ - return gtk_tree_view_get_search_equal_func (gobj ()); -} - -void -TreeView::set_search_equal_func (GtkTreeViewSearchEqualFunc search_equal_func, - gpointer search_user_data, - GDestroyNotify search_destroy) -{ - gtk_tree_view_set_search_equal_func (gobj (), search_equal_func, search_user_data, search_destroy); -} - -GtkEntry* -TreeView::get_search_entry () -{ - return gtk_tree_view_get_search_entry (gobj ()); -} - -void -TreeView::set_search_entry (GtkEntry* entry) -{ - gtk_tree_view_set_search_entry (gobj (), entry); -} - -GtkTreeViewSearchPositionFunc -TreeView::get_search_position_func () -{ - return gtk_tree_view_get_search_position_func (gobj ()); -} - -void -TreeView::set_search_position_func (GtkTreeViewSearchPositionFunc func, - gpointer data, - GDestroyNotify destroy) -{ - gtk_tree_view_set_search_position_func (gobj (), func, data, destroy); -} - -void -TreeView::convert_widget_to_tree_coords (int wx, - int wy, - int* tx, - int* ty) -{ - gtk_tree_view_convert_widget_to_tree_coords (gobj (), wx, wy, tx, ty); -} - -void -TreeView::convert_tree_to_widget_coords (int tx, - int ty, - int* wx, - int* wy) -{ - gtk_tree_view_convert_tree_to_widget_coords (gobj (), tx, ty, wx, wy); -} - -void -TreeView::convert_widget_to_bin_window_coords (int wx, - int wy, - int* bx, - int* by) -{ - gtk_tree_view_convert_widget_to_bin_window_coords (gobj (), wx, wy, bx, by); -} - -void -TreeView::convert_bin_window_to_widget_coords (int bx, - int by, - int* wx, - int* wy) -{ - gtk_tree_view_convert_bin_window_to_widget_coords (gobj (), bx, by, wx, wy); -} - -void -TreeView::convert_tree_to_bin_window_coords (int tx, - int ty, - int* bx, - int* by) -{ - gtk_tree_view_convert_tree_to_bin_window_coords (gobj (), tx, ty, bx, by); -} - -void -TreeView::convert_bin_window_to_tree_coords (int bx, - int by, - int* tx, - int* ty) -{ - gtk_tree_view_convert_bin_window_to_tree_coords (gobj (), bx, by, tx, ty); -} - -void -TreeView::set_fixed_height_mode (bool enable) -{ - gtk_tree_view_set_fixed_height_mode (gobj (), enable); -} - -bool -TreeView::get_fixed_height_mode () -{ - return gtk_tree_view_get_fixed_height_mode (gobj ()); -} - -void -TreeView::set_hover_selection (bool hover) -{ - gtk_tree_view_set_hover_selection (gobj (), hover); -} - -bool -TreeView::get_hover_selection () -{ - return gtk_tree_view_get_hover_selection (gobj ()); -} - -void -TreeView::set_hover_expand (bool expand) -{ - gtk_tree_view_set_hover_expand (gobj (), expand); -} - -bool -TreeView::get_hover_expand () -{ - return gtk_tree_view_get_hover_expand (gobj ()); -} - -void -TreeView::set_rubber_banding (bool enable) -{ - gtk_tree_view_set_rubber_banding (gobj (), enable); -} - -bool -TreeView::get_rubber_banding () -{ - return gtk_tree_view_get_rubber_banding (gobj ()); -} - -bool -TreeView::is_rubber_banding_active () -{ - return gtk_tree_view_is_rubber_banding_active (gobj ()); -} - -GtkTreeViewRowSeparatorFunc -TreeView::get_row_separator_func () -{ - return gtk_tree_view_get_row_separator_func (gobj ()); -} - -void -TreeView::set_row_separator_func (GtkTreeViewRowSeparatorFunc func, - gpointer data, - GDestroyNotify destroy) -{ - gtk_tree_view_set_row_separator_func (gobj (), func, data, destroy); -} - -GtkTreeViewGridLines -TreeView::get_grid_lines () -{ - return gtk_tree_view_get_grid_lines (gobj ()); -} - -void -TreeView::set_grid_lines (GtkTreeViewGridLines grid_lines) -{ - gtk_tree_view_set_grid_lines (gobj (), grid_lines); -} - -bool -TreeView::get_enable_tree_lines () -{ - return gtk_tree_view_get_enable_tree_lines (gobj ()); -} - -void -TreeView::set_enable_tree_lines (bool enabled) -{ - gtk_tree_view_set_enable_tree_lines (gobj (), enabled); -} - -void -TreeView::set_show_expanders (bool enabled) -{ - gtk_tree_view_set_show_expanders (gobj (), enabled); -} - -bool -TreeView::get_show_expanders () -{ - return gtk_tree_view_get_show_expanders (gobj ()); -} - -void -TreeView::set_level_indentation (int indentation) -{ - gtk_tree_view_set_level_indentation (gobj (), indentation); -} - -int -TreeView::get_level_indentation () -{ - return gtk_tree_view_get_level_indentation (gobj ()); -} - -void -TreeView::set_tooltip_row (GtkTooltip* tooltip, - GtkTreePath* path) -{ - gtk_tree_view_set_tooltip_row (gobj (), tooltip, path); -} - -void -TreeView::set_tooltip_cell (GtkTooltip* tooltip, - GtkTreePath* path, - TreeViewColumn& column, - CellRenderer& cell) -{ - gtk_tree_view_set_tooltip_cell (gobj (), tooltip, path, column.gobj (), cell.gobj ()); -} - -bool -TreeView::get_tooltip_context (int* x, - int* y, - bool keyboard_tip, - GtkTreeModel** model, - GtkTreePath** path, - GtkTreeIter* iter) -{ - return gtk_tree_view_get_tooltip_context (gobj (), x, y, keyboard_tip, model, path, iter); -} - -void -TreeView::set_tooltip_column (int column) -{ - gtk_tree_view_set_tooltip_column (gobj (), column); -} - -int -TreeView::get_tooltip_column () -{ - return gtk_tree_view_get_tooltip_column (gobj ()); -} - - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// -// GtkTreeViewColumn -// - -TreeViewColumnPtr -TreeViewColumn::create () -{ - return wrap_new (gtk_tree_view_column_new ()); -} - -//TreeViewColumnPtr -//TreeViewColumn::create (const char* title, -// CellRendererPtr cell, -// ...) -//{ -//} - -void -TreeViewColumn::pack_start (CellRenderer& cell, bool expand) -{ - gtk_tree_view_column_pack_start (gobj (), cell.gobj(), expand); -} - -void -TreeViewColumn::pack_end (CellRenderer& cell, bool expand) -{ - gtk_tree_view_column_pack_end (gobj (), cell.gobj (), expand); -} - -void -TreeViewColumn::clear () -{ - gtk_tree_view_column_clear (gobj ()); -} - -std::vector -TreeViewColumn::get_cell_renderers () -{ - GList* list = gtk_tree_view_column_get_cell_renderers (gobj ()); - auto ret = object_list_to_vector (list); - g_list_free (list); - return ret; -} - -void -TreeViewColumn::add_attribute (CellRenderer& cell, - const char* attribute, - int column) -{ - gtk_tree_view_column_add_attribute (gobj (), cell.gobj (), attribute, column); -} - -void -TreeViewColumn::set_attributes (gtk::CellRenderer& cell_renderer, const char* prop, int column) -{ - gtk_tree_view_column_set_attributes (gobj (), cell_renderer.gobj (), prop, column, nullptr); -} - -void -TreeViewColumn::clear_attributes (CellRenderer& cell_renderer) -{ - gtk_tree_view_column_clear_attributes (gobj (), cell_renderer.gobj ()); -} - -void -TreeViewColumn::set_spacing (int spacing) -{ - gtk_tree_view_column_set_spacing (gobj (), spacing); -} - -int -TreeViewColumn::get_spacing () -{ - return gtk_tree_view_column_get_spacing (gobj ()); -} - -void -TreeViewColumn::set_visible (bool visible) -{ - gtk_tree_view_column_set_visible (gobj (), visible); -} - -bool -TreeViewColumn::get_visible () -{ - return gtk_tree_view_column_get_visible (gobj ()); -} - -void -TreeViewColumn::set_resizable (bool resizable) -{ - gtk_tree_view_column_set_resizable (gobj (), resizable); -} - -bool -TreeViewColumn::get_resizable () -{ - return gtk_tree_view_column_get_resizable (gobj ()); -} - -void -TreeViewColumn::set_sizing (GtkTreeViewColumnSizing type) -{ - gtk_tree_view_column_set_sizing (gobj (), type); -} - -GtkTreeViewColumnSizing -TreeViewColumn::get_sizing () -{ - return gtk_tree_view_column_get_sizing (gobj ()); -} - -int -TreeViewColumn::get_width () -{ - return gtk_tree_view_column_get_width (gobj ()); -} - -int -TreeViewColumn::get_fixed_width () -{ - return gtk_tree_view_column_get_fixed_width (gobj ()); -} - -void -TreeViewColumn::set_fixed_width (int fixed_width) -{ - gtk_tree_view_column_set_fixed_width (gobj (), fixed_width); -} - -void -TreeViewColumn::set_min_width (int min_width) -{ - gtk_tree_view_column_set_min_width (gobj (), min_width); -} - -int -TreeViewColumn::get_min_width () -{ - return gtk_tree_view_column_get_min_width (gobj ()); -} - -void -TreeViewColumn::set_max_width (int max_width) -{ - gtk_tree_view_column_set_max_width (gobj (), max_width); -} - -int -TreeViewColumn::get_max_width () -{ - return gtk_tree_view_column_get_max_width (gobj ()); -} - -void -TreeViewColumn::clicked () -{ - gtk_tree_view_column_clicked (gobj ()); -} - -void -TreeViewColumn::set_title (const char* title) -{ - gtk_tree_view_column_set_title (gobj (), title); -} - -gstr -TreeViewColumn::get_title () -{ - return gstr::wrap (gtk_tree_view_column_get_title (gobj ())); -} - -void -TreeViewColumn::set_expand (bool expand) -{ - gtk_tree_view_column_set_expand (gobj (), expand); -} - -bool -TreeViewColumn::get_expand () -{ - return gtk_tree_view_column_get_expand (gobj ()); -} - -void -TreeViewColumn::set_clickable (bool clickable) -{ - gtk_tree_view_column_set_clickable (gobj (), clickable); -} - -bool -TreeViewColumn::get_clickable () -{ - return gtk_tree_view_column_get_clickable (gobj ()); -} - -void -TreeViewColumn::set_widget (WidgetPtr widget) -{ - gtk_tree_view_column_set_widget (gobj (), widget.gobj ()); -} - -WidgetPtr -TreeViewColumn::get_widget () -{ - return wrap (gtk_tree_view_column_get_widget (gobj ())); -} - -void -TreeViewColumn::set_alignment (float xalign) -{ - gtk_tree_view_column_set_alignment (gobj (), xalign); -} - -float -TreeViewColumn::get_alignment () -{ - return gtk_tree_view_column_get_alignment (gobj ()); -} - -void -TreeViewColumn::set_reorderable (bool reorderable) -{ - gtk_tree_view_column_set_reorderable (gobj (), reorderable); -} - -bool -TreeViewColumn::get_reorderable () -{ - return gtk_tree_view_column_get_reorderable (gobj ()); -} - -void -TreeViewColumn::set_sort_column_id (int sort_column_id) -{ - gtk_tree_view_column_set_sort_column_id (gobj (), sort_column_id); -} - -int -TreeViewColumn::get_sort_column_id () -{ - return gtk_tree_view_column_get_sort_column_id (gobj ()); -} - -void -TreeViewColumn::set_sort_indicator (bool setting) -{ - gtk_tree_view_column_set_sort_indicator (gobj (), setting); -} - -bool -TreeViewColumn::get_sort_indicator () -{ - return gtk_tree_view_column_get_sort_indicator (gobj ()); -} - -void -TreeViewColumn::set_sort_order (GtkSortType order) -{ - gtk_tree_view_column_set_sort_order (gobj (), order); -} - -GtkSortType -TreeViewColumn::get_sort_order () -{ - return gtk_tree_view_column_get_sort_order (gobj ()); -} - -TreeViewPtr -TreeViewColumn::get_tree_view () -{ - GtkWidget* w = gtk_tree_view_column_get_tree_view (gobj ()); - return w ? wrap (GTK_TREE_VIEW (w)) : nullptr; -} - - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// -// GtkCellRenderer -// - - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// -// GtkCellRendererText -// - -gtk::CellRendererTextPtr -CellRendererText::create () -{ - return wrap_new (up_cast (gtk_cell_renderer_text_new ())); -} - -void CellRendererText::set_fixed_height_from_font (int number_of_rows) -{ - gtk_cell_renderer_text_set_fixed_height_from_font (gobj (), number_of_rows); -} - - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// -// GtkCellRendererPixbuf -// - -gtk::CellRendererPixbufPtr -CellRendererPixbuf::create () -{ - return wrap_new (up_cast (gtk_cell_renderer_pixbuf_new ())); -} - - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// -// GtkCellRendererToggle -// - -gtk::CellRendererTogglePtr -CellRendererToggle::create () -{ - return wrap_new (up_cast (gtk_cell_renderer_toggle_new ())); -} - -bool -CellRendererToggle::get_radio () -{ - return gtk_cell_renderer_toggle_get_radio (gobj ()); -} - -void -CellRendererToggle::set_radio (bool radio) -{ - gtk_cell_renderer_toggle_set_radio (gobj (), radio); -} - -bool -CellRendererToggle::get_active () -{ - return gtk_cell_renderer_toggle_get_active (gobj ()); -} - -void -CellRendererToggle::set_active (bool active) -{ - gtk_cell_renderer_toggle_set_active (gobj(), active); -} diff --git a/moo/gpp/old/gobjtypes-gtk.h b/moo/gpp/old/gobjtypes-gtk.h deleted file mode 100644 index b94a34cc..00000000 --- a/moo/gpp/old/gobjtypes-gtk.h +++ /dev/null @@ -1,653 +0,0 @@ -/* - * moocpp/gobjtypes-gtk.h - * - * Copyright (C) 2004-2016 by Yevgen Muntyan - * - * This file is part of medit. medit 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. - * - * You should have received a copy of the GNU Lesser General Public - * License along with medit. If not, see . - */ - -#pragma once - -#include -#include - -#ifdef __cplusplus - -#include "moocpp/gobjtypes-glib.h" -#include -#include - -#define MOO_DEFINE_GTK_TYPE(Object, Parent, obj_g_type) \ - MOO_DEFINE_GOBJ_TYPE(Gtk##Object, Parent, obj_g_type) \ - namespace moo { \ - namespace gtk { \ - MOO_GOBJ_TYPEDEFS(Object, Gtk##Object) \ - } \ - } - -#define MOO_DEFINE_GTK_IFACE(Iface, iface_g_type) \ - MOO_DEFINE_GIFACE_TYPE(Gtk##Iface, iface_g_type) \ - namespace moo { \ - namespace gtk { \ - MOO_GIFACE_TYPEDEFS(Iface, Gtk##Iface) \ - } \ - } - - -MOO_DECLARE_CUSTOM_GOBJ_TYPE (GtkObject) -MOO_DECLARE_CUSTOM_GOBJ_TYPE (GtkWidget) -MOO_DECLARE_CUSTOM_GOBJ_TYPE (GtkTextView) -MOO_DECLARE_CUSTOM_GOBJ_TYPE (GtkTreeModel) -MOO_DECLARE_CUSTOM_GOBJ_TYPE (GtkTreeStore) -MOO_DECLARE_CUSTOM_GOBJ_TYPE (GtkListStore) -MOO_DECLARE_CUSTOM_GOBJ_TYPE (GtkTreeView) -MOO_DECLARE_CUSTOM_GOBJ_TYPE (GtkTreeViewColumn) -MOO_DECLARE_CUSTOM_GOBJ_TYPE (GtkCellRenderer) -MOO_DECLARE_CUSTOM_GOBJ_TYPE (GtkCellRendererText) -MOO_DECLARE_CUSTOM_GOBJ_TYPE (GtkCellRendererToggle) -MOO_DECLARE_CUSTOM_GOBJ_TYPE (GtkCellRendererPixbuf) - - -MOO_DEFINE_GTK_TYPE (Object, GObject, GTK_TYPE_OBJECT) -MOO_DEFINE_GTK_TYPE (Widget, GtkObject, GTK_TYPE_WIDGET) - -template<> -class moo::gobj_ref : public virtual moo::gobj_ref_parent -{ -public: - MOO_DEFINE_GOBJREF_METHODS (GtkObject); - - void destroy (); -}; - -template<> -class moo::gobj_ref : public virtual moo::gobj_ref_parent -{ -public: - MOO_DEFINE_GOBJREF_METHODS (GtkWidget); -}; - - -MOO_DEFINE_GTK_TYPE(Entry, GtkWidget, GTK_TYPE_ENTRY) -MOO_DEFINE_GTK_TYPE(Action, GObject, GTK_TYPE_ACTION) -MOO_DEFINE_GTK_TYPE(TextBuffer, GObject, GTK_TYPE_TEXT_BUFFER) -MOO_DEFINE_GTK_TYPE(TextMark, GObject, GTK_TYPE_TEXT_MARK) -MOO_DEFINE_GTK_TYPE(MenuShell, GtkWidget, GTK_TYPE_MENU_SHELL) -MOO_DEFINE_GTK_TYPE(Menu, GtkMenuShell, GTK_TYPE_MENU) - - -MOO_DEFINE_GTK_TYPE (TextView, GtkWidget, GTK_TYPE_TEXT_VIEW) - -template<> -class moo::gobj_ref : public virtual moo::gobj_ref_parent -{ -public: - MOO_DEFINE_GOBJREF_METHODS(GtkTextView); - - gtk::TextBuffer get_buffer (); -}; - - -MOO_DEFINE_GTK_IFACE (TreeModel, GTK_TYPE_TREE_MODEL) - -template<> -class moo::gobj_ref : public virtual moo::gobj_ref_parent -{ -public: - MOO_DEFINE_GOBJREF_METHODS (GtkTreeModel); - - GtkTreeModelFlags get_flags (); - int get_n_columns (); - GType get_column_type (int index_); - - bool get_iter (GtkTreeIter& iter, const GtkTreePath& path); - bool get_iter_from_string (GtkTreeIter& iter, const char* path_string); - gstr get_string_from_iter (const GtkTreeIter& iter); - bool get_iter_first (GtkTreeIter& iter); - GtkTreePath* get_path (const GtkTreeIter& iter); - void get_value (const GtkTreeIter& iter, int column, GValue* value); - bool iter_next (GtkTreeIter& iter); - bool iter_children (GtkTreeIter& iter, const GtkTreeIter& parent); - bool iter_has_child (const GtkTreeIter& iter); - int iter_n_children (const GtkTreeIter& iter); - bool iter_nth_child (GtkTreeIter& iter, const GtkTreeIter& parent, int n); - bool iter_parent (GtkTreeIter& iter, const GtkTreeIter& child); - - void get (const GtkTreeIter& iter, int column, bool& dest) - { - gboolean val; - gtk_tree_model_get (gobj (), const_cast(&iter), column, &val, -1); - dest = val; - } - - template - void get (const GtkTreeIter& iter, int column, T&& dest) - { - gtk_tree_model_get (gobj (), const_cast(&iter), column, cpp_vararg_dest_fixer::apply (std::forward (dest)), -1); - } - - template - void get (const GtkTreeIter& iter, int column, T&& dest, Args&&... args) - { - get (iter, column, std::forward (dest)); - get (iter, std::forward (args)...); - } - - // bool TFunc (const GtkTreePath&, const GtkTreeIter&) - template - void foreach (const TFunc& func) - { - const void* p = &func; - gtk_tree_model_foreach (gobj (), foreach_func, const_cast(p)); - } - -private: - template - static gboolean foreach_func (GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data) - { - const TFunc& func = *reinterpret_cast(data); - return func (const_cast(*path), const_cast(*iter)); - } -}; - -MOO_DEFINE_GTK_TYPE (ListStore, GObject, GTK_TYPE_LIST_STORE) -MOO_GOBJ_IMPLEMENTS_IFACE (GtkListStore, GtkTreeModel) - -template<> -class moo::gobj_ref - : public virtual moo::gobj_ref_parent - , public virtual moo::gobj_ref -{ -public: - MOO_DEFINE_GOBJREF_METHODS(GtkListStore); - - static gtk::ListStorePtr create (std::initializer_list types) - { - return create (types.size (), types.begin ()); - } - - static gtk::ListStorePtr create (size_t n_columns, std::initializer_list types) - { - g_return_val_if_fail (n_columns == types.size (), nullptr); - return create (n_columns, types.begin ()); - } - - static gtk::ListStorePtr create (size_t n_columns, const GType* types); - - template - void set (const GtkTreeIter& iter, int column, T&& value) - { - gtk_list_store_set (gobj (), const_cast(&iter), column, cpp_vararg_value_fixer::apply (std::forward (value)), -1); - } - - template - void set (const GtkTreeIter& iter, int column, T&& value, Args&&... args) - { - set (iter, column, std::forward (value)); - set (iter, std::forward (args)...); - } - - void set_value (const GtkTreeIter& iter, - int column, - GValue* value); - void set_valuesv (const GtkTreeIter& iter, - int* columns, - GValue* values, - int n_values); - bool remove (GtkTreeIter& iter); - void insert (GtkTreeIter& iter, - int position); - void insert_before (GtkTreeIter& iter, - GtkTreeIter& sibling); - void insert_after (GtkTreeIter& iter, - GtkTreeIter& sibling); - //void insert_with_values (GtkTreeIter* iter, - // int position, - // ...); - //void insert_with_values (GtkTreeIter* iter, - // int position, - // int* columns, - // GValue* values, - // int n_values); - void prepend (GtkTreeIter& iter); - void append (GtkTreeIter& iter); - void clear (); - bool iter_is_valid (const GtkTreeIter& iter); - void reorder (int* new_order); - void swap (GtkTreeIter& a, - GtkTreeIter& b); - void move_after (GtkTreeIter& iter, - GtkTreeIter& position); - void move_before (GtkTreeIter& iter, - GtkTreeIter& position); -}; - -MOO_DEFINE_GTK_TYPE (TreeStore, GObject, GTK_TYPE_TREE_STORE) -MOO_GOBJ_IMPLEMENTS_IFACE (GtkTreeStore, GtkTreeModel) - -template<> -class moo::gobj_ref - : public virtual moo::gobj_ref_parent - , public virtual moo::gobj_ref -{ -public: - MOO_DEFINE_GOBJREF_METHODS (GtkTreeStore); -}; - -MOO_DEFINE_GTK_TYPE (TreeView, GtkContainer, GTK_TYPE_TREE_VIEW) -MOO_DEFINE_GTK_TYPE (TreeViewColumn, GtkObject, GTK_TYPE_TREE_VIEW_COLUMN) -MOO_DEFINE_GTK_TYPE (CellRenderer, GtkObject, GTK_TYPE_CELL_RENDERER) -MOO_DEFINE_GTK_TYPE (CellRendererText, GtkCellRenderer, GTK_TYPE_CELL_RENDERER_TEXT) -MOO_DEFINE_GTK_TYPE (CellRendererPixbuf, GtkCellRenderer, GTK_TYPE_CELL_RENDERER_PIXBUF) -MOO_DEFINE_GTK_TYPE (CellRendererToggle, GtkCellRenderer, GTK_TYPE_CELL_RENDERER_TOGGLE) - - -template -class TreeCellDataFunc -{ -public: - TreeCellDataFunc (TFunc func) : m_func (std::move (func)) {} - ~TreeCellDataFunc () {} - - MOO_DISABLE_COPY_OPS (TreeCellDataFunc); - - static void destroy (gpointer d) { delete reinterpret_cast(d); } - - static void cell_data_func (GtkTreeViewColumn *tree_column, - GtkCellRenderer *cell, - GtkTreeModel *tree_model, - GtkTreeIter *iter, - gpointer p); - -private: - TFunc m_func; -}; - - -template<> -class moo::gobj_ref : public virtual moo::gobj_ref_parent -{ -public: - MOO_DEFINE_GOBJREF_METHODS (GtkTreeView); - - static gtk::TreeViewPtr create (gtk::TreeModelPtr model); - - gtk::TreeModelPtr get_model (); - void set_model (gtk::TreeModelPtr model); - GtkTreeSelection* get_selection (); - GtkAdjustment* get_hadjustment (); - void set_hadjustment (GtkAdjustment* adjustment); - GtkAdjustment* get_vadjustment (); - void set_vadjustment (GtkAdjustment* adjustment); - bool get_headers_visible (); - void set_headers_visible (bool headers_visible); - void columns_autosize (); - bool get_headers_clickable (); - void set_headers_clickable (bool setting); - void set_rules_hint (bool setting); - bool get_rules_hint (); - - /* Column funtions */ - int append_column (gtk::TreeViewColumn& column); - int remove_column (gtk::TreeViewColumn& column); - int insert_column (gtk::TreeViewColumn& column, - int position); - int insert_column_with_attributes (int position, - const char* title, - gtk::CellRenderer& cell, - ...) G_GNUC_NULL_TERMINATED; - - template - int insert_column_with_data_func (int position, - const char* title, - gtk::CellRenderer& cell, - TFunc func); - - gtk::TreeViewColumnPtr get_column (int n); - std::vector get_columns (); - void move_column_after (gtk::TreeViewColumn& column, - gtk::TreeViewColumn& base_column); - void set_expander_column (gtk::TreeViewColumn& column); - gtk::TreeViewColumnPtr get_expander_column (); - void set_column_drag_function (GtkTreeViewColumnDropFunc func, - gpointer user_data, - GDestroyNotify destroy); - - /* Actions */ - void scroll_to_point (int tree_x, - int tree_y); - void scroll_to_cell (GtkTreePath* path, - gtk::TreeViewColumn& column, - bool use_align, - float row_align, - float col_align); - void row_activated (GtkTreePath* path, - gtk::TreeViewColumn& column); - void expand_all (); - void collapse_all (); - void expand_to_path (GtkTreePath* path); - bool expand_row (GtkTreePath* path, - bool open_all); - bool collapse_row (GtkTreePath* path); - void map_expanded_rows (GtkTreeViewMappingFunc func, - gpointer data); - bool row_expanded (GtkTreePath* path); - void set_reorderable (bool reorderable); - bool get_reorderable (); - void set_cursor (GtkTreePath* path, - gtk::TreeViewColumn& focus_column, - bool start_editing); - void set_cursor_on_cell (GtkTreePath* path, - gtk::TreeViewColumn& focus_column, - gtk::CellRenderer& focus_cell, - bool start_editing); - void get_cursor (GtkTreePath** path, - gtk::TreeViewColumnPtr& focus_column); - - /* Layout information */ - GdkWindow* get_bin_window (); - bool get_path_at_pos (int x, - int y, - GtkTreePath** path, - gtk::TreeViewColumnPtr& column, - int* cell_x, - int* cell_y); - void get_cell_area (GtkTreePath* path, - gtk::TreeViewColumn& column, - GdkRectangle& rect); - void get_background_area (GtkTreePath* path, - gtk::TreeViewColumn& column, - GdkRectangle& rect); - void get_visible_rect (GdkRectangle& visible_rect); - - bool get_visible_range (GtkTreePath** start_path, - GtkTreePath** end_path); - - /* Drag-and-Drop support */ - void enable_model_drag_source (GdkModifierType start_button_mask, - const GtkTargetEntry* targets, - int n_targets, - GdkDragAction actions); - void enable_model_drag_dest (const GtkTargetEntry* targets, - int n_targets, - GdkDragAction actions); - void unset_rows_drag_source (); - void unset_rows_drag_dest (); - - /* These are useful to implement your own custom stuff. */ - void set_drag_dest_row (GtkTreePath* path, - GtkTreeViewDropPosition pos); - void get_drag_dest_row (GtkTreePath** path, - GtkTreeViewDropPosition* pos); - bool get_dest_row_at_pos (int drag_x, - int drag_y, - GtkTreePath** path, - GtkTreeViewDropPosition* pos); - GdkPixmap* create_row_drag_icon (GtkTreePath* path); - - /* Interactive search */ - void set_enable_search (bool enable_search); - bool get_enable_search (); - int get_search_column (); - void set_search_column (int column); - GtkTreeViewSearchEqualFunc get_search_equal_func (); - void set_search_equal_func (GtkTreeViewSearchEqualFunc search_equal_func, - gpointer search_user_data, - GDestroyNotify search_destroy); - - GtkEntry* get_search_entry (); - void set_search_entry (GtkEntry* entry); - GtkTreeViewSearchPositionFunc get_search_position_func (); - void set_search_position_func (GtkTreeViewSearchPositionFunc func, - gpointer data, - GDestroyNotify destroy); - - /* Convert between the different coordinate systems */ - void convert_widget_to_tree_coords (int wx, - int wy, - int* tx, - int* ty); - void convert_tree_to_widget_coords (int tx, - int ty, - int* wx, - int* wy); - void convert_widget_to_bin_window_coords (int wx, - int wy, - int* bx, - int* by); - void convert_bin_window_to_widget_coords (int bx, - int by, - int* wx, - int* wy); - void convert_tree_to_bin_window_coords (int tx, - int ty, - int* bx, - int* by); - void convert_bin_window_to_tree_coords (int bx, - int by, - int* tx, - int* ty); - - void set_fixed_height_mode (bool enable); - bool get_fixed_height_mode (); - void set_hover_selection (bool hover); - bool get_hover_selection (); - void set_hover_expand (bool expand); - bool get_hover_expand (); - void set_rubber_banding (bool enable); - bool get_rubber_banding (); - - bool is_rubber_banding_active (); - - GtkTreeViewRowSeparatorFunc get_row_separator_func (); - void set_row_separator_func (GtkTreeViewRowSeparatorFunc func, - gpointer data, - GDestroyNotify destroy); - - GtkTreeViewGridLines get_grid_lines (); - void set_grid_lines (GtkTreeViewGridLines grid_lines); - bool get_enable_tree_lines (); - void set_enable_tree_lines (bool enabled); - void set_show_expanders (bool enabled); - bool get_show_expanders (); - void set_level_indentation (int indentation); - int get_level_indentation (); - - /* Convenience functions for setting tooltips */ - void set_tooltip_row (GtkTooltip* tooltip, - GtkTreePath* path); - void set_tooltip_cell (GtkTooltip* tooltip, - GtkTreePath* path, - gtk::TreeViewColumn& column, - gtk::CellRenderer& cell); - bool get_tooltip_context (int* x, - int* y, - bool keyboard_tip, - GtkTreeModel** model, - GtkTreePath** path, - GtkTreeIter* iter); - void set_tooltip_column (int column); - int get_tooltip_column (); -}; - -template<> -class moo::gobj_ref : public virtual moo::gobj_ref_parent -{ -public: - MOO_DEFINE_GOBJREF_METHODS (GtkTreeViewColumn); - - static gtk::TreeViewColumnPtr create (); - static gtk::TreeViewColumnPtr create (const char* title, - gtk::CellRendererPtr cell, - ...) G_GNUC_NULL_TERMINATED; - - void pack_start (gtk::CellRenderer& cell, - bool expand); - void pack_end (gtk::CellRenderer& cell, - bool expand); - void clear (); - std::vector get_cell_renderers (); - void add_attribute (gtk::CellRenderer& cell, - const char* attribute, - int column); - - void set_attributes (gtk::CellRenderer& cell_renderer, const char* prop, int column); - - template - void set_attributes (gtk::CellRenderer& cell_renderer, const char* prop, int column, Args&&... args) - { - set_attributes (cell_renderer, prop, column); - set_attributes (cell_renderer, std::forward (args)...); - } - - // void TFunc(gtk::TreeViewColumn, gtk::CellRenderer, gtk::TreeModel, const GtkTreeIter&) - template - inline void set_cell_data_func (gtk::CellRenderer& cell_renderer, TFunc func); - - void clear_attributes (gtk::CellRenderer& cell_renderer); - void set_spacing (int spacing); - int get_spacing (); - void set_visible (bool visible); - bool get_visible (); - void set_resizable (bool resizable); - bool get_resizable (); - void set_sizing (GtkTreeViewColumnSizing type); - GtkTreeViewColumnSizing get_sizing (); - int get_width (); - int get_fixed_width (); - void set_fixed_width (int fixed_width); - void set_min_width (int min_width); - int get_min_width (); - void set_max_width (int max_width); - int get_max_width (); - void clicked (); - - /* Options for manipulating the column headers - */ - void set_title (const char* title); - gstr get_title (); - void set_expand (bool expand); - bool get_expand (); - void set_clickable (bool clickable); - bool get_clickable (); - void set_widget (gtk::WidgetPtr widget); - gtk::WidgetPtr get_widget (); - void set_alignment (float xalign); - float get_alignment (); - void set_reorderable (bool reorderable); - bool get_reorderable (); - - /* You probably only want to use gtk_tree_view_column_set_sort_column_id. The - * other sorting functions exist primarily to let others do their own custom sorting. - */ - void set_sort_column_id (int sort_column_id); - int get_sort_column_id (); - void set_sort_indicator (bool setting); - bool get_sort_indicator (); - void set_sort_order (GtkSortType order); - GtkSortType get_sort_order (); - - gtk::TreeViewPtr get_tree_view (); -}; - -template<> -class moo::gobj_ref : public virtual moo::gobj_ref_parent -{ -public: - MOO_DEFINE_GOBJREF_METHODS (GtkCellRenderer); -}; - -template<> -class moo::gobj_ref : public virtual moo::gobj_ref_parent -{ -public: - MOO_DEFINE_GOBJREF_METHODS (GtkCellRendererText); - - static gtk::CellRendererTextPtr create (); - - void set_fixed_height_from_font (int number_of_rows); -}; - -template<> -class moo::gobj_ref : public virtual moo::gobj_ref_parent -{ -public: - MOO_DEFINE_GOBJREF_METHODS (GtkCellRendererToggle); - - static gtk::CellRendererTogglePtr create (); - - bool get_radio (); - void set_radio (bool radio); - bool get_active (); - void set_active (bool active); -}; - -template<> -class moo::gobj_ref : public virtual moo::gobj_ref_parent -{ -public: - MOO_DEFINE_GOBJREF_METHODS (GtkCellRendererPixbuf); - - static gtk::CellRendererPixbufPtr create (); -}; - - -template -inline void -TreeCellDataFunc::cell_data_func (GtkTreeViewColumn *tree_column, - GtkCellRenderer *cell, - GtkTreeModel *tree_model, - GtkTreeIter *iter, - gpointer p) -{ - g_return_if_fail (GTK_IS_TREE_VIEW_COLUMN (tree_column)); - g_return_if_fail (GTK_IS_CELL_RENDERER (cell)); - g_return_if_fail (GTK_IS_TREE_MODEL (tree_model)); - g_return_if_fail (iter != nullptr); - g_return_if_fail (p != nullptr); - TreeCellDataFunc& data = *reinterpret_cast(p); - data.m_func (moo::wrap (*tree_column), moo::wrap (*cell), moo::wrap (*tree_model), - const_cast(*iter)); -} - - -template -inline int -moo::gobj_ref::insert_column_with_data_func (int position, - const char* title, - gtk::CellRenderer& cell, - TFunc func) -{ - TreeCellDataFunc *data = new TreeCellDataFunc{ std::move (func) }; - return gtk_tree_view_insert_column_with_data_func (gobj (), position, title, cell.gobj (), - TreeCellDataFunc::cell_data_func, data, - TreeCellDataFunc::destroy); -} - - -// void TFunc(gtk::TreeViewColumn, gtk::CellRenderer, gtk::TreeModel, const GtkTreeIter&) -template -inline void -moo::gobj_ref::set_cell_data_func (gtk::CellRenderer& cell_renderer, TFunc func) -{ - TreeCellDataFunc *data = new TreeCellDataFunc{ std::move (func) }; - gtk_tree_view_column_set_cell_data_func (gobj (), cell_renderer.gobj (), - TreeCellDataFunc::cell_data_func, data, - TreeCellDataFunc::destroy); -} - - -MOO_DEFINE_FLAGS(GdkEventMask); -MOO_DEFINE_FLAGS(GdkModifierType); -MOO_DEFINE_FLAGS(GtkCellRendererState); -MOO_DEFINE_FLAGS(GtkAttachOptions); -MOO_DEFINE_FLAGS(GdkDragAction); - -#endif // __cplusplus diff --git a/moo/gpp/old/gobjtypes.h b/moo/gpp/old/gobjtypes.h deleted file mode 100644 index 3905807d..00000000 --- a/moo/gpp/old/gobjtypes.h +++ /dev/null @@ -1,20 +0,0 @@ -/* - * moocpp/gobjtypes.h - * - * Copyright (C) 2004-2016 by Yevgen Muntyan - * - * This file is part of medit. medit 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. - * - * You should have received a copy of the GNU Lesser General Public - * License along with medit. If not, see . - */ - -#pragma once - -#include -#include -#include diff --git a/moo/gpp/old/gobjwrapper.h b/moo/gpp/old/gobjwrapper.h deleted file mode 100644 index 5abed2c5..00000000 --- a/moo/gpp/old/gobjwrapper.h +++ /dev/null @@ -1,111 +0,0 @@ -/* - * moocpp/gobjwrapper.h - * - * Copyright (C) 2004-2016 by Yevgen Muntyan - * - * This file is part of medit. medit 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. - * - * You should have received a copy of the GNU Lesser General Public - * License along with medit. If not, see . - */ - -#pragma once - -#ifdef __cplusplus - -#include -#include -#include -#include - -namespace moo { - -/////////////////////////////////////////////////////////////////////////////////////////// -// -// gobj_wrapper -// - -class gobj_wrapper_base -{ -protected: - static gobj_wrapper_base& get(gobj_ref g); - - gobj_wrapper_base(gobj_ref g); - virtual ~gobj_wrapper_base(); - - MOO_DISABLE_COPY_OPS(gobj_wrapper_base); - -private: - static GQuark qdata_key; - static void free_qdata(gpointer d); -}; - -template -class gobj_wrapper : public gobj_ref, public gobj_wrapper_base -{ - using obj_ref_type = gobj_ref; - using obj_ptr_type = gobj_ptr; - -public: - template - static gref_ptr create(Args&& ...args) - { - return create(std::forward(args)...); - } - - template - static gref_ptr create(Args&& ...args) - { - obj_ptr_type g = create_gobj(); - gobj_wrapper_data d{g.gobj()}; - auto o = gref_ptr::create(d, std::forward(args)...); - // Now g and o share the ref count, which is currently owned by the g pointer; steal it. - g.release(); - return o; - } - - static CppObject& get(obj_ref_type gobj) - { - gobj_wrapper_base& b = gobj_wrapper_base::get(gobj); - return static_cast(b); - } - - CppObject* operator&() { return static_cast(this); } - - void ref() - { - g_object_ref (obj_ref_type::gobj()); - } - - void unref() - { - g_object_unref (obj_ref_type::gobj()); - } - - MOO_DISABLE_COPY_OPS(gobj_wrapper); - -protected: - struct gobj_wrapper_data { CObject* g; }; - - gobj_wrapper(gobj_wrapper_data& d) - : obj_ref_type(*d.g) - , gobj_wrapper_base(obj_ref_type(*d.g)) - { - } - - virtual ~gobj_wrapper() - { - } -}; - -} // namespace moo - -void g_signal_emit_valist(const moo::gobj_wrapper_base*, guint, GQuark, va_list) = delete; -void g_signal_emit(const moo::gobj_wrapper_base*, guint, GQuark, ...) = delete; -void g_signal_emit_by_name(const moo::gobj_wrapper_base*, const gchar*, ...) = delete; - -#endif // __cplusplus diff --git a/moo/gpp/old/grefptr.h b/moo/gpp/old/grefptr.h deleted file mode 100644 index c87f13c2..00000000 --- a/moo/gpp/old/grefptr.h +++ /dev/null @@ -1,193 +0,0 @@ -/* - * moocpp/grefptr.h - * - * Copyright (C) 2004-2016 by Yevgen Muntyan - * - * This file is part of medit. medit 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. - * - * You should have received a copy of the GNU Lesser General Public - * License along with medit. If not, see . - */ - -#pragma once - -#ifdef __cplusplus - -#include "moocpp/utils.h" - -namespace moo { - -template -struct obj_ref_unref -{ - static void ref(Object* obj) { obj->ref(); } - static void unref(Object* obj) { obj->unref(); } -}; - -enum class ref_transfer -{ - take_ownership, - make_copy, -}; - -template> -class gref_ptr -{ -public: - gref_ptr() : m_p(nullptr) {} - gref_ptr(const nullptr_t&) : gref_ptr() {} - - gref_ptr(Object* obj, ref_transfer policy) - : gref_ptr() - { - assign(obj, policy); - } - - template - static gref_ptr create(Args&& ...args) - { - return wrap_new(new Object(std::forward(args)...)); - } - - static gref_ptr wrap_new(Object* obj) - { - return gref_ptr(obj, ref_transfer::take_ownership); - } - - ~gref_ptr() - { - reset(); - } - - void ref(Object* obj) - { - set(obj); - } - - void set(Object* obj) - { - assign(obj, ref_transfer::make_copy); - } - - void set_new(Object* obj) - { - assign(obj, ref_transfer::take_ownership); - } - - Object* release() - { - auto* tmp = m_p; - m_p = nullptr; - return tmp; - } - - void reset() - { - auto* tmp = m_p; - m_p = nullptr; - if (tmp) - ObjRefUnref::unref(tmp); - } - - // Implicit conversion to Object* is dangerous because there is a lot - // of code still which frees/steals objects directly. For example: - // FooObject* tmp = x->s; - // x->s = NULL; - // g_object_unref (tmp); - operator const Object* () const { return gobj(); } - Object* gobj() const { return m_p; } - Object& operator*() const { return *gobj(); } - Object* operator->() const { return gobj(); } - - // Explicitly forbid other pointer conversions. This way it's still possible to implement - // implicit conversions in subclasses, like that to GTypeInstance in gobj_ptr. - template - operator T*() const = delete; - - operator bool() const { return gobj() != nullptr; } - bool operator!() const { return gobj() == nullptr; } - - template - bool operator==(X* other) const - { - return gobj() == other; - } - - template - bool operator==(const gref_ptr& other) const - { - return gobj() == other.gobj(); - } - - template - bool operator!=(const X& anything) const - { - return !(*this == anything); - } - - gref_ptr(const gref_ptr& other) - : gref_ptr(other.gobj(), ref_transfer::make_copy) - { - } - - gref_ptr(gref_ptr&& other) - : gref_ptr() - { - this->m_p = other.m_p; - other.m_p = nullptr; - } - - gref_ptr& operator=(const gref_ptr& other) - { - assign(other.gobj(), ref_transfer::make_copy); - return *this; - } - - // Pointer assignment is easy to misuse - template - gref_ptr& operator=(T* p) = delete; - - gref_ptr& operator=(gref_ptr&& other) - { - if (gobj() != other.gobj()) - { - assign(other.m_p, ref_transfer::take_ownership); - other.m_p = nullptr; - } - - return *this; - } - -private: - void assign(Object* obj, ref_transfer policy) - { - if (gobj() != obj) - { - Object* tmp = gobj(); - m_p = obj; - if (obj && (policy == ref_transfer::make_copy)) - ObjRefUnref::ref(obj); - if (tmp) - ObjRefUnref::unref(tmp); - } - } - -private: - // This must be a raw pointer, so that zero-initialized gref_ptr is a valid null pointer - Object* m_p; -}; - -// Make sure these aren't called in code ported from pure glib C -template -void g_object_unref(const gref_ptr&) = delete; -template -void g_free(const gref_ptr&) = delete; - -} // namespace moo - -#endif // __cplusplus diff --git a/moo/gpp/strutils.cpp b/moo/gpp/strutils.cpp deleted file mode 100644 index 9d40d5f5..00000000 --- a/moo/gpp/strutils.cpp +++ /dev/null @@ -1,562 +0,0 @@ -/* - * moogpp/strutils.cpp - * - * Copyright (C) 2004-2015 by Yevgen Muntyan - * - * This file is part of medit. medit 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. - * - * You should have received a copy of the GNU Lesser General Public - * License along with medit. If not, see . - */ - -#include "moogpp/strutils.h" -#include - -using namespace g; - -static bool str_equal(const char* s1, const char* s2) -{ - if (!s1 || !*s1) - return !s2 || !*s2; - else if (!s2) - return false; - else - return strcmp(s1, s2) == 0; -} - -bool g::operator==(const gstr& s1, const char* s2) -{ - return str_equal(s1, s2); -} - -bool g::operator==(const char* s1, const gstr& s2) -{ - return str_equal(s1, s2); -} - -bool g::operator==(const gstr& s1, const gstr& s2) -{ - return str_equal(s1, s2); -} - -bool g::operator!=(const gstr& s1, const gstr& s2) -{ - return !(s1 == s2); -} - -bool g::operator!=(const gstr& s1, const char* s2) -{ - return !(s1 == s2); -} - -bool g::operator!=(const char* s1, const gstr& s2) -{ - return !(s1 == s2); -} - - -class StringData -{ -public: - StringData(const char* s) - : m_p(g_strdup(s)) - , m_ref(1) - { - } - - ~StringData() - { - ::g_free(m_p); - } - - StringData(const StringData&) = delete; - StringData& operator=(const StringData&) = delete; - - char* get() const - { - return m_p; - } - - char* release() - { - char* ret = m_p; - m_p = nullptr; - return ret; - } - - void ref() - { - g_atomic_int_inc(&m_ref); - } - - void unref() - { - if (g_atomic_int_dec_and_test(&m_ref)) - delete this; - } - - int ref_count() const - { - return g_atomic_int_get(&m_ref); - } - -private: - char* m_p; - int m_ref; -}; - -const gstr gstr::null; - -gstr::gstr() - : m_p(nullptr) - , m_is_inline(true) - , m_is_const(true) -{ -} - -gstr::gstr(const char* s, mem_transfer mt) - : gstr() -{ - if (s == nullptr) - return; - - if (*s == 0) - { - if (mt == mem_transfer::take_ownership) - ::g_free(const_cast(s)); - - mt = mem_transfer::borrow; - s = ""; - } - - switch (mt) - { - case mem_transfer::borrow: - m_is_const = true; - m_is_inline = true; - m_p = const_cast(s); - break; - - case mem_transfer::make_copy: - m_is_const = false; - m_is_inline = true; - m_p = g_strdup(s); - break; - - case mem_transfer::take_ownership: - m_is_const = false; - m_is_inline = true; - m_p = const_cast(s); - break; - } -} - -gstr::gstr(const gstr& other) - : gstr() -{ - if (other.m_p == nullptr) - return; - - if (other.m_is_const) - { - g_assert(other.m_is_inline); - m_p = other.m_p; - m_is_const = true; - m_is_inline = true; - } - else - { - g_assert(other.m_p != nullptr); - g_assert(!other.m_is_const); - - StringData* d; - - if (other.m_is_inline) - { - d = new StringData(static_cast(other)); - } - else - { - d = reinterpret_cast(other.m_p); - d->ref(); - } - - m_p = d; - m_is_inline = false; - m_is_const = false; - } -} - -gstr& gstr::operator=(const gstr& other) -{ - if (this != &other) - { - gstr tmp(other); - *this = std::move(tmp); - } - - return *this; -} - -gstr::gstr(gstr&& other) - : gstr() -{ - *this = std::move(other); -} - -gstr& gstr::operator=(gstr&& other) -{ - std::swap(m_is_const, other.m_is_const); - std::swap(m_is_inline, other.m_is_inline); - std::swap(m_p, other.m_p); - return *this; -} - -gstr::gstr(gstrp&& s) - : gstr(s.release(), mem_transfer::take_ownership) -{ -} - -gstr& gstr::operator= (gstrp&& s) -{ - set_new (s.release ()); - return *this; -} - -gstr::~gstr() -{ - clear(); -} - -bool gstr::is_null() const -{ - bool ret = (m_p == nullptr); - g_assert(!ret || m_is_const == true); - g_assert(!ret || m_is_inline == true); - return ret; -} - -gstr::operator const char*() const -{ - if (m_is_inline) - return reinterpret_cast(m_p); - else - return reinterpret_cast(m_p)->get(); -} - -void gstr::assign(const char* s, mem_transfer mt) -{ - gstr tmp(s, mt); - *this = std::move(tmp); -} - -void gstr::clear() -{ - if (m_p == nullptr) - return; - - if (!m_is_const) - { - g_assert(m_p != nullptr); - - if (m_is_inline) - ::g_free(m_p); - else - reinterpret_cast(m_p)->unref(); - - m_is_const = true; - } - - m_is_inline = true; - m_p = nullptr; -} - -char* gstr::get_mutable() -{ - if (!m_p) - { - return nullptr; - } - else if (m_is_const) - { - char* s = reinterpret_cast(m_p); - - if (*s != 0) - { - set(s); - g_assert(!m_is_const); - g_assert(m_is_inline); - } - - return reinterpret_cast(m_p); - } - else if (m_is_inline) - { - return reinterpret_cast(m_p); - } - else - { - StringData* d = reinterpret_cast(m_p); - g_assert(d->get() && *d->get()); - - if (d->ref_count() == 1) - { - return d->get(); - } - else - { - m_p = g_strdup(d->get()); - m_is_inline = true; - return reinterpret_cast(m_p); - } - } -} - -char* gstr::release_owned() -{ - if (m_p == nullptr) - { - return nullptr; - } - else if (m_is_const) - { - return g_strdup(get()); - } - else if (m_is_inline) - { - m_is_const = true; - char* p = reinterpret_cast(m_p); - m_p = nullptr; - return p; - } - - StringData* d = reinterpret_cast(m_p); - g_assert(d->get() && *d->get()); - - char* p = d->ref_count() == 1 ? d->release() : g_strdup(d->get()); - - d->unref(); - - m_p = nullptr; - m_is_const = true; - m_is_inline = true; - return p; -} - -gstr gstr::vprintf(const char* format, va_list args) -{ - return gstr::wrap_new(g_strdup_vprintf(format, args)); -} - - -size_t std::hash::operator()(const g::gstr& s) const -{ - return g_str_hash (s.is_null () ? "" : s.get ()); -} - - -gstrvec g::convert(gstrv v) -{ - char** pv = v.release(); - - gstrvec ret; - ret.reserve(g_strv_length(pv)); - - for (gsize i = 0, c = ret.size(); i < c; ++i) - ret.emplace_back(gstr::wrap_new(pv[i])); - - ::g_free(pv); - return ret; -} - - -gstrv gstrv::convert(gstrvec v) -{ - const gsize c = v.size(); - char **p = g_new (char*, c + 1); - for (gsize i = 0; i < c; ++i) - p[i] = v[i].release_owned(); - p[c] = nullptr; - return p; -} - - -strbuilder::strbuilder(const char *init, gssize len) - : m_buf(nullptr) - , m_result(nullptr) -{ - if (init != nullptr) - m_buf = g_string_new_len(init, len); - else if (len > 0) - m_buf = g_string_sized_new(len); - else - m_buf = g_string_new(nullptr); -} - -strbuilder::strbuilder(gsize reserve) - : strbuilder(nullptr, reserve) -{ -} - -strbuilder::~strbuilder() -{ - if (m_buf) - g_string_free (m_buf, true); -} - -gstr strbuilder::release() -{ - if (m_result) - { - return gstr::wrap_new(m_result.release()); - } - else if (m_buf) - { - gstr s = gstr::wrap_new(g_string_free(m_buf, false)); - m_buf = nullptr; - return s; - } - else - { - g_return_val_if_reached(gstr::null); - } -} - -const char* strbuilder::get() const -{ - if (m_buf) - { - m_result.set_new (g_string_free (m_buf, false)); - m_buf = nullptr; - } - - g_return_val_if_fail(m_result, nullptr); - return m_result; -} - -void strbuilder::truncate(gsize len) -{ - g_return_if_fail(m_buf); - g_string_truncate(m_buf, len); -} - -void strbuilder::set_size(gsize len) -{ - g_return_if_fail(m_buf); - g_string_set_size(m_buf, len); -} - -void strbuilder::append(const char* val, gssize len) -{ - g_return_if_fail(m_buf); - g_string_append_len(m_buf, val, len); -} - -void strbuilder::append(const gstrp& val) -{ - append(val.get()); -} - -void strbuilder::append(char c) -{ - g_return_if_fail(m_buf); - g_string_append_c(m_buf, c); -} - -void strbuilder::append(gunichar wc) -{ - g_return_if_fail(m_buf); - g_string_append_unichar(m_buf, wc); -} - -void strbuilder::prepend(const char* val, gssize len) -{ - g_return_if_fail(m_buf); - g_string_prepend_len(m_buf, val, len); -} - -void strbuilder::prepend(const gstrp& val) -{ - prepend(val.get()); -} - -void strbuilder::prepend(char c) -{ - g_return_if_fail(m_buf); - g_string_prepend_c(m_buf, c); -} - -void strbuilder::prepend(gunichar wc) -{ - g_return_if_fail(m_buf); - g_string_prepend_unichar(m_buf, wc); -} - -void strbuilder::insert(gssize pos, const char* val, gssize len) -{ - g_return_if_fail(m_buf); - g_string_insert_len(m_buf, pos, val, len); -} - -void strbuilder::insert(gssize pos, const gstrp& val) -{ - insert(pos, val.get()); -} - -void strbuilder::insert(gssize pos, char c) -{ - g_return_if_fail(m_buf); - g_string_insert_c(m_buf, pos, c); -} - -void strbuilder::insert(gssize pos, gunichar wc) -{ - g_return_if_fail(m_buf); - g_string_insert_c(m_buf, pos, wc); -} - -void strbuilder::overwrite(gsize pos, const char* val, gssize len) -{ - g_return_if_fail(m_buf); - g_string_overwrite_len(m_buf, pos, val, len); -} - -void strbuilder::erase(gssize pos, gssize len) -{ - g_return_if_fail(m_buf); - g_string_erase(m_buf, pos, len); -} - -void strbuilder::ascii_down() -{ - g_return_if_fail(m_buf); - g_string_ascii_down(m_buf); -} - -void strbuilder::ascii_up() -{ - g_return_if_fail(m_buf); - g_string_ascii_up(m_buf); -} - -void strbuilder::vprintf(const char* format, va_list args) -{ - g_return_if_fail(m_buf); - g_string_vprintf(m_buf, format, args); -} - -void strbuilder::append_vprintf(const char* format, va_list args) -{ - g_return_if_fail(m_buf); - g_string_append_vprintf(m_buf, format, args); -} - -void strbuilder::append_uri_escaped(const char* unescaped, const char* reserved_chars_allowed, bool allow_utf8) -{ - g_return_if_fail(m_buf); - g_string_append_uri_escaped(m_buf, unescaped, reserved_chars_allowed, allow_utf8); -} diff --git a/moo/gpp/strutils.h b/moo/gpp/strutils.h deleted file mode 100644 index 6b353080..00000000 --- a/moo/gpp/strutils.h +++ /dev/null @@ -1,415 +0,0 @@ -/* - * moogpp/strutils.h - * - * Copyright (C) 2004-2016 by Yevgen Muntyan - * - * This file is part of medit. medit 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. - * - * You should have received a copy of the GNU Lesser General Public - * License along with medit. If not, see . - */ - -#pragma once - -#ifndef __cplusplus -#error "This is a C++ header" -#endif - -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -namespace g { - -class gstr; -class gstrp; - -// Replacement for raw char* -class gstrp : public gbuf -{ -public: - explicit gstrp(char* p = nullptr) : gbuf(p) {} - - gstrp(gstrp&& s) : gbuf(std::move(s)) {} - gstrp& operator=(gstrp&& s) { static_cast&>(*this) = std::move(s); return *this; } - - char*& p() { return _get(); } - char** pp() { return &_get(); } - - gstrp(const gstrp&) = delete; - gstrp& operator=(const gstrp&) = delete; - - bool operator==(const char* p) const { return get() == p; } - bool operator!=(const char* p) const { return get() != p; } -}; - -struct printf_helper -{ - template - struct is_valid_arg - { - static const bool value = true; - }; - - template - struct is_valid_arg - { - static_assert(std::is_trivial::type>::value, "An object passed to a printf-like function"); - static const bool value = - std::is_trivial::type>::value - && is_valid_arg::value; - }; - - template - static const T& transform_printf_arg (const T& arg); - static const char* transform_printf_arg(const gstr& s); - static const char* transform_printf_arg(const gstrp& s); - - // gcc seems to actually evaluate what's inside decltype(), and it can't cope with literals or va_list() - static const char* dummy_format_string; - static va_list dummy_va_list; - - template - static auto call (const Func& func, const char* format, Args&& ...args) -> decltype(func(dummy_format_string)) - { - g_assert (printf_helper::is_valid_arg (args)))...>::value); - return func(format, printf_helper::transform_printf_arg (std::forward (args))...); - } - - template - static auto callv (const Func& func, const char* format, Args&& ...args) -> decltype(func(dummy_format_string, dummy_va_list)) - { - g_assert (printf_helper::is_valid_arg (args)))...>::value); - return call_helper (func, format, printf_helper::transform_printf_arg (std::forward (args))...); - } - - template - static void call_void (const Func& func, const char* format, Args&& ...args) - { - g_assert (printf_helper::is_valid_arg (args)))...>::value); - func (format, printf_helper::transform_printf_arg (std::forward (args))...); - } - - template - static void callv_void (const Func& func, const char* format, Args&& ...args) - { - g_assert (printf_helper::is_valid_arg (args)))...>::value); - call_helper_void (func, format, printf_helper::transform_printf_arg (std::forward (args))...); - } - -private: - template - static auto call_helper (const Func& func, const char* format, ...) -> decltype(func(dummy_format_string, dummy_va_list)) - { - va_list args; - va_start(args, format); - auto ret = func(format, args); - va_end(args); - return ret; - } - - template - static void call_helper_void (const Func& func, const char* format, ...) - { - va_list args; - va_start (args, format); - func (format, args); - va_end (args); - } -}; - -class gstr -{ -public: - gstr(); - ~gstr(); - gstr(const char* s, mem_transfer mt); - gstr(gstrp&& s); - - static const gstr null; - - gstr(const gstr&); - gstr& operator=(const gstr&); - gstr(gstr&&); - gstr& operator=(gstr&&); - gstr& operator=(gstrp&&); - - gstr(nullptr_t) : gstr() {} - gstr& operator=(nullptr_t) { clear(); return *this; } - - gstr(const gstr&, mem_transfer) = delete; - void set(const gstr& s) = delete; - void set_const(const gstr& s) = delete; - void set_new(const gstr& s) = delete; - static gstr wrap(const gstr& s) = delete; - static gstr wrap_const(const gstr& s) = delete; - static gstr wrap_new(const gstr& s) = delete; - - void set(const char *s) { assign(s, mem_transfer::make_copy); } - void set_new(char *s) { assign(s, mem_transfer::take_ownership); } - void set_const(const char *s) { assign(s, mem_transfer::borrow); } - static gstr wrap(const char *s) { return gstr(s, mem_transfer::make_copy); } - static gstr wrap_new(char *s) { return gstr(s, mem_transfer::take_ownership); } - static gstr wrap_const(const char *s) { return gstr(s, mem_transfer::borrow); } - - bool is_null() const; - - operator const char*() const; - const char* get() const { return static_cast(*this); } - const char* get_non_null() const { return is_null() ? "" : get(); } - - char* get_mutable(); - char* release_owned(); - void clear(); - void reset() { clear(); } - - char *strdup() const { return g_strdup(*this); } - bool empty() const { const char* s = *this; return !s || !*s; } - - // These must not be called, to avoid ambiguity between an empty string and null - operator bool() const = delete; - bool operator!() const = delete; - - static gstr vprintf(const char* format, va_list args) G_GNUC_PRINTF(1, 0); - - template - static gstr printf(const char* format, Args&& ...args) - { - return wrap_new (printf_helper::callv (g_strdup_vprintf, format, std::forward (args)...)); - } - - template - void set_printf (const char* format, Args&& ...args) - { - set_new (printf_helper::callv (g_strdup_vprintf, format, std::forward (args)...)); - } - -private: - void assign(const char* s, mem_transfer mt); - -private: - void *m_p; // either char* or Data* - bool m_is_inline; - bool m_is_const; -}; - - -template -inline const T& printf_helper::transform_printf_arg (const T& arg) -{ - g_assert (is_valid_arg::value); - return arg; -} - -inline const char* printf_helper::transform_printf_arg(const gstr& s) -{ - return s.get (); -} - -inline const char* printf_helper::transform_printf_arg(const gstrp& s) -{ - return s.get (); -} - - -using gstrvec = std::vector; -using gstrset = std::unordered_set; -using gstrmap = std::unordered_map; - - -bool operator==(const gstr& s1, const char* s2); -bool operator==(const char* s1, const gstr& s2); -bool operator==(const gstr& s1, const gstr& s2); -bool operator!=(const gstr& s1, const char* s2); -bool operator!=(const char* s1, const gstr& s2); -bool operator!=(const gstr& s1, const gstr& s2); -bool operator==(const gstr&, nullptr_t) = delete; -bool operator==(nullptr_t, const gstr&) = delete; - - -class strv -{ -public: - strv(char** p = nullptr) : m_p(p) {} - ~strv() { ::g_strfreev(m_p); } - - void set(char** p) { if (m_p != p) { ::g_strfreev(m_p); m_p = p; } } - void reset(char** p = nullptr) { set(p); } - char** get() const { return m_p; } - - static strv convert(gstrvec v); - - gsize size() const { return m_p ? g_strv_length (m_p) : 0; } - - operator char**() const = delete; - char*** operator&() = delete; - - char** release() { char** p = m_p; m_p = nullptr; return p; } - - const char* operator[] (gsize i) const { return m_p[i]; } - - strv(const strv&) = delete; - strv& operator=(const strv&) = delete; - - strv(strv&& other) : strv() { *this = std::move(other); } - strv& operator=(strv&& other) { std::swap(m_p, other.m_p); return *this; } - - strv& operator=(char** p) { set(p); return *this; } - - bool operator==(nullptr_t) const { return m_p == nullptr; } - bool operator!=(nullptr_t) const { return m_p != nullptr; } - operator bool() const { return m_p != nullptr; } - bool operator !() const { return m_p == nullptr; } - -private: - char** m_p; -}; - -gstrvec convert(strv v); - -class gerrp -{ -public: - explicit gerrp(GError** errp = nullptr) : m_errp(errp ? errp : &m_local), m_local(nullptr) {} - - ~gerrp() - { - if (m_errp != &m_local) - clear(); - } - - operator bool() const { return (*m_errp) != nullptr; } - bool operator!() const { return (*m_errp) == nullptr; } - - GError* get() const { return (*m_errp); } - GError* operator->() const { return (*m_errp); } - GError** operator&() { return m_errp; } - - //void propagate(GError** dest) { g_propagate_error(dest, m_err); m_err = nullptr; } - void clear() { if (*m_errp) g_error_free(*m_errp); *m_errp = nullptr; m_local = nullptr; } - - gerrp(const gerrp&) = delete; - gerrp& operator=(const gerrp&) = delete; - - gerrp(gerrp&& other) = delete; - - gerrp& operator=(gerrp&& other) - { - clear(); - if (other) - g_propagate_error (m_errp, other.get()); - other.m_errp = &other.m_local; - other.m_local = nullptr; - return *this; - } - -private: - GError** m_errp; - GError* m_local; -}; - - -class strbuilder -{ -public: - strbuilder(const char *init = nullptr, gssize len = -1); - strbuilder(gsize reserve); - ~strbuilder(); - - gstr release(); - const char* get() const; - - strbuilder(const strbuilder&) = delete; - strbuilder& operator=(const strbuilder&) = delete; - - void truncate(gsize len); - void set_size(gsize len); - void append(const char* val, gssize len = -1); - void append(const gstrp& val); - void append(char c); - void append(gunichar wc); - void prepend(const char* val, gssize len = -1); - void prepend(const gstrp& val); - void prepend(char c); - void prepend(gunichar wc); - void insert(gssize pos, const char* val, gssize len = -1); - void insert(gssize pos, const gstrp& val); - void insert(gssize pos, char c); - void insert(gssize pos, gunichar wc); - void overwrite(gsize pos, const char* val, gssize len = -1); - void erase(gssize pos = 0, gssize len = -1); - void ascii_down(); - void ascii_up(); - void vprintf(const char* format, va_list args); - void append_vprintf(const char* format, va_list args); - void append_uri_escaped(const char* unescaped, const char* reserved_chars_allowed = nullptr, bool allow_utf8 = false); - - template - void printf (const char* format, Args&& ...args) - { - g_return_if_fail (m_buf); - printf_helper::callv_void ([&] (const char* format, va_list args) { g_string_vprintf (m_buf, format, args); }, - format, std::forward (args)...); - } - - template - void append_printf (const char* format, Args&& ...args) - { - g_return_if_fail (m_buf); - printf_helper::callv_void ([&] (const char* format, va_list args) { g_string_append_vprintf (m_buf, format, args); }, - format, std::forward(args)...); - } - -private: - mutable GString* m_buf; - mutable gstrp m_result; -}; - -//gstrvec convert(strv v); - -void g_free(const gstr&) = delete; -void g_free(const gstrp&) = delete; -void g_free(const strv&) = delete; -void g_strfreev(const strv&) = delete; - -} // namespace g - -namespace std { - -template<> -struct hash<::g::gstr> -{ - size_t operator()(const ::g::gstr& s) const; -}; - -} // namespace std - -template -inline void moo_g_print(const char* format, Args&& ...args) -{ - static_assert(g::printf_helper::is_valid_arg::value, "Passed an object to g_strdup_printf"); - g_print (format, std::forward (args)...); -} - -template -inline char* moo_g_strdup_printf (const char* format, Args&& ...args) -{ - static_assert(g::printf_helper::is_valid_arg::value, "Passed an object to g_strdup_printf"); - return g_strdup_printf (format, std::forward (args)...); -} - -#undef g_strdup_printf -#undef g_print -#define g_strdup_printf moo_g_strdup_printf -#define g_print moo_g_print diff --git a/moo/gtksourceview/gtksourcecontextengine.c b/moo/gtksourceview/gtksourcecontextengine.c index afee4000..7fcb39cb 100644 --- a/moo/gtksourceview/gtksourcecontextengine.c +++ b/moo/gtksourceview/gtksourcecontextengine.c @@ -2079,6 +2079,8 @@ idle_worker (GtkSourceContextEngine *ce) g_return_val_if_fail (ce->priv->buffer != NULL, FALSE); + gdk_threads_enter (); + /* analyze batch of text */ update_syntax (ce, NULL, INCREMENTAL_UPDATE_TIME_SLICE); CHECK_TREE (ce); @@ -2089,6 +2091,8 @@ idle_worker (GtkSourceContextEngine *ce) retval = FALSE; } + gdk_threads_leave (); + return retval; } @@ -2105,6 +2109,8 @@ first_update_callback (GtkSourceContextEngine *ce) { g_return_val_if_fail (ce->priv->buffer != NULL, FALSE); + gdk_threads_enter (); + /* analyze batch of text */ update_syntax (ce, NULL, FIRST_UPDATE_TIME_SLICE); CHECK_TREE (ce); @@ -2114,6 +2120,8 @@ first_update_callback (GtkSourceContextEngine *ce) if (!all_analyzed (ce)) install_idle_worker (ce); + gdk_threads_leave (); + return FALSE; } diff --git a/moo/gtksourceview/gtksourcestylescheme.c b/moo/gtksourceview/gtksourcestylescheme.c index 3b7d10d3..3cc21b25 100644 --- a/moo/gtksourceview/gtksourcestylescheme.c +++ b/moo/gtksourceview/gtksourcestylescheme.c @@ -692,7 +692,7 @@ apply_cursor_style (GtkSourceStyleScheme *scheme, if (primary != NULL && secondary == NULL) { - secondary_color = gtk_widget_get_style(widget)->base[GTK_STATE_NORMAL]; + secondary_color = widget->style->base[GTK_STATE_NORMAL]; secondary_color.red = ((gint) secondary_color.red + primary->red) / 2; secondary_color.green = ((gint) secondary_color.green + primary->green) / 2; secondary_color.blue = ((gint) secondary_color.blue + primary->blue) / 2; diff --git a/moo/medit-app/Makefile.incl b/moo/medit-app/Makefile.incl index b79a4ab5..a52f2893 100644 --- a/moo/medit-app/Makefile.incl +++ b/moo/medit-app/Makefile.incl @@ -39,7 +39,7 @@ medit_SOURCES = \ medit-app/mem-debug.h \ medit-app/run-tests.h \ medit-app/parse.h \ - medit-app/main.cpp \ + medit-app/main.c \ $(moo_sources) \ $(plugins_sources) diff --git a/moo/medit-app/main.cpp b/moo/medit-app/main.c similarity index 80% rename from moo/medit-app/main.cpp rename to moo/medit-app/main.c index a81878f8..9b29453b 100644 --- a/moo/medit-app/main.cpp +++ b/moo/medit-app/main.c @@ -1,7 +1,7 @@ /* - * main.cpp + * medit-app.c * - * Copyright (C) 2004-2016 by Yevgen Muntyan + * Copyright (C) 2004-2010 by Yevgen Muntyan * * This file is part of medit. medit is free software; you can * redistribute it and/or modify it under the terms of the @@ -21,7 +21,6 @@ #include "mooutils/mooutils-misc.h" #include "mooutils/mootype-macros.h" #include "plugins/mooplugin-builtin.h" -#include "moocpp/moocpp.h" #include #include #include @@ -31,12 +30,9 @@ #include "run-tests.h" #ifdef GDK_WINDOWING_WIN32 #include -#include #include #endif -using namespace moo; - static struct MeditOpts { int use_session; int pid; @@ -45,6 +41,8 @@ static struct MeditOpts { gboolean new_window; gboolean new_tab; gboolean reload; + const char *project; + gboolean project_mode; int line; const char *encoding; const char *log_file; @@ -68,20 +66,26 @@ static struct MeditOpts { #include "parse.h" -class MeditApp : public App -{ -public: - MeditApp(gobj_wrapper_data& d, const StartupOptions& opts) - : App(d, opts) - { - } +typedef MooApp MeditApp; +typedef MooAppClass MeditAppClass; +MOO_DEFINE_TYPE_STATIC (MeditApp, medit_app, MOO_TYPE_APP) -protected: - void init_plugins() override - { - moo_plugin_init (); - } -}; +static void +medit_app_init_plugins (G_GNUC_UNUSED MooApp *app) +{ + moo_plugin_init (); +} + +static void +medit_app_class_init (MooAppClass *klass) +{ + klass->init_plugins = medit_app_init_plugins; +} + +static void +medit_app_init (G_GNUC_UNUSED MooApp *app) +{ +} static gboolean parse_use_session (const char *option_name, @@ -123,6 +127,10 @@ static GOptionEntry medit_options[] = { /* help message for command line option --new-window */ N_("Open file(s) in a new window"), NULL }, { "new-tab", 't', 0, G_OPTION_ARG_NONE, &medit_opts.new_tab, /* help message for command line option --new-tab */ N_("Open file(s) in a new tab"), NULL }, + { "project", 0, G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_FILENAME, (gpointer) &medit_opts.project, + "Open project file FILE", "FILE" }, + { "project-mode", 0, G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_NONE, &medit_opts.project_mode, + "IDE mode", NULL }, { "line", 'l', 0, G_OPTION_ARG_INT, &medit_opts.line, /* help message for command line option --line=LINE */ N_("Open file and position cursor on line LINE"), /* "LINE" part in --line=LINE */ N_("LINE") }, @@ -173,14 +181,14 @@ check_plus_line_arg (void) char **p; GRegex *re = NULL; - re = g_regex_new ("^\\+(?P\\d+)", G_REGEX_OPTIMIZE | G_REGEX_DUPNAMES, GRegexMatchFlags(0), NULL); + re = g_regex_new ("^\\+(?P\\d+)", G_REGEX_OPTIMIZE | G_REGEX_DUPNAMES, 0, NULL); g_return_if_fail (re != NULL); for (p = medit_opts.files; !done && p && *p && **p; ++p) { GMatchInfo *match_info = NULL; - if (g_regex_match (re, *p, GRegexMatchFlags(0), &match_info)) + if (g_regex_match (re, *p, 0, &match_info)) { int line = 0; char *line_string = g_match_info_fetch_named (match_info, "line"); @@ -251,6 +259,9 @@ post_parse_func (void) if (medit_opts.debug) g_setenv ("MOO_DEBUG", medit_opts.debug, FALSE); + if (medit_opts.project) + medit_opts.project_mode = TRUE; + check_plus_line_arg (); return TRUE; @@ -320,22 +331,53 @@ get_time_stamp (void) #endif } -#ifdef __WIN32__ static void push_appdir_to_path (void) { - gstr appdir = moo_win32_get_app_dir (); - g_return_if_fail (!appdir.empty()); +#ifdef __WIN32__ + char *appdir; + const char *path; + char *new_path; - const char *path = g_getenv ("Path"); - gstr new_path; + appdir = moo_win32_get_app_dir (); + g_return_if_fail (appdir != NULL); + + path = g_getenv ("Path"); if (path) - new_path.set_printf ("%s;%s", appdir, path); + new_path = g_strdup_printf ("%s;%s", appdir, path); else - new_path = std::move (appdir); + new_path = g_strdup (appdir); g_setenv ("Path", new_path, TRUE); + + g_free (new_path); + g_free (appdir); +#endif +} + +#ifdef MOO_ENABLE_PROJECT +static void +project_mode (const char *file) +{ + MooPlugin *plugin; + + plugin = (MooPlugin*) moo_plugin_lookup ("ProjectManager"); + + if (!plugin) + { + fputs ("Could not initialize project manager plugin\n", stderr); + exit (EXIT_FAILURE); + } + + if (file) + { + char *project = moo_filename_from_locale (file); + g_object_set (plugin, "project", project, NULL); + g_free (project); + } + + moo_plugin_set_enabled (plugin, TRUE); } #endif @@ -367,7 +409,7 @@ _moo_get_toplevel_window_at_pointer (void) if (!window) continue; - hwnd = (HWND) GDK_WINDOW_HWND (window); + hwnd = GDK_WINDOW_HWND (window); GetWindowRect(hwnd, &rect); if (IsWindowVisible(hwnd) && PtInRect(&rect, point)) windows = g_slist_prepend (windows, l->data); @@ -384,7 +426,7 @@ _moo_get_toplevel_window_at_pointer (void) static GdkModifierType get_current_mask (void) { - GdkModifierType mask = GdkModifierType(0); + GdkModifierType mask = 0; BYTE kbd[256]; GetKeyboardState (kbd); @@ -418,7 +460,7 @@ get_pointer (GdkWindow *window, GdkWindow *retval = window; GdkWindow *child = NULL; - hwnd = (HWND) GDK_WINDOW_HWND (window); + hwnd = GDK_WINDOW_HWND (window); GetCursorPos (&point); ScreenToClient (hwnd, &point); @@ -427,7 +469,7 @@ get_pointer (GdkWindow *window, hwndc = ChildWindowFromPointEx (hwnd, point, CWP_SKIPINVISIBLE); if (hwndc != NULL && hwndc != hwnd) - child = reinterpret_cast (gdk_win32_handle_table_lookup ((GdkNativeWindow) hwndc)); + child = gdk_win32_handle_table_lookup ((GdkNativeWindow) hwndc); if (child != NULL) retval = child; @@ -541,15 +583,15 @@ hookup_synaptics_touchpad (void) static void unit_test_func (void) { - MooTestOptions opts = MOO_TEST_OPTIONS_NONE; + MooTestOptions opts = 0; int status; if (!medit_opts.ut_uninstalled) opts |= MOO_TEST_INSTALLED; status = unit_tests_main (opts, medit_opts.ut_tests, medit_opts.ut_dir, medit_opts.ut_coverage_file); - App::instance().set_exit_status (status); - App::instance().quit (); + moo_app_set_exit_status (moo_app_instance (), status); + moo_app_quit (moo_app_instance ()); } static void @@ -557,7 +599,7 @@ run_script_func (void) { char **p; for (p = medit_opts.run_script; p && *p; ++p) - App::instance().run_script (*p); + moo_app_run_script (moo_app_instance(), *p); } static void @@ -580,66 +622,79 @@ install_log_handlers (void) static void setup_portable_mode (void) { - gstr appdir = moo_win32_get_app_dir (); - g_return_if_fail (!appdir.empty()); + char *appdir = NULL; + char *share = NULL; + char *datadir = NULL; + char *cachedir = NULL; + char *tmp = NULL; - gstr share = g::build_filename (appdir, "..", "share"); - g_return_if_fail (!share.empty()); + appdir = moo_win32_get_app_dir (); + g_return_if_fail (appdir != NULL); - gstr datadir; - gstr cachedir; + share = g_build_filename (appdir, "..", "share", NULL); + g_return_if_fail (share != NULL); if (g_file_test (share, G_FILE_TEST_IS_DIR)) { - datadir = g::build_filename (share, MEDIT_PORTABLE_DATA_DIR); - cachedir = g::build_filename (share, MEDIT_PORTABLE_CACHE_DIR); + datadir = g_build_filename (share, MEDIT_PORTABLE_DATA_DIR, NULL); + cachedir = g_build_filename (share, MEDIT_PORTABLE_CACHE_DIR, NULL); } else { - datadir = g::build_filename (appdir, MEDIT_PORTABLE_DATA_DIR); - cachedir = g::build_filename (appdir, MEDIT_PORTABLE_CACHE_DIR); + datadir = g_build_filename (appdir, MEDIT_PORTABLE_DATA_DIR, NULL); + cachedir = g_build_filename (appdir, MEDIT_PORTABLE_CACHE_DIR, NULL); } - g_return_if_fail (!datadir.empty() && !cachedir.empty()); - - gstr tmp = _moo_normalize_file_path (datadir); + g_return_if_fail (datadir != NULL && cachedir != NULL); + + tmp = _moo_normalize_file_path (datadir); moo_set_user_data_dir (tmp); + g_free (tmp); + tmp = NULL; tmp = _moo_normalize_file_path (cachedir); moo_set_user_cache_dir (tmp); + g_free (tmp); + tmp = NULL; + + g_free (cachedir); + g_free (datadir); + g_free (share); + g_free (appdir); } static void check_portable_mode (void) { - bool portable = medit_opts.portable; + gboolean portable = FALSE; + char *appdir = NULL; + char *magic_file = NULL; + + if (medit_opts.portable) + portable = TRUE; if (!portable) { - gstr appdir = moo_win32_get_app_dir (); - g_return_if_fail (!appdir.empty()); - gstr magic_file = g::build_filename (appdir, MEDIT_PORTABLE_MAGIC_FILE_NAME); - g_return_if_fail (!magic_file.empty()); + appdir = moo_win32_get_app_dir (); + g_return_if_fail (appdir != NULL); + magic_file = g_build_filename (appdir, MEDIT_PORTABLE_MAGIC_FILE_NAME, NULL); + g_return_if_fail (magic_file != NULL); if (g_file_test (magic_file, G_FILE_TEST_EXISTS)) portable = TRUE; } if (portable) setup_portable_mode (); + + g_free (magic_file); + g_free (appdir); } #endif // __WIN32__ -namespace moo -{ -namespace _test -{ -void test(); -} -} - static int medit_main (int argc, char *argv[]) { + MooApp *app = NULL; MooEditor *editor; int retval; gboolean new_instance = FALSE; @@ -650,12 +705,10 @@ medit_main (int argc, char *argv[]) GOptionContext *ctx; MooOpenInfoArray *files; -#ifdef __WIN32__ - CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE); -#endif // __WIN32__ - init_mem_stuff (); - moo_thread_init (); +#if !GLIB_CHECK_VERSION(2,32,0) + g_thread_init (NULL); +#endif g_set_prgname ("medit"); ctx = parse_args (argc, argv); @@ -678,11 +731,11 @@ medit_main (int argc, char *argv[]) check_portable_mode (); #endif - if (medit_opts.new_app) + if (medit_opts.new_app || medit_opts.project_mode) new_instance = TRUE; run_input = !medit_opts.new_app || medit_opts.instance_name || - medit_opts.use_session == 1; + medit_opts.use_session == 1 || medit_opts.project_mode; if (medit_opts.ut) { @@ -711,7 +764,7 @@ medit_main (int argc, char *argv[]) { GString *msg = g_string_new ("e"); g_string_append (msg, *p); - App::send_msg (name, msg->str, msg->len + 1); + moo_app_send_msg (name, msg->str, msg->len + 1); } notify_startup_complete (); exit (0); @@ -721,7 +774,7 @@ medit_main (int argc, char *argv[]) if (name) { - if (App::send_files (files, stamp, name)) + if (moo_app_send_files (files, stamp, name)) exit (0); if (!medit_opts.instance_name) @@ -732,59 +785,67 @@ medit_main (int argc, char *argv[]) } if (!new_instance && !medit_opts.instance_name && - App::send_files (files, stamp, NULL)) + moo_app_send_files (files, stamp, NULL)) { notify_startup_complete (); exit (0); } -#ifdef __WIN32__ push_appdir_to_path (); -#endif gtk_init (NULL, NULL); + gdk_threads_init (); + gdk_threads_enter (); install_log_handlers (); - MeditApp::StartupOptions sopts; - sopts.run_input = run_input; - sopts.use_session = medit_opts.use_session; - sopts.instance_name.set(medit_opts.instance_name); - gref_ptr app = MeditApp::create(sopts); + app = MOO_APP (g_object_new (medit_app_get_type (), + "run-input", run_input, + "use-session", medit_opts.use_session, + "instance-name", medit_opts.instance_name, + (const char*) NULL)); - if (!app->init()) + if (!moo_app_init (app)) { gdk_notify_startup_complete (); - return EXIT_FAILURE; + g_object_unref (app); + exit (EXIT_FAILURE); } - //moo::_test::test (); - if (medit_opts.geometry && *medit_opts.geometry) moo_window_set_default_geometry (medit_opts.geometry); - app->load_session (); + if (medit_opts.project_mode) +#ifdef MOO_ENABLE_PROJECT + project_mode (medit_opts.project); +#else + { + fputs ("medit was built without project support\n", stderr); + exit (EXIT_FAILURE); + } +#endif + else + moo_app_load_session (app); - editor = app->get_editor (); + editor = moo_app_get_editor (app); if (!moo_editor_get_active_window (editor)) moo_editor_new_window (editor); if (files) - app->open_files (files, stamp); + moo_app_open_files (app, files, stamp); moo_open_info_array_free (files); g_option_context_free (ctx); if (medit_opts.ut) - app->connect ("started", G_CALLBACK (unit_test_func), NULL); + g_signal_connect (app, "started", G_CALLBACK (unit_test_func), NULL); if (medit_opts.run_script) - app->connect ("started", G_CALLBACK (run_script_func), NULL); + g_signal_connect (app, "started", G_CALLBACK (run_script_func), NULL); - retval = app->run (); + retval = moo_app_run (app); + gdk_threads_leave (); -#ifdef __WIN32__ - CoUninitialize(); -#endif // __WIN32__ + g_object_unref (app); return retval; } diff --git a/moo/medit-app/medit-app.cmake b/moo/medit-app/medit-app.cmake index 8f9524a5..4419e0e6 100644 --- a/moo/medit-app/medit-app.cmake +++ b/moo/medit-app/medit-app.cmake @@ -1,16 +1,16 @@ -set(medit_app_sources - medit-app/medit-app.cmake - medit-app/mem-debug.h - medit-app/run-tests.h - medit-app/parse.h - medit-app/main.cpp -) - -set(built_medit_app_sources) - -if(MOO_OS_WIN32) - set(top_srcdir ${CMAKE_SOURCE_DIR}) - configure_file(${CMAKE_CURRENT_SOURCE_DIR}/medit-app/medit.rc.in ${CMAKE_CURRENT_BINARY_DIR}/medit-app/medit.rc) - list(APPEND built_medit_app_sources ${CMAKE_CURRENT_BINARY_DIR}/medit-app/medit.rc) - list(APPEND medit_app_sources ${CMAKE_CURRENT_SOURCE_DIR}/medit-app/medit.rc.in) -endif() +set(medit_app_sources + medit-app/medit-app.cmake + medit-app/mem-debug.h + medit-app/run-tests.h + medit-app/parse.h + medit-app/main.c +) + +set(built_medit_app_sources) + +if(MOO_OS_WIN32) + set(top_srcdir ${CMAKE_SOURCE_DIR}) + configure_file(${CMAKE_CURRENT_SOURCE_DIR}/medit-app/medit.rc.in ${CMAKE_CURRENT_BINARY_DIR}/medit-app/medit.rc) + list(APPEND built_medit_app_sources ${CMAKE_CURRENT_BINARY_DIR}/medit-app/medit.rc) + list(APPEND medit_app_sources ${CMAKE_CURRENT_SOURCE_DIR}/medit-app/medit.rc.in) +endif() diff --git a/moo/medit-app/parse.h b/moo/medit-app/parse.h index edca6e19..fc80df71 100644 --- a/moo/medit-app/parse.h +++ b/moo/medit-app/parse.h @@ -1,6 +1,5 @@ #include #include -#include "moocpp/moocpp.h" static MooOpenInfo * parse_filename (const char *filename) @@ -29,7 +28,7 @@ parse_filename (const char *filename) { GError *error = NULL; GRegex *re = g_regex_new ("((?P.*):(?P\\d+)?|(?P.*)\\((?P\\d+)\\))$", - G_REGEX_OPTIMIZE | G_REGEX_DUPNAMES, GRegexMatchFlags(0), &error); + G_REGEX_OPTIMIZE | G_REGEX_DUPNAMES, 0, &error); if (!re) { g_critical ("could not compile regex: %s", error->message); @@ -39,7 +38,7 @@ parse_filename (const char *filename) { GMatchInfo *match_info = NULL; - if (g_regex_match (re, filename, GRegexMatchFlags(0), &match_info)) + if (g_regex_match (re, filename, 0, &match_info)) { char *path = g_match_info_fetch_named (match_info, "path"); char *line_string = g_match_info_fetch_named (match_info, "line"); @@ -73,7 +72,7 @@ parse_filename (const char *filename) return NULL; } - info = moo_open_info_new_uri (uri, NULL, line - 1, MOO_OPEN_FLAGS_NONE); + info = moo_open_info_new_uri (uri, NULL, line - 1, 0); g_free (uri); g_free (freeme1); @@ -124,7 +123,7 @@ parse_uri (const char *scheme, char *real_uri; if (strcmp (scheme, "file") != 0) - return moo_open_info_new_uri (uri, NULL, -1, MOO_OPEN_FLAGS_NONE); + return moo_open_info_new_uri (uri, NULL, -1, 0); question_mark = strchr (uri, '?'); @@ -138,7 +137,7 @@ parse_uri (const char *scheme, real_uri = g_strdup (uri); } - info = moo_open_info_new_uri (real_uri, NULL, -1, MOO_OPEN_FLAGS_NONE); + info = moo_open_info_new_uri (real_uri, NULL, -1, 0); if (optstring) parse_options_from_uri (optstring, info); diff --git a/moo/moo-config.h b/moo/moo-config.h index 3c39ea9b..e5148c80 100644 --- a/moo/moo-config.h +++ b/moo/moo-config.h @@ -1,9 +1,5 @@ -#pragma once - -#if (defined(DEBUG) && ((!DEBUG) || !(MOO_DEBUG) || !(ENABLE_DEBUG))) || \ - (!defined(DEBUG) && (defined(MOO_DEBUG) || defined(ENABLE_DEBUG))) -# error "DEBUG, MOO_DEBUG, and ENABLE_DEBUG must either be all defined to non-zero or all undefined" -#endif +#ifndef MOO_CONFIG_H +#define MOO_CONFIG_H #undef MOO_CL_GCC #undef MOO_CL_MINGW @@ -63,3 +59,5 @@ # define MOO_CDECL __cdecl # define MOO_STDCALL __stdcall #endif + +#endif /* MOO_CONFIG_H */ diff --git a/moo/moo-pch.c b/moo/moo-pch.c deleted file mode 100644 index 62496c51..00000000 --- a/moo/moo-pch.c +++ /dev/null @@ -1 +0,0 @@ -#include "moo-pch.h" diff --git a/moo/moo-pch.cpp b/moo/moo-pch.cpp deleted file mode 100644 index 62496c51..00000000 --- a/moo/moo-pch.cpp +++ /dev/null @@ -1 +0,0 @@ -#include "moo-pch.h" diff --git a/moo/moo-pch.h b/moo/moo-pch.h deleted file mode 100644 index 7aa2429b..00000000 --- a/moo/moo-pch.h +++ /dev/null @@ -1,28 +0,0 @@ -#pragma once - -#ifdef __cplusplus - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#endif // __cplusplus - -#ifdef __WIN32__ - -#include -#include -#include - -#endif // __WIN32__ - -#ifdef MOO_ENABLE_PYTHON -#include -#endif diff --git a/moo/mooapp/Makefile.incl b/moo/mooapp/Makefile.incl index 237f85d3..bef64faf 100644 --- a/moo/mooapp/Makefile.incl +++ b/moo/mooapp/Makefile.incl @@ -1,15 +1,15 @@ moo_sources += \ - mooapp/mooappabout.cpp \ + mooapp/mooappabout.c \ mooapp/mooappabout.h \ - mooapp/mooapp.cpp \ + mooapp/mooapp.c \ mooapp/mooapp.h \ mooapp/mooapp-accels.h \ mooapp/mooapp-info.h \ mooapp/mooapp-private.h \ mooapp/moohtml.h \ - mooapp/moohtml.cpp \ + mooapp/moohtml.c \ mooapp/moolinklabel.h \ - mooapp/moolinklabel.cpp + mooapp/moolinklabel.c EXTRA_DIST += \ mooapp/glade/mooappabout-dialog.glade \ diff --git a/moo/mooapp/mooapp.c b/moo/mooapp/mooapp.c new file mode 100644 index 00000000..f2920987 --- /dev/null +++ b/moo/mooapp/mooapp.c @@ -0,0 +1,1615 @@ +/* + * mooapp/mooapp.c + * + * Copyright (C) 2004-2010 by Yevgen Muntyan + * + * This file is part of medit. medit 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. + * + * You should have received a copy of the GNU Lesser General Public + * License along with medit. If not, see . + */ + +/** + * class:MooApp: (parent GObject): application object + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#define WANT_MOO_APP_CMD_CHARS +#include "mooapp-private.h" +#include "eggsmclient/eggsmclient.h" +#include "mooapp-accels.h" +#include "mooapp-info.h" +#include "mooappabout.h" +#include "moolua/medit-lua.h" +#include "mooedit/mooeditprefs.h" +#include "mooedit/mooeditor.h" +#include "mooedit/mooplugin.h" +#include "mooedit/mooeditfileinfo.h" +#include "mooedit/mooedit-enums.h" +#include "mooutils/mooprefsdialog.h" +#include "marshals.h" +#include "mooutils/mooappinput.h" +#include "mooutils/moodialogs.h" +#include "mooutils/moostock.h" +#include "mooutils/mooutils-fs.h" +#include "mooutils/mooutils-misc.h" +#include "mooutils/mooutils-debug.h" +#include "mooutils/mooi18n.h" +#include "mooutils/moo-mime.h" +#include "mooutils/moohelp.h" +#include "mooutils/moocompat.h" +#include "mooutils/mooutils-script.h" +#include +#include +#include +#include + +#ifdef MOO_USE_QUARTZ +#include +#endif + +#ifdef HAVE_SIGNAL_H +#include +#endif + +#ifdef VERSION +#define APP_VERSION VERSION +#else +#define APP_VERSION "" +#endif + +#define MOO_UI_XML_FILE "ui.xml" +#ifdef __WIN32__ +#define MOO_ACTIONS_FILE "actions.ini" +#else +#define MOO_ACTIONS_FILE "actions" +#endif + +#define SESSION_VERSION "1.0" + +#define ASK_OPEN_BUG_URL_KEY "Application/ask_open_bug_url" + +static struct { + MooApp *instance; + gboolean atexit_installed; +} moo_app_data; + +static volatile int signal_received; + +struct _MooAppPrivate { + MooEditor *editor; + char *rc_files[2]; + + gboolean run_input; + char *instance_name; + + gboolean running; + gboolean in_try_quit; + gboolean saved_session_in_try_quit; + gboolean in_after_close_window; + int exit_status; + +#ifndef __WIN32__ + EggSMClient *sm_client; +#endif + + int use_session; + char *session_file; + MooMarkupDoc *session; + + MooUiXml *ui_xml; + const char *default_ui; + guint quit_handler_id; + +#ifdef MOO_USE_QUARTZ + IgeMacDock *dock; +#endif +}; + + +static void moo_app_class_init (MooAppClass *klass); +static void moo_app_instance_init (MooApp *app); +static GObject *moo_app_constructor (GType type, + guint n_params, + GObjectConstructParam *params); +static void moo_app_finalize (GObject *object); + +static void install_common_actions (void); +static void install_editor_actions (void); + +static void moo_app_help (GtkWidget *window); +static void moo_app_report_bug (GtkWidget *window); + +static void moo_app_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec); +static void moo_app_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec); + +static void moo_app_do_quit (MooApp *app); +static void moo_app_exec_cmd (MooApp *app, + char cmd, + const char *data, + guint len); +static void moo_app_do_load_session (MooApp *app, + MooMarkupNode *xml); +static GtkWidget *moo_app_create_prefs_dialog (MooApp *app); + +static void moo_app_load_prefs (MooApp *app); +static void moo_app_save_prefs (MooApp *app); + +static void moo_app_save_session (MooApp *app); +static void moo_app_write_session (MooApp *app); + +static void moo_app_install_cleanup (void); +static void moo_app_cleanup (void); + +static void start_input (MooApp *app); + +static void moo_app_cmd_open_files (MooApp *app, + const char *data); + + +static GObjectClass *moo_app_parent_class; + +GType +moo_app_get_type (void) +{ + static GType type = 0; + + if (G_UNLIKELY (!type)) + { + static const GTypeInfo type_info = { + sizeof (MooAppClass), + (GBaseInitFunc) NULL, + (GBaseFinalizeFunc) NULL, + (GClassInitFunc) moo_app_class_init, + (GClassFinalizeFunc) NULL, + NULL, /* class_data */ + sizeof (MooApp), + 0, /* n_preallocs */ + (GInstanceInitFunc) moo_app_instance_init, + NULL /* value_table */ + }; + + type = g_type_register_static (G_TYPE_OBJECT, "MooApp", + &type_info, 0); + } + + return type; +} + + +enum { + PROP_0, + PROP_RUN_INPUT, + PROP_USE_SESSION, + PROP_DEFAULT_UI, + PROP_INSTANCE_NAME +}; + +enum { + STARTED, + QUIT, + LOAD_SESSION, + SAVE_SESSION, + LAST_SIGNAL +}; + + +static guint signals[LAST_SIGNAL]; + + +static void +moo_app_class_init (MooAppClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + moo_app_parent_class = g_type_class_peek_parent (klass); + + gobject_class->constructor = moo_app_constructor; + gobject_class->finalize = moo_app_finalize; + gobject_class->set_property = moo_app_set_property; + gobject_class->get_property = moo_app_get_property; + + g_object_class_install_property (gobject_class, + PROP_RUN_INPUT, + g_param_spec_boolean ("run-input", + "run-input", + "run-input", + TRUE, + (GParamFlags) (G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY))); + + g_object_class_install_property (gobject_class, + PROP_USE_SESSION, + g_param_spec_int ("use-session", + "use-session", + "use-session", + -1, 1, -1, + (GParamFlags) (G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY))); + + g_object_class_install_property (gobject_class, + PROP_INSTANCE_NAME, + g_param_spec_string ("instance-name", + "instance-name", + "instance-name", + NULL, + (GParamFlags) (G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY))); + + g_object_class_install_property (gobject_class, PROP_DEFAULT_UI, + g_param_spec_pointer ("default-ui", "default-ui", "default-ui", + (GParamFlags) (G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY))); + + /** + * MooApp::started: + * + * @app: the object which received the signal + * + * This signal is emitted after application loaded session, + * started main loop, and hit idle for the first time. + **/ + signals[STARTED] = + g_signal_new ("started", + G_OBJECT_CLASS_TYPE (klass), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (MooAppClass, started), + NULL, NULL, + _moo_marshal_VOID__VOID, + G_TYPE_NONE, 0); + + /** + * MooApp::quit: + * + * @app: the object which received the signal + * + * This signal is emitted when application quits, + * after session has been saved. + **/ + signals[QUIT] = + g_signal_new ("quit", + G_OBJECT_CLASS_TYPE (klass), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (MooAppClass, quit), + NULL, NULL, + _moo_marshal_VOID__VOID, + G_TYPE_NONE, 0); + + /** + * MooApp::load-session: + * + * @app: the object which received the signal + * + * This signal is emitted when application is loading session, + * after editor session has been loaded. + **/ + signals[LOAD_SESSION] = + g_signal_new ("load-session", + G_OBJECT_CLASS_TYPE (klass), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (MooAppClass, load_session), + NULL, NULL, + _moo_marshal_VOID__VOID, + G_TYPE_NONE, 0); + + /** + * MooApp::save-session: + * + * @app: the object which received the signal + * + * This signal is emitted when application is saving session, + * before saving editor session. + **/ + signals[SAVE_SESSION] = + g_signal_new ("save-session", + G_OBJECT_CLASS_TYPE (klass), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (MooAppClass, save_session), + NULL, NULL, + _moo_marshal_VOID__VOID, + G_TYPE_NONE, 0); +} + + +static void +moo_app_instance_init (MooApp *app) +{ + g_return_if_fail (moo_app_data.instance == NULL); + + _moo_stock_init (); + + moo_app_data.instance = app; + + app->priv = g_new0 (MooAppPrivate, 1); + app->priv->use_session = -1; +} + + +#if defined(HAVE_SIGNAL) +static void +setup_signals (void(*handler)(int)) +{ + signal (SIGINT, handler); +#ifdef SIGHUP + /* TODO: maybe detach from terminal in this case? */ + signal (SIGHUP, handler); +#endif +} + +static void +sigint_handler (int sig) +{ + signal_received = sig; + setup_signals (SIG_DFL); +} +#endif + +static GObject* +moo_app_constructor (GType type, + guint n_params, + GObjectConstructParam *params) +{ + GObject *object; + + if (moo_app_data.instance != NULL) + { + g_critical ("attempt to create second instance of application class"); + g_critical ("going to crash now"); + return NULL; + } + + object = moo_app_parent_class->constructor (type, n_params, params); + +#if defined(HAVE_SIGNAL) && defined(SIGINT) + setup_signals (sigint_handler); +#endif + moo_app_install_cleanup (); + + install_common_actions (); + install_editor_actions (); + + return object; +} + + +static void +moo_app_finalize (GObject *object) +{ + MooApp *app = MOO_APP(object); + + moo_app_do_quit (app); + + moo_app_data.instance = NULL; + + g_free (app->priv->rc_files[0]); + g_free (app->priv->rc_files[1]); + + g_free (app->priv->session_file); + if (app->priv->session) + moo_markup_doc_unref (app->priv->session); + + if (app->priv->editor) + g_object_unref (app->priv->editor); + if (app->priv->ui_xml) + g_object_unref (app->priv->ui_xml); + + g_free (app->priv->instance_name); + g_free (app->priv); + + G_OBJECT_CLASS (moo_app_parent_class)->finalize (object); +} + + +static void +moo_app_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + MooApp *app = MOO_APP (object); + + switch (prop_id) + { + case PROP_RUN_INPUT: + app->priv->run_input = g_value_get_boolean (value); + break; + + case PROP_USE_SESSION: + app->priv->use_session = g_value_get_int (value); + break; + + case PROP_INSTANCE_NAME: + g_free (app->priv->instance_name); + app->priv->instance_name = g_value_dup_string (value); + break; + + case PROP_DEFAULT_UI: + app->priv->default_ui = g_value_get_pointer (value); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } +} + +static void +moo_app_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + MooApp *app = MOO_APP (object); + + switch (prop_id) + { + case PROP_RUN_INPUT: + g_value_set_boolean (value, app->priv->run_input); + break; + case PROP_USE_SESSION: + g_value_set_int (value, app->priv->use_session); + break; + case PROP_INSTANCE_NAME: + g_value_set_string (value, app->priv->instance_name); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } +} + + +/** + * moo_app_instance: (static-method-of MooApp) + **/ +MooApp * +moo_app_instance (void) +{ + return moo_app_data.instance; +} + + +#define SCRIPT_PREFIX_LUA "lua:" +#define SCRIPT_PREFIX_LUA_FILE "luaf:" +#define SCRIPT_PREFIX_PYTHON "py:" +#define SCRIPT_PREFIX_PYTHON_FILE "pyf:" + +void +moo_app_run_script (MooApp *app, + const char *script) +{ + g_return_if_fail (MOO_IS_APP (app)); + g_return_if_fail (script != NULL); + + if (g_str_has_prefix (script, SCRIPT_PREFIX_LUA)) + medit_lua_run_string (script + strlen (SCRIPT_PREFIX_LUA)); + else if (g_str_has_prefix (script, SCRIPT_PREFIX_LUA_FILE)) + medit_lua_run_file (script + strlen (SCRIPT_PREFIX_LUA_FILE)); +// else if (g_str_has_prefix (script, SCRIPT_PREFIX_PYTHON)) +// moo_python_run_string (script + strlen (SCRIPT_PREFIX_PYTHON)); +// else if (g_str_has_prefix (script, SCRIPT_PREFIX_PYTHON_FILE)) +// moo_python_run_file (script + strlen (SCRIPT_PREFIX_PYTHON_FILE)); + else + medit_lua_run_string (script); +} + +// static void +// run_python_file (MooApp *app, +// const char *filename) +// { +// FILE *file; +// MooPyObject *res; +// +// g_return_if_fail (MOO_IS_APP (app)); +// g_return_if_fail (filename != NULL); +// g_return_if_fail (moo_python_running ()); +// +// file = _moo_fopen (filename, "rb"); +// g_return_if_fail (file != NULL); +// +// res = moo_python_run_file (file, filename, NULL, NULL); +// +// fclose (file); +// +// if (res) +// moo_Py_DECREF (res); +// else +// moo_PyErr_Print (); +// } +// +// static void +// run_python_script (const char *string) +// { +// MooPyObject *res; +// +// g_return_if_fail (string != NULL); +// g_return_if_fail (moo_python_running ()); +// +// res = moo_python_run_simple_string (string); +// +// if (res) +// moo_Py_DECREF (res); +// else +// moo_PyErr_Print (); +// } + + +/** + * moo_app_get_editor: + */ +MooEditor * +moo_app_get_editor (MooApp *app) +{ + g_return_val_if_fail (MOO_IS_APP (app), NULL); + return app->priv->editor; +} + + +static void +editor_will_close_window (MooApp *app) +{ + MooEditWindowArray *windows; + + if (!app->priv->running || app->priv->saved_session_in_try_quit) + return; + + windows = moo_editor_get_windows (app->priv->editor); + + if (moo_edit_window_array_get_size (windows) == 1) + moo_app_save_session (app); + + moo_edit_window_array_free (windows); +} + +static void +editor_after_close_window (MooApp *app) +{ + MooEditWindowArray *windows; + + if (!app->priv->running || app->priv->in_try_quit) + return; + + windows = moo_editor_get_windows (app->priv->editor); + + if (moo_edit_window_array_get_size (windows) == 0) + { + app->priv->in_after_close_window = TRUE; + moo_app_quit (app); + app->priv->in_after_close_window = FALSE; + } + + moo_edit_window_array_free (windows); +} + +static void +init_plugins (MooApp *app) +{ + if (MOO_APP_GET_CLASS (app)->init_plugins) + MOO_APP_GET_CLASS (app)->init_plugins (app); +} + +static void +moo_app_init_editor (MooApp *app) +{ + app->priv->editor = moo_editor_create_instance (FALSE); + + g_signal_connect_swapped (app->priv->editor, "will-close-window", + G_CALLBACK (editor_will_close_window), app); + g_signal_connect_swapped (app->priv->editor, "after-close-window", + G_CALLBACK (editor_after_close_window), app); + + /* if ui_xml wasn't set yet, then moo_app_get_ui_xml() + will get editor's xml */ + moo_editor_set_ui_xml (app->priv->editor, + moo_app_get_ui_xml (app)); + + init_plugins (app); +} + + +static void +moo_app_init_ui (MooApp *app) +{ + MooUiXml *xml = NULL; + char **files, **p; + + files = moo_get_data_files (MOO_UI_XML_FILE); + + for (p = files; p && *p; ++p) + { + GError *error = NULL; + GMappedFile *file; + + file = g_mapped_file_new (*p, FALSE, &error); + + if (file) + { + xml = moo_ui_xml_new (); + moo_ui_xml_add_ui_from_string (xml, + g_mapped_file_get_contents (file), + g_mapped_file_get_length (file)); + g_mapped_file_unref (file); + break; + } + + if (!(error && error->domain == G_FILE_ERROR && error->code == G_FILE_ERROR_NOENT)) + g_warning ("could not open file '%s': %s", *p, moo_error_message (error)); + + g_error_free (error); + } + + if (!xml && app->priv->default_ui) + { + xml = moo_ui_xml_new (); + moo_ui_xml_add_ui_from_string (xml, app->priv->default_ui, -1); + } + + if (xml) + { + if (app->priv->ui_xml) + g_object_unref (app->priv->ui_xml); + app->priv->ui_xml = xml; + } + + g_strfreev (files); +} + + +#ifdef MOO_USE_QUARTZ + +static void +dock_open_documents (MooApp *app, + char **files) +{ + moo_app_open_files (app, files, 0, 0, 0); +} + +static void +dock_quit_activate (MooApp *app) +{ + moo_app_quit (app); +} + +static void +moo_app_init_mac (MooApp *app) +{ + app->priv->dock = ige_mac_dock_get_default (); + g_signal_connect_swapped (app->priv->dock, "open-documents", + G_CALLBACK (dock_open_documents), app); + g_signal_connect_swapped (app->priv->dock, "quit-activate", + G_CALLBACK (dock_quit_activate), app); +} + +#else /* !MOO_USE_QUARTZ */ +static void +moo_app_init_mac (G_GNUC_UNUSED MooApp *app) +{ +} +#endif /* !MOO_USE_QUARTZ */ + + +static void +input_callback (char cmd, + const char *data, + gsize len, + gpointer cb_data) +{ + MooApp *app = cb_data; + + g_return_if_fail (MOO_IS_APP (app)); + g_return_if_fail (data != NULL); + + moo_app_exec_cmd (app, cmd, data, len); +} + +static void +start_input (MooApp *app) +{ + if (app->priv->run_input) + _moo_app_input_start (app->priv->instance_name, + TRUE, input_callback, app); +} + +gboolean +moo_app_send_msg (const char *pid, + const char *data, + gssize len) +{ + g_return_val_if_fail (data != NULL, FALSE); + return _moo_app_input_send_msg (pid, data, len); +} + + +static gboolean +on_gtk_main_quit (MooApp *app) +{ + app->priv->quit_handler_id = 0; + + if (!moo_app_quit (app)) + moo_app_do_quit (app); + + return FALSE; +} + + +static gboolean +check_signal (void) +{ + if (signal_received) + { + g_print ("%s\n", g_strsignal (signal_received)); + if (moo_app_data.instance) + moo_app_do_quit (moo_app_data.instance); + exit (EXIT_FAILURE); + } + + return TRUE; +} + + +static gboolean +emit_started (MooApp *app) +{ + g_signal_emit_by_name (app, "started"); + return FALSE; +} + +#ifndef __WIN32__ + +static void +sm_quit_requested (MooApp *app) +{ + EggSMClient *sm_client; + + sm_client = app->priv->sm_client; + g_return_if_fail (sm_client != NULL); + + g_object_ref (sm_client); + egg_sm_client_will_quit (sm_client, moo_app_quit (app)); + g_object_unref (sm_client); +} + +static void +sm_quit (MooApp *app) +{ + if (!moo_app_quit (app)) + moo_app_do_quit (app); +} + +#endif // __WIN32__ + + +void +moo_app_set_exit_status (MooApp *app, + int value) +{ + g_return_if_fail (MOO_IS_APP (app)); + app->priv->exit_status = value; +} + + +static void +moo_app_install_cleanup (void) +{ + if (!moo_app_data.atexit_installed) + { + moo_app_data.atexit_installed = TRUE; + atexit (moo_app_cleanup); + } +} + +static void +moo_app_cleanup (void) +{ + _moo_app_input_shutdown (); + moo_mime_shutdown (); + moo_cleanup (); +} + + +static void +moo_app_do_quit (MooApp *app) +{ + guint i; + + if (!app->priv->running) + return; + else + app->priv->running = FALSE; + + g_signal_emit (app, signals[QUIT], 0); + +#ifndef __WIN32__ + g_object_unref (app->priv->sm_client); + app->priv->sm_client = NULL; +#endif + + _moo_editor_close_all (app->priv->editor); + + moo_plugin_shutdown (); + + g_object_unref (app->priv->editor); + app->priv->editor = NULL; + + moo_app_write_session (app); + moo_app_save_prefs (app); + + if (app->priv->quit_handler_id) + gtk_quit_remove (app->priv->quit_handler_id); + + i = 0; + while (gtk_main_level () && i < 1000) + { + gtk_main_quit (); + i++; + } + + moo_app_cleanup (); +} + + +gboolean +moo_app_init (MooApp *app) +{ + g_return_val_if_fail (MOO_IS_APP (app), FALSE); + + gdk_set_program_class (MOO_APP_FULL_NAME); + gtk_window_set_default_icon_name (MOO_APP_SHORT_NAME); + + moo_set_display_app_name (MOO_APP_SHORT_NAME); + _moo_set_app_instance_name (app->priv->instance_name); + + moo_app_load_prefs (app); + moo_app_init_ui (app); + moo_app_init_mac (app); + + moo_app_init_editor (app); + + if (app->priv->use_session == -1) + app->priv->use_session = moo_prefs_get_bool (moo_edit_setting (MOO_EDIT_PREFS_SAVE_SESSION)); + + if (app->priv->use_session) + app->priv->run_input = TRUE; + + start_input (app); + + return TRUE; +} + + +int +moo_app_run (MooApp *app) +{ + g_return_val_if_fail (MOO_IS_APP (app), -1); + g_return_val_if_fail (!app->priv->running, 0); + + app->priv->running = TRUE; + + app->priv->quit_handler_id = + gtk_quit_add (1, (GtkFunction) on_gtk_main_quit, app); + + gdk_threads_add_timeout (100, (GSourceFunc) check_signal, NULL); + +#ifndef __WIN32__ + app->priv->sm_client = egg_sm_client_get (); + /* make it install log handler */ + g_option_group_free (egg_sm_client_get_option_group ()); + g_signal_connect_swapped (app->priv->sm_client, "quit-requested", + G_CALLBACK (sm_quit_requested), app); + g_signal_connect_swapped (app->priv->sm_client, "quit", + G_CALLBACK (sm_quit), app); + + gdk_threads_leave (); + if (EGG_SM_CLIENT_GET_CLASS (app->priv->sm_client)->startup) + EGG_SM_CLIENT_GET_CLASS (app->priv->sm_client)->startup (app->priv->sm_client, NULL); + gdk_threads_enter (); +#endif // __WIN32__ + + gdk_threads_add_idle_full (G_PRIORITY_DEFAULT_IDLE + 1, (GSourceFunc) emit_started, app, NULL); + + gtk_main (); + + return app->priv->exit_status; +} + + +static gboolean +moo_app_try_quit (MooApp *app) +{ + gboolean closed; + + g_return_val_if_fail (MOO_IS_APP (app), FALSE); + + if (!app->priv->running) + return TRUE; + + app->priv->in_try_quit = TRUE; + + if (!app->priv->in_after_close_window) + { + app->priv->saved_session_in_try_quit = TRUE; + moo_app_save_session (app); + } + + closed = _moo_editor_close_all (app->priv->editor); + + app->priv->saved_session_in_try_quit = FALSE; + app->priv->in_try_quit = FALSE; + + return closed; +} + +/** + * moo_app_quit: + **/ +gboolean +moo_app_quit (MooApp *app) +{ + g_return_val_if_fail (MOO_IS_APP (app), FALSE); + + if (app->priv->in_try_quit || !app->priv->running) + return TRUE; + + if (moo_app_try_quit (app)) + { + moo_app_do_quit (app); + return TRUE; + } + else + { + return FALSE; + } +} + + +static void +install_common_actions (void) +{ + MooWindowClass *klass = g_type_class_ref (MOO_TYPE_WINDOW); + + g_return_if_fail (klass != NULL); + + moo_window_class_new_action (klass, "Preferences", NULL, + "display-name", GTK_STOCK_PREFERENCES, + "label", GTK_STOCK_PREFERENCES, + "tooltip", GTK_STOCK_PREFERENCES, + "stock-id", GTK_STOCK_PREFERENCES, + "closure-callback", moo_app_prefs_dialog, + NULL); + + moo_window_class_new_action (klass, "About", NULL, + "label", GTK_STOCK_ABOUT, + "no-accel", TRUE, + "stock-id", GTK_STOCK_ABOUT, + "closure-callback", moo_app_about_dialog, + NULL); + + moo_window_class_new_action (klass, "Help", NULL, + "label", GTK_STOCK_HELP, + "default-accel", MOO_APP_ACCEL_HELP, + "stock-id", GTK_STOCK_HELP, + "closure-callback", moo_app_help, + NULL); + + moo_window_class_new_action (klass, "ReportBug", NULL, + "label", _("Report a Bug..."), + "closure-callback", moo_app_report_bug, + NULL); + + moo_window_class_new_action (klass, "Quit", NULL, + "display-name", GTK_STOCK_QUIT, + "label", GTK_STOCK_QUIT, + "tooltip", GTK_STOCK_QUIT, + "stock-id", GTK_STOCK_QUIT, + "default-accel", MOO_APP_ACCEL_QUIT, + "closure-callback", moo_app_quit, + "closure-proxy-func", moo_app_instance, + NULL); + + g_type_class_unref (klass); +} + + +static void +install_editor_actions (void) +{ + MooWindowClass *klass = g_type_class_ref (MOO_TYPE_EDIT_WINDOW); + g_return_if_fail (klass != NULL); + g_type_class_unref (klass); +} + + +MooUiXml * +moo_app_get_ui_xml (MooApp *app) +{ + g_return_val_if_fail (MOO_IS_APP (app), NULL); + + if (!app->priv->ui_xml) + { + if (app->priv->editor) + { + app->priv->ui_xml = moo_editor_get_ui_xml (app->priv->editor); + g_object_ref (app->priv->ui_xml); + } + + if (!app->priv->ui_xml) + app->priv->ui_xml = moo_ui_xml_new (); + } + + return app->priv->ui_xml; +} + + +void +moo_app_set_ui_xml (MooApp *app, + MooUiXml *xml) +{ + g_return_if_fail (MOO_IS_APP (app)); + + if (app->priv->ui_xml == xml) + return; + + if (app->priv->ui_xml) + g_object_unref (app->priv->ui_xml); + + app->priv->ui_xml = xml; + + if (xml) + g_object_ref (app->priv->ui_xml); + + if (app->priv->editor) + moo_editor_set_ui_xml (app->priv->editor, xml); +} + + + +static void +moo_app_do_load_session (MooApp *app, + MooMarkupNode *xml) +{ + MooEditor *editor; + editor = moo_app_get_editor (app); + g_return_if_fail (editor != NULL); + _moo_editor_load_session (editor, xml); + g_signal_emit (app, signals[LOAD_SESSION], 0); +} + +static void +moo_app_save_session (MooApp *app) +{ + MooMarkupNode *root; + + if (!app->priv->session_file) + return; + + if (app->priv->session) + moo_markup_doc_unref (app->priv->session); + + app->priv->session = moo_markup_doc_new ("session"); + root = moo_markup_create_root_element (app->priv->session, "session"); + moo_markup_set_prop (root, "version", SESSION_VERSION); + + g_signal_emit (app, signals[SAVE_SESSION], 0); + _moo_editor_save_session (moo_app_get_editor (app), root); +} + +static void +moo_app_write_session (MooApp *app) +{ + char *filename; + GError *error = NULL; + MooFileWriter *writer; + + if (!app->priv->session_file) + return; + + filename = moo_get_user_cache_file (app->priv->session_file); + + if (!app->priv->session) + { + mgw_errno_t err; + mgw_unlink (filename, &err); + g_free (filename); + return; + } + + if ((writer = moo_config_writer_new (filename, FALSE, &error))) + { + moo_markup_write_pretty (app->priv->session, writer, 1); + moo_file_writer_close (writer, &error); + } + + if (error) + { + g_critical ("could not save session file %s: %s", filename, error->message); + g_error_free (error); + } + + g_free (filename); +} + +void +moo_app_load_session (MooApp *app) +{ + MooMarkupDoc *doc; + MooMarkupNode *root; + GError *error = NULL; + const char *version; + char *session_file; + + g_return_if_fail (MOO_IS_APP (app)); + + if (!app->priv->use_session) + return; + + if (!app->priv->session_file) + { + if (app->priv->instance_name) + app->priv->session_file = g_strdup_printf (MOO_NAMED_SESSION_XML_FILE_NAME, + app->priv->instance_name); + else + app->priv->session_file = g_strdup (MOO_SESSION_XML_FILE_NAME); + } + + session_file = moo_get_user_cache_file (app->priv->session_file); + + if (!g_file_test (session_file, G_FILE_TEST_EXISTS) || + !(doc = moo_markup_parse_file (session_file, &error))) + { + if (error) + { + g_warning ("could not open session file %s: %s", + session_file, error->message); + g_error_free (error); + } + + g_free (session_file); + return; + } + + if (!(root = moo_markup_get_root_element (doc, "session")) || + !(version = moo_markup_get_prop (root, "version"))) + g_warning ("malformed session file %s, ignoring", session_file); + else if (strcmp (version, SESSION_VERSION) != 0) + g_warning ("invalid session file version %s in %s, ignoring", + version, session_file); + else + { + app->priv->session = doc; + moo_app_do_load_session (app, root); + app->priv->session = NULL; + } + + moo_markup_doc_unref (doc); + g_free (session_file); +} + + +// static void +// moo_app_present (MooApp *app) +// { +// gpointer window = NULL; +// +// if (!window && app->priv->editor) +// window = moo_editor_get_active_window (app->priv->editor); +// +// if (window) +// moo_window_present (window, 0); +// } + + +// static void +// moo_app_open_uris (MooApp *app, +// const char *data, +// gboolean has_encoding) +// { +// char **uris; +// guint32 stamp; +// char *stamp_string; +// char *line_string; +// guint32 line; +// char *encoding = NULL; +// +// g_return_if_fail (strlen (data) > (has_encoding ? 32 : 16)); +// +// stamp_string = g_strndup (data, 8); +// stamp = strtoul (stamp_string, NULL, 16); +// line_string = g_strndup (data + 8, 8); +// line = strtoul (line_string, NULL, 16); +// +// if (line > G_MAXINT) +// line = 0; +// +// data += 16; +// +// if (has_encoding) +// { +// char *p; +// encoding = g_strndup (data, 16); +// p = strchr (encoding, ' '); +// if (p) +// *p = 0; +// data += 16; +// } +// +// uris = g_strsplit (data, "\r\n", 0); +// +// if (uris && *uris) +// { +// char **p; +// +// for (p = uris; p && *p && **p; ++p) +// { +// guint line_here = 0; +// guint options = 0; +// char *filename; +// +// filename = _moo_edit_uri_to_filename (*p, &line_here, &options); +// +// if (p != uris) +// line = 0; +// if (line_here) +// line = line_here; +// +// if (filename) +// moo_app_new_file (app, filename, encoding, line, options); +// +// g_free (filename); +// } +// } +// else +// { +// moo_app_new_file (app, NULL, encoding, 0, 0); +// } +// +// moo_editor_present (app->priv->editor, stamp); +// +// g_free (encoding); +// g_strfreev (uris); +// g_free (stamp_string); +// } + +void +moo_app_open_files (MooApp *app, + MooOpenInfoArray *files, + guint32 stamp) +{ + g_return_if_fail (MOO_IS_APP (app)); + + if (!moo_open_info_array_is_empty (files)) + { + guint i; + MooOpenInfoArray *tmp = moo_open_info_array_copy (files); + for (i = 0; i < tmp->n_elms; ++i) + moo_open_info_add_flags (tmp->elms[i], MOO_OPEN_FLAG_CREATE_NEW); + moo_editor_open_files (app->priv->editor, tmp, NULL, NULL); + moo_open_info_array_free (tmp); + } + + moo_editor_present (app->priv->editor, stamp); +} + + +static MooAppCmdCode +get_cmd_code (char cmd) +{ + guint i; + + for (i = 1; i < CMD_LAST; ++i) + if (cmd == moo_app_cmd_chars[i]) + return i; + + g_return_val_if_reached (0); +} + +static void +moo_app_exec_cmd (MooApp *app, + char cmd, + const char *data, + G_GNUC_UNUSED guint len) +{ + MooAppCmdCode code; + + g_return_if_fail (MOO_IS_APP (app)); + + code = get_cmd_code (cmd); + + switch (code) + { + case CMD_SCRIPT: + moo_app_run_script (app, data); + break; + + case CMD_OPEN_FILES: + moo_app_cmd_open_files (app, data); + break; + + default: + g_warning ("got unknown command %c %d", cmd, code); + } +} + + +static void +moo_app_help (GtkWidget *window) +{ + GtkWidget *focus = gtk_window_get_focus (GTK_WINDOW (window)); + moo_help_open_any (focus ? focus : window); +} + + +static void +moo_app_report_bug (GtkWidget *window) +{ + char *url; + char *os; + char *version_escaped, *os_escaped; + char *message; + const char *prefs_val; + gboolean do_open = TRUE; + + moo_prefs_create_key (ASK_OPEN_BUG_URL_KEY, MOO_PREFS_STATE, G_TYPE_STRING, NULL); + + version_escaped = g_uri_escape_string (MOO_DISPLAY_VERSION, NULL, FALSE); + os = get_system_name (); + os_escaped = os ? g_uri_escape_string (os, NULL, FALSE) : g_strdup (""); + + url = g_strdup_printf ("http://mooedit.sourceforge.net/cgi-bin/report_bug.cgi?version=%s&os=%s", + version_escaped, os_escaped); + message = g_strdup_printf (_("The following URL will be opened:\n\n%s\n\n" + "It contains medit version and your operating system name (%s)"), + url, os); + + prefs_val = moo_prefs_get_string (ASK_OPEN_BUG_URL_KEY); + if (!prefs_val || strcmp (prefs_val, url) != 0) + { + do_open = moo_question_dialog (_("Open URL?"), message, window, GTK_RESPONSE_OK); + if (do_open) + moo_prefs_set_string (ASK_OPEN_BUG_URL_KEY, url); + } + + if (do_open) + moo_open_url (url); + + g_free (message); + g_free (url); + g_free (os_escaped); + g_free (os); + g_free (version_escaped); +} + + +void +moo_app_prefs_dialog (GtkWidget *parent) +{ + GtkWidget *dialog = moo_app_create_prefs_dialog (moo_app_instance ()); + g_return_if_fail (MOO_IS_PREFS_DIALOG (dialog)); + moo_prefs_dialog_run (MOO_PREFS_DIALOG (dialog), parent); +} + + +static void +prefs_dialog_apply (void) +{ + moo_app_save_prefs (moo_app_instance ()); +} + + +static GtkWidget * +moo_app_create_prefs_dialog (MooApp *app) +{ + MooPrefsDialog *dialog; + + /* Prefs dialog title */ + dialog = MOO_PREFS_DIALOG (moo_prefs_dialog_new (_("Preferences"))); + + moo_prefs_dialog_append_page (dialog, moo_edit_prefs_page_new_1 (moo_app_get_editor (app))); + moo_prefs_dialog_append_page (dialog, moo_edit_prefs_page_new_2 (moo_app_get_editor (app))); + moo_prefs_dialog_append_page (dialog, moo_edit_prefs_page_new_3 (moo_app_get_editor (app))); + moo_prefs_dialog_append_page (dialog, moo_edit_prefs_page_new_4 (moo_app_get_editor (app))); + moo_prefs_dialog_append_page (dialog, moo_edit_prefs_page_new_5 (moo_app_get_editor (app))); + moo_plugin_attach_prefs (GTK_WIDGET (dialog)); + + g_signal_connect_after (dialog, "apply", + G_CALLBACK (prefs_dialog_apply), + NULL); + + return GTK_WIDGET (dialog); +} + + +static void +moo_app_load_prefs (MooApp *app) +{ + GError *error = NULL; + char **sys_files; + + app->priv->rc_files[MOO_PREFS_RC] = moo_get_user_data_file (MOO_PREFS_XML_FILE_NAME); + app->priv->rc_files[MOO_PREFS_STATE] = moo_get_user_cache_file (MOO_STATE_XML_FILE_NAME); + + sys_files = moo_get_sys_data_files (MOO_PREFS_XML_FILE_NAME); + + if (!moo_prefs_load (sys_files, + app->priv->rc_files[MOO_PREFS_RC], + app->priv->rc_files[MOO_PREFS_STATE], + &error)) + { + g_warning ("could not read config files: %s", moo_error_message (error)); + g_error_free (error); + } + + g_strfreev (sys_files); +} + + +static void +moo_app_save_prefs (MooApp *app) +{ + GError *error = NULL; + + if (!moo_prefs_save (app->priv->rc_files[MOO_PREFS_RC], + app->priv->rc_files[MOO_PREFS_STATE], + &error)) + { + g_warning ("could not save config files: %s", moo_error_message (error)); + g_error_free (error); + } +} + + +#define MOO_APP_CMD_VERSION "1.0" + +static MooOpenInfoArray * +moo_app_parse_files (const char *data, + guint32 *stamp) +{ + MooMarkupDoc *xml; + MooMarkupNode *root; + MooMarkupNode *node; + const char *version; + MooOpenInfoArray *files; + + *stamp = 0; + + xml = moo_markup_parse_memory (data, -1, NULL); + g_return_val_if_fail (xml != NULL, FALSE); + + if (!(root = moo_markup_get_root_element (xml, "moo-app-open-files")) || + !(version = moo_markup_get_prop (root, "version")) || + strcmp (version, MOO_APP_CMD_VERSION) != 0) + { + g_warning ("%s: invalid markup", G_STRFUNC); + moo_markup_doc_unref (xml); + return NULL; + } + + *stamp = moo_markup_uint_prop (root, "stamp", 0); + files = moo_open_info_array_new (); + + for (node = root->children; node != NULL; node = node->next) + { + const char *uri; + const char *encoding; + MooOpenInfo *info; + int line; + + if (!MOO_MARKUP_IS_ELEMENT (node)) + continue; + + if (strcmp (node->name, "file") != 0 || + !(uri = moo_markup_get_content (node)) || + !uri[0]) + { + g_critical ("%s: oops", G_STRFUNC); + continue; + } + + encoding = moo_markup_get_prop (node, "encoding"); + if (!encoding || !encoding[0]) + encoding = NULL; + + info = moo_open_info_new_uri (uri, encoding, -1, MOO_OPEN_FLAG_CREATE_NEW); + + line = moo_markup_int_prop (node, "line", 0); + if (line > 0) + moo_open_info_set_line (info, line - 1); + + if (moo_markup_bool_prop (node, "new-window", FALSE)) + moo_open_info_add_flags (info, MOO_OPEN_FLAG_NEW_WINDOW); + if (moo_markup_bool_prop (node, "new-tab", FALSE)) + moo_open_info_add_flags (info, MOO_OPEN_FLAG_NEW_TAB); + if (moo_markup_bool_prop (node, "reload", FALSE)) + moo_open_info_add_flags (info, MOO_OPEN_FLAG_RELOAD); + + moo_open_info_array_take (files, info); + } + + moo_markup_doc_unref (xml); + return files; +} + +static void +moo_app_cmd_open_files (MooApp *app, + const char *data) +{ + MooOpenInfoArray *files; + guint32 stamp; + files = moo_app_parse_files (data, &stamp); + moo_app_open_files (app, files, stamp); + moo_open_info_array_free (files); +} + +G_GNUC_PRINTF(2, 3) static void +append_escaped (GString *str, const char *format, ...) +{ + va_list args; + char *escaped; + + va_start (args, format); + + escaped = g_markup_vprintf_escaped (format, args); + g_string_append (str, escaped); + g_free (escaped); + + va_end (args); +} + +gboolean +moo_app_send_files (MooOpenInfoArray *files, + guint32 stamp, + const char *pid) +{ + gboolean result; + GString *msg; + int i, c; + +#if 0 + _moo_message ("moo_app_send_files: got %d files to pid %s", + n_files, pid ? pid : "NONE"); +#endif + + msg = g_string_new (NULL); + g_string_append_printf (msg, "%s", + CMD_OPEN_FILES_S, MOO_APP_CMD_VERSION, stamp); + + for (i = 0, c = moo_open_info_array_get_size (files); i < c; ++i) + { + MooOpenInfo *info = files->elms[i]; + const char *encoding = moo_open_info_get_encoding (info); + int line = moo_open_info_get_line (info); + MooOpenFlags flags = moo_open_info_get_flags (info); + char *uri; + + g_string_append (msg, "= 0) + g_string_append_printf (msg, " line=\"%u\"", (guint) line + 1); + if (flags & MOO_OPEN_FLAG_NEW_WINDOW) + g_string_append_printf (msg, " new-window=\"true\""); + if (flags & MOO_OPEN_FLAG_NEW_TAB) + g_string_append_printf (msg, " new-tab=\"true\""); + if (flags & MOO_OPEN_FLAG_RELOAD) + g_string_append_printf (msg, " reload=\"true\""); + + uri = moo_open_info_get_uri (info); + append_escaped (msg, ">%s", uri); + g_free (uri); + } + + g_string_append (msg, ""); + + result = moo_app_send_msg (pid, msg->str, msg->len); + + g_string_free (msg, TRUE); + return result; +} diff --git a/moo/mooapp/mooapp.cmake b/moo/mooapp/mooapp.cmake index 66fc5775..34d4c35c 100644 --- a/moo/mooapp/mooapp.cmake +++ b/moo/mooapp/mooapp.cmake @@ -1,16 +1,16 @@ SET(mooapp_sources mooapp/mooapp.cmake - mooapp/mooappabout.cpp + mooapp/mooappabout.c mooapp/mooappabout.h - mooapp/mooapp.cpp + mooapp/mooapp.c mooapp/mooapp.h mooapp/mooapp-accels.h mooapp/mooapp-info.h mooapp/mooapp-private.h mooapp/moohtml.h - mooapp/moohtml.cpp + mooapp/moohtml.c mooapp/moolinklabel.h - mooapp/moolinklabel.cpp + mooapp/moolinklabel.c ) foreach(input_file diff --git a/moo/mooapp/mooapp.cpp b/moo/mooapp/mooapp.cpp deleted file mode 100644 index 401d027f..00000000 --- a/moo/mooapp/mooapp.cpp +++ /dev/null @@ -1,1321 +0,0 @@ -/* - * mooapp/mooapp.c - * - * Copyright (C) 2004-2010 by Yevgen Muntyan - * - * This file is part of medit. medit 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. - * - * You should have received a copy of the GNU Lesser General Public - * License along with medit. If not, see . - */ - -/** - * class:MooApp: (parent GObject): application object - */ - -#include "config.h" - -#include "mooapp-private.h" -#include "eggsmclient/eggsmclient.h" -#include "mooapp-accels.h" -#include "mooapp-info.h" -#include "mooappabout.h" -#include "moolua/medit-lua.h" -#include "mooedit/mooeditprefs.h" -#include "mooedit/mooeditor.h" -#include "mooedit/mooplugin.h" -#include "mooedit/mooeditfileinfo.h" -#include "mooedit/mooedit-enums.h" -#include "mooutils/mooprefsdialog.h" -#include "marshals.h" -#include "mooutils/mooappinput.h" -#include "mooutils/moodialogs.h" -#include "mooutils/moostock.h" -#include "mooutils/mooutils-fs.h" -#include "mooutils/mooutils-misc.h" -#include "mooutils/mooutils-debug.h" -#include "mooutils/mooi18n.h" -#include "mooutils/moo-mime.h" -#include "mooutils/moohelp.h" -#include "mooutils/moocompat.h" -#include "mooutils/mooutils-script.h" -#include -#include -#include -#include - -#ifdef MOO_USE_QUARTZ -#include -#endif - -#ifdef HAVE_SIGNAL_H -#include -#endif - -using namespace moo; - -#define MOO_UI_XML_FILE "ui.xml" -#ifdef __WIN32__ -#define MOO_ACTIONS_FILE "actions.ini" -#else -#define MOO_ACTIONS_FILE "actions" -#endif - -#define SESSION_VERSION "1.0" - -#define ASK_OPEN_BUG_URL_KEY "Application/ask_open_bug_url" - -struct App::Private -{ - static App *instance; - static bool atexit_installed; - static volatile int signal_received; - - Private(App& app) : app(app) {} - Private(const Private&) = delete; - Private& operator=(const Private&) = delete; - - App& app; - - gobj_ptr editor; - gstr rc_files[2]; - - bool run_input = false; - gstr instance_name; - - bool running = false; - bool in_try_quit = false; - bool saved_session_in_try_quit = false; - bool in_after_close_window = false; - int exit_status = 0; - -#ifndef __WIN32__ - EggSMClient* sm_client = nullptr; -#endif - - int use_session = 0; - gstr session_file; - gref_ptr session; - - gobj_ptr ui_xml; - - guint quit_handler_id = 0; - -#ifdef MOO_USE_QUARTZ - IgeMacDock *dock = nullptr; -#endif - - MooUiXml* get_ui_xml (); - - bool try_quit (); - void do_quit (); - static gboolean on_gtk_main_quit (Private* self); - static gboolean check_signal (); -#ifndef __WIN32__ - static void sm_quit_requested (Private* self); - static void sm_quit (Private* self); -#endif // __WIN32__ - - static void install_common_actions (); - static void install_editor_actions (); - - void exec_cmd (char cmd, const char* data, guint len); - void do_load_session (MooMarkupNode* xml); - - void load_prefs (); - void save_prefs (); - - void save_session (); - void write_session (); - - static void install_cleanup (); - static void cleanup (); - - void start_input (); - static void input_callback (char cmd, const char *data, gsize len, gpointer cb_data); - - void cmd_open_files (const char* data); - - void init_ui (); - void init_mac (); - void init_editor (); - - static void prefs_dialog (GtkWidget* parent); - GtkWidget* create_prefs_dialog (); - - static void open_help (GtkWidget* window); - static void report_bug (GtkWidget* window); - static void prefs_dialog_apply (); - - static void editor_will_close_window (Private* self); - static void editor_after_close_window (Private* self); -}; - - -App* App::Private::instance; -bool App::Private::atexit_installed; -volatile int App::Private::signal_received; - - -G_DEFINE_TYPE (MooApp, moo_app, G_TYPE_OBJECT); - - -enum { - STARTED, - QUIT, - LOAD_SESSION, - SAVE_SESSION, - LAST_SIGNAL -}; - - -static guint signals[LAST_SIGNAL]; - - -static void -moo_app_class_init (MooAppClass *klass) -{ - moo::init_gobj_system (); - - /** - * MooApp::started: - * - * @app: the object which received the signal - * - * This signal is emitted after application loaded session, - * started main loop, and hit idle for the first time. - **/ - signals[STARTED] = - g_signal_new ("started", - G_OBJECT_CLASS_TYPE (klass), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (MooAppClass, started), - NULL, NULL, - _moo_marshal_VOID__VOID, - G_TYPE_NONE, 0); - - /** - * MooApp::quit: - * - * @app: the object which received the signal - * - * This signal is emitted when application quits, - * after session has been saved. - **/ - signals[QUIT] = - g_signal_new ("quit", - G_OBJECT_CLASS_TYPE (klass), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (MooAppClass, quit), - NULL, NULL, - _moo_marshal_VOID__VOID, - G_TYPE_NONE, 0); - - /** - * MooApp::load-session: - * - * @app: the object which received the signal - * - * This signal is emitted when application is loading session, - * after editor session has been loaded. - **/ - signals[LOAD_SESSION] = - g_signal_new ("load-session", - G_OBJECT_CLASS_TYPE (klass), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (MooAppClass, load_session), - NULL, NULL, - _moo_marshal_VOID__VOID, - G_TYPE_NONE, 0); - - /** - * MooApp::save-session: - * - * @app: the object which received the signal - * - * This signal is emitted when application is saving session, - * before saving editor session. - **/ - signals[SAVE_SESSION] = - g_signal_new ("save-session", - G_OBJECT_CLASS_TYPE (klass), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (MooAppClass, save_session), - NULL, NULL, - _moo_marshal_VOID__VOID, - G_TYPE_NONE, 0); -} - - -App::App(gobj_wrapper_data& d, const StartupOptions& opts) - : Super(d) - , p(nullptr) -{ - g_return_if_fail (Private::instance == nullptr); - Private::instance = this; - - _moo_stock_init (); - - p = new Private(*this); - p->run_input = opts.run_input; - p->use_session = opts.use_session; - p->instance_name = opts.instance_name; - -#if defined(HAVE_SIGNAL) && defined(SIGINT) - setup_signals (sigint_handler); -#endif - Private::install_cleanup (); - - Private::install_common_actions (); - Private::install_editor_actions (); -} - -App::~App() -{ - p->do_quit (); - Private::instance = nullptr; - delete p; -} - -static void -moo_app_init (MooApp *app) -{ -} - - -#if defined(HAVE_SIGNAL) -static void -setup_signals (void(*handler)(int)) -{ - signal (SIGINT, handler); -#ifdef SIGHUP - /* TODO: maybe detach from terminal in this case? */ - signal (SIGHUP, handler); -#endif -} - -static void -sigint_handler (int sig) -{ - signal_received = sig; - setup_signals (SIG_DFL); -} -#endif - - -App& App::instance() -{ - return *Private::instance; -} - - -/** - * moo_app_instance: (static-method-of MooApp) - **/ -MooApp * -moo_app_instance (void) -{ - return App::instance().gobj(); -} - - -#define SCRIPT_PREFIX_LUA "lua:" -#define SCRIPT_PREFIX_LUA_FILE "luaf:" -#define SCRIPT_PREFIX_PYTHON "py:" -#define SCRIPT_PREFIX_PYTHON_FILE "pyf:" - -void App::run_script (const char* script) -{ - g_return_if_fail (script != NULL); - - if (g_str_has_prefix (script, SCRIPT_PREFIX_LUA)) - medit_lua_run_string (script + strlen (SCRIPT_PREFIX_LUA)); - else if (g_str_has_prefix (script, SCRIPT_PREFIX_LUA_FILE)) - medit_lua_run_file (script + strlen (SCRIPT_PREFIX_LUA_FILE)); -// else if (g_str_has_prefix (script, SCRIPT_PREFIX_PYTHON)) -// moo_python_run_string (script + strlen (SCRIPT_PREFIX_PYTHON)); -// else if (g_str_has_prefix (script, SCRIPT_PREFIX_PYTHON_FILE)) -// moo_python_run_file (script + strlen (SCRIPT_PREFIX_PYTHON_FILE)); - else - medit_lua_run_string (script); -} - -// static void -// run_python_file (MooApp *app, -// const char *filename) -// { -// FILE *file; -// MooPyObject *res; -// -// g_return_if_fail (MOO_IS_APP (app)); -// g_return_if_fail (filename != NULL); -// g_return_if_fail (moo_python_running ()); -// -// file = _moo_fopen (filename, "rb"); -// g_return_if_fail (file != NULL); -// -// res = moo_python_run_file (file, filename, NULL, NULL); -// -// fclose (file); -// -// if (res) -// moo_Py_DECREF (res); -// else -// moo_PyErr_Print (); -// } -// -// static void -// run_python_script (const char *string) -// { -// MooPyObject *res; -// -// g_return_if_fail (string != NULL); -// g_return_if_fail (moo_python_running ()); -// -// res = moo_python_run_simple_string (string); -// -// if (res) -// moo_Py_DECREF (res); -// else -// moo_PyErr_Print (); -// } - - -/** - * moo_app_get_editor: - */ -MooEditor * -moo_app_get_editor (MooApp *app) -{ - g_return_val_if_fail(MOO_IS_APP(app), nullptr); - return App::get(*app).get_editor(); -} - - -MooEditor* App::get_editor() -{ - return p->editor.gobj(); -} - - -void App::Private::editor_will_close_window (App::Private* self) -{ - MooEditWindowArray *windows; - - if (!self->running || self->saved_session_in_try_quit) - return; - - windows = moo_editor_get_windows (self->editor.gobj()); - - if (moo_edit_window_array_get_size (windows) == 1) - self->save_session (); - - moo_edit_window_array_free (windows); -} - -void App::Private::editor_after_close_window (App::Private* self) -{ - MooEditWindowArray *windows; - - if (!self->running || self->in_try_quit) - return; - - windows = moo_editor_get_windows (self->editor.gobj()); - - if (moo_edit_window_array_get_size (windows) == 0) - { - self->in_after_close_window = TRUE; - self->app.quit (); - self->in_after_close_window = FALSE; - } - - moo_edit_window_array_free (windows); -} - -void App::Private::init_editor () -{ - editor.set_new (moo_editor_create_instance ()); - - editor->connect_swapped ("will-close-window", - G_CALLBACK(editor_will_close_window), - this); - editor->connect_swapped ("after-close-window", - G_CALLBACK(editor_after_close_window), - this); - - moo_editor_set_ui_xml (editor.gobj(), get_ui_xml ()); - - app.init_plugins (); -} - - -void App::Private::init_ui () -{ - gobj_ptr xml; - char **files; - - files = moo_get_data_files (MOO_UI_XML_FILE); - - for (char **p = files; p && *p; ++p) - { - GError *error = NULL; - GMappedFile *file; - - file = g_mapped_file_new (*p, FALSE, &error); - - if (file) - { - xml.set_new (moo_ui_xml_new ()); - moo_ui_xml_add_ui_from_string (xml.gobj(), - g_mapped_file_get_contents (file), - g_mapped_file_get_length (file)); - g_mapped_file_unref (file); - break; - } - - if (!(error && error->domain == G_FILE_ERROR && error->code == G_FILE_ERROR_NOENT)) - g_warning ("could not open file '%s': %s", *p, moo_error_message (error)); - - g_error_free (error); - } - - if (xml) - ui_xml = xml; - - g_strfreev (files); -} - - -#ifdef MOO_USE_QUARTZ - -static void -dock_open_documents (App* app, char** files) -{ - app->open_files (files, 0, 0, 0); -} - -static void -dock_quit_activate (App *app) -{ - app->quit (); -} - -void App::Private::init_mac () -{ - dock = ige_mac_dock_get_default (); - g_signal_connect_swapped (dock, "open-documents", - G_CALLBACK (dock_open_documents), &app); - g_signal_connect_swapped (dock, "quit-activate", - G_CALLBACK (dock_quit_activate), &app); -} - -#else /* !MOO_USE_QUARTZ */ -void App::Private::init_mac () -{ -} -#endif /* !MOO_USE_QUARTZ */ - - -void App::Private::input_callback (char cmd, - const char *data, - gsize len, - gpointer cb_data) -{ - App::Private* self = reinterpret_cast (cb_data); - - g_return_if_fail (self != nullptr); - g_return_if_fail (data != nullptr); - - self->exec_cmd (cmd, data, len); -} - -void App::Private::start_input () -{ - if (run_input) - _moo_app_input_start (instance_name, TRUE, input_callback, this); -} - - -gboolean App::Private::on_gtk_main_quit (App::Private* self) -{ - self->quit_handler_id = 0; - - if (!self->app.quit()) - self->do_quit (); - - return FALSE; -} - - -gboolean App::Private::check_signal () -{ - if (signal_received) - { - g_print ("%s\n", g_strsignal (signal_received)); - if (instance) - instance->p->do_quit(); - exit (EXIT_FAILURE); - } - - return TRUE; -} - - -static gboolean -emit_started (App *app) -{ - app->signal_emit_by_name ("started"); - return FALSE; -} - -#ifndef __WIN32__ - -void App::Private::sm_quit_requested (App::Private* self) -{ - EggSMClient *sm_client; - - sm_client = self->sm_client; - g_return_if_fail (sm_client != NULL); - - g_object_ref (sm_client); - egg_sm_client_will_quit (sm_client, self->app.quit()); - g_object_unref (sm_client); -} - -void App::Private::sm_quit (App::Private* self) -{ - if (!self->app.quit()) - self->do_quit (); -} - -#endif // __WIN32__ - - -void App::set_exit_status (int value) -{ - p->exit_status = value; -} - - -void App::Private::install_cleanup () -{ - if (!atexit_installed) - { - atexit_installed = TRUE; - atexit (cleanup); - } -} - -void App::Private::cleanup () -{ - _moo_app_input_shutdown (); - moo_mime_shutdown (); - moo_cleanup (); -} - - -void App::Private::do_quit () -{ - guint i; - - if (!running) - return; - - running = FALSE; - - app.signal_emit (signals[QUIT], 0); - -#ifndef __WIN32__ - g_object_unref (sm_client); - sm_client = NULL; -#endif - - _moo_editor_close_all (editor.gobj()); - - moo_plugin_shutdown (); - - editor.reset (); - - write_session (); - save_prefs (); - - if (quit_handler_id) - gtk_quit_remove (quit_handler_id); - - i = 0; - while (gtk_main_level () && i < 1000) - { - gtk_main_quit (); - i++; - } - - cleanup (); -} - - -bool App::init() -{ - gdk_set_program_class (MOO_APP_FULL_NAME); - gtk_window_set_default_icon_name (MOO_APP_SHORT_NAME); - - moo_set_display_app_name (MOO_APP_SHORT_NAME); - _moo_set_app_instance_name (p->instance_name); - - p->load_prefs (); - p->init_ui (); - p->init_mac (); - - p->init_editor (); - - if (p->use_session == -1) - p->use_session = moo_prefs_get_bool (moo_edit_setting (MOO_EDIT_PREFS_SAVE_SESSION)); - - if (p->use_session) - p->run_input = true; - - p->start_input (); - - return TRUE; -} - - -int App::run() -{ - g_return_val_if_fail (!p->running, 0); - - p->running = TRUE; - - p->quit_handler_id = gtk_quit_add (1, (GtkFunction) Private::on_gtk_main_quit, p); - - g_timeout_add (100, (GSourceFunc) App::Private::check_signal, NULL); - -#ifndef __WIN32__ - p->sm_client = egg_sm_client_get (); - /* make it install log handler */ - g_option_group_free (egg_sm_client_get_option_group ()); - g_signal_connect_swapped (p->sm_client, "quit-requested", - G_CALLBACK (sm_quit_requested), p); - g_signal_connect_swapped (p->sm_client, "quit", - G_CALLBACK (sm_quit), p); - - if (EGG_SM_CLIENT_GET_CLASS (p->sm_client)->startup) - EGG_SM_CLIENT_GET_CLASS (p->sm_client)->startup (p->sm_client, NULL); -#endif // __WIN32__ - - g_idle_add_full (G_PRIORITY_DEFAULT_IDLE + 1, (GSourceFunc) emit_started, this, NULL); - - gtk_main (); - - return p->exit_status; -} - - -bool App::Private::try_quit() -{ - gboolean closed; - - if (!running) - return TRUE; - - in_try_quit = TRUE; - - if (!in_after_close_window) - { - saved_session_in_try_quit = TRUE; - save_session (); - } - - closed = _moo_editor_close_all (editor.gobj()); - - saved_session_in_try_quit = FALSE; - in_try_quit = FALSE; - - return closed; -} - -bool App::quit() -{ - if (p->in_try_quit || !p->running) - return TRUE; - - if (p->try_quit()) - { - p->do_quit(); - return TRUE; - } - - return FALSE; -} - -/** - * moo_app_quit: - **/ -gboolean -moo_app_quit (MooApp *app) -{ - g_return_val_if_fail (MOO_IS_APP (app), FALSE); - return App::get(*app).quit(); -} - - -void App::Private::install_common_actions() -{ - MooWindowClass *klass = MOO_WINDOW_CLASS (g_type_class_ref (MOO_TYPE_WINDOW)); - - g_return_if_fail (klass != NULL); - - moo_window_class_new_action (klass, "Preferences", NULL, - "display-name", GTK_STOCK_PREFERENCES, - "label", GTK_STOCK_PREFERENCES, - "tooltip", GTK_STOCK_PREFERENCES, - "stock-id", GTK_STOCK_PREFERENCES, - "closure-callback", prefs_dialog, - NULL); - - moo_window_class_new_action (klass, "About", NULL, - "label", GTK_STOCK_ABOUT, - "no-accel", TRUE, - "stock-id", GTK_STOCK_ABOUT, - "closure-callback", App::about_dialog, - NULL); - - moo_window_class_new_action (klass, "Help", NULL, - "label", GTK_STOCK_HELP, - "default-accel", MOO_APP_ACCEL_HELP, - "stock-id", GTK_STOCK_HELP, - "closure-callback", open_help, - NULL); - - moo_window_class_new_action (klass, "ReportBug", NULL, - "label", _("Report a Bug..."), - "closure-callback", report_bug, - NULL); - - moo_window_class_new_action (klass, "Quit", NULL, - "display-name", GTK_STOCK_QUIT, - "label", GTK_STOCK_QUIT, - "tooltip", GTK_STOCK_QUIT, - "stock-id", GTK_STOCK_QUIT, - "default-accel", MOO_APP_ACCEL_QUIT, - "closure-callback", moo_app_quit, - "closure-proxy-func", moo_app_instance, - NULL); - - g_type_class_unref (klass); -} - - -void App::Private::install_editor_actions () -{ -} - - -MooUiXml* App::Private::get_ui_xml () -{ - if (!ui_xml) - { - if (editor) - ui_xml.ref(moo_editor_get_ui_xml(editor.gobj())); - - if (!ui_xml) - ui_xml.set_new(moo_ui_xml_new()); - } - - return ui_xml.gobj(); -} - - -void App::Private::do_load_session (MooMarkupNode* xml) -{ - _moo_editor_load_session (editor.gobj(), xml); - app.signal_emit (signals[LOAD_SESSION], 0); -} - - -void App::Private::save_session () -{ - MooMarkupNode *root; - - if (session_file.empty()) - return; - - session.set_new (moo_markup_doc_new ("session")); - root = moo_markup_create_root_element (session.gobj(), "session"); - moo_markup_set_prop (root, "version", SESSION_VERSION); - - app.signal_emit (signals[SAVE_SESSION], 0); - _moo_editor_save_session (editor.gobj(), root); -} - -void App::Private::write_session () -{ - MooFileWriter *writer; - - if (session_file.empty()) - return; - - gstr filename = moo_get_user_cache_file (session_file); - - if (!session) - { - mgw_errno_t err; - mgw_unlink (filename, &err); - return; - } - - gerrp error; - - if ((writer = moo_config_writer_new (filename, FALSE, error))) - { - moo_markup_write_pretty (session.gobj(), writer, 1); - moo_file_writer_close (writer, error); - } - - if (error) - g_critical ("could not save session file %s: %s", filename, error->message); -} - -void App::load_session () -{ - MooMarkupNode *root; - const char *version; - - if (!p->use_session) - return; - - if (p->session_file.empty()) - { - if (!p->instance_name.empty()) - p->session_file.set_new(g_strdup_printf(MOO_NAMED_SESSION_XML_FILE_NAME, - p->instance_name.get())); - else - p->session_file.set_const(MOO_SESSION_XML_FILE_NAME); - } - - gstr session_file = moo_get_user_cache_file (p->session_file); - - gref_ptr doc; - gerrp error; - - if (!g_file_test (session_file, G_FILE_TEST_EXISTS) || - !(doc = gref_ptr::wrap_new (moo_markup_parse_file (session_file, &error)))) - { - if (error) - g_warning ("could not open session file %s: %s", - session_file, error->message); - - return; - } - - if (!(root = moo_markup_get_root_element (doc.gobj(), "session")) || - !(version = moo_markup_get_prop (root, "version"))) - g_warning ("malformed session file %s, ignoring", session_file); - else if (strcmp (version, SESSION_VERSION) != 0) - g_warning ("invalid session file version %s in %s, ignoring", - version, session_file); - else - { - p->session = doc; - p->do_load_session (root); - p->session = nullptr; - } -} - - -// static void -// moo_app_present (MooApp *app) -// { -// gpointer window = NULL; -// -// if (!window && app->priv->editor) -// window = moo_editor_get_active_window (app->priv->editor); -// -// if (window) -// moo_window_present (window, 0); -// } - - -// static void -// moo_app_open_uris (MooApp *app, -// const char *data, -// gboolean has_encoding) -// { -// char **uris; -// guint32 stamp; -// char *stamp_string; -// char *line_string; -// guint32 line; -// char *encoding = NULL; -// -// g_return_if_fail (strlen (data) > (has_encoding ? 32 : 16)); -// -// stamp_string = g_strndup (data, 8); -// stamp = strtoul (stamp_string, NULL, 16); -// line_string = g_strndup (data + 8, 8); -// line = strtoul (line_string, NULL, 16); -// -// if (line > G_MAXINT) -// line = 0; -// -// data += 16; -// -// if (has_encoding) -// { -// char *p; -// encoding = g_strndup (data, 16); -// p = strchr (encoding, ' '); -// if (p) -// *p = 0; -// data += 16; -// } -// -// uris = g_strsplit (data, "\r\n", 0); -// -// if (uris && *uris) -// { -// char **p; -// -// for (p = uris; p && *p && **p; ++p) -// { -// guint line_here = 0; -// guint options = 0; -// char *filename; -// -// filename = _moo_edit_uri_to_filename (*p, &line_here, &options); -// -// if (p != uris) -// line = 0; -// if (line_here) -// line = line_here; -// -// if (filename) -// moo_app_new_file (app, filename, encoding, line, options); -// -// g_free (filename); -// } -// } -// else -// { -// moo_app_new_file (app, NULL, encoding, 0, 0); -// } -// -// moo_editor_present (app->priv->editor, stamp); -// -// g_free (encoding); -// g_strfreev (uris); -// g_free (stamp_string); -// } - -void App::open_files (MooOpenInfoArray *files, guint32 stamp) -{ - if (!moo_open_info_array_is_empty (files)) - { - guint i; - MooOpenInfoArray *tmp = moo_open_info_array_copy (files); - for (i = 0; i < tmp->n_elms; ++i) - moo_open_info_add_flags (tmp->elms[i], MOO_OPEN_FLAG_CREATE_NEW); - moo_editor_open_files (p->editor.gobj(), tmp, NULL, NULL); - moo_open_info_array_free (tmp); - } - - moo_editor_present (p->editor.gobj(), stamp); -} - - -static MooAppCmdCode -get_cmd_code (char cmd) -{ - guint i; - - for (i = 1; i < CMD_LAST; ++i) - if (cmd == moo_app_cmd_chars[i]) - return MooAppCmdCode (i); - - g_return_val_if_reached (MooAppCmdCode (0)); -} - -void App::Private::exec_cmd (char cmd, - const char* data, - G_GNUC_UNUSED guint len) -{ - MooAppCmdCode code = get_cmd_code (cmd); - - switch (code) - { - case CMD_SCRIPT: - app.run_script (data); - break; - - case CMD_OPEN_FILES: - cmd_open_files (data); - break; - - default: - g_warning ("got unknown command %c %d", cmd, code); - } -} - - -void App::Private::open_help (GtkWidget *window) -{ - GtkWidget *focus = gtk_window_get_focus (GTK_WINDOW (window)); - moo_help_open_any (focus ? focus : window); -} - - -void App::Private::report_bug (GtkWidget *window) -{ - gboolean do_open = TRUE; - - moo_prefs_create_key (ASK_OPEN_BUG_URL_KEY, MOO_PREFS_STATE, G_TYPE_STRING, NULL); - - gstr version_escaped = g::uri_escape_string (MOO_DISPLAY_VERSION); - - gstr os = get_system_name (); - if (!os.empty()) - os = g::uri_escape_string (os); - - gstr url = gstr::printf ("http://mooedit.sourceforge.net/cgi-bin/report_bug.cgi?version=%s&os=%s", - version_escaped.get(), os.get()); - gstr message = gstr::printf (_("The following URL will be opened:\n\n%s\n\n" - "It contains medit version and your operating system name (%s)"), - url.get(), os.get()); - - const char *prefs_val = moo_prefs_get_string (ASK_OPEN_BUG_URL_KEY); - if (!prefs_val || strcmp (prefs_val, url) != 0) - { - do_open = moo_question_dialog (_("Open URL?"), message, window, GTK_RESPONSE_OK); - if (do_open) - moo_prefs_set_string (ASK_OPEN_BUG_URL_KEY, url); - } - - if (do_open) - moo_open_url (url); -} - - -void App::Private::save_prefs () -{ - gerrp error; - - if (!moo_prefs_save (rc_files[MOO_PREFS_RC], - rc_files[MOO_PREFS_STATE], - error)) - { - g_warning ("could not save config files: %s", moo_error_message (error)); - } -} - -void App::Private::prefs_dialog_apply () -{ - instance->p->save_prefs(); -} - - -GtkWidget* App::Private::create_prefs_dialog () -{ - MooPrefsDialog *dialog; - - /* Prefs dialog title */ - dialog = MOO_PREFS_DIALOG (moo_prefs_dialog_new (_("Preferences"))); - - moo_prefs_dialog_append_page (dialog, moo_edit_prefs_page_new_1 (editor.gobj())); - moo_prefs_dialog_append_page (dialog, moo_edit_prefs_page_new_2 (editor.gobj())); - moo_prefs_dialog_append_page (dialog, moo_edit_prefs_page_new_3 (editor.gobj())); - moo_prefs_dialog_append_page (dialog, moo_edit_prefs_page_new_4 (editor.gobj())); - moo_prefs_dialog_append_page (dialog, moo_edit_prefs_page_new_5 (editor.gobj())); - moo_plugin_attach_prefs (GTK_WIDGET (dialog)); - - g_signal_connect_after (dialog, "apply", - G_CALLBACK (prefs_dialog_apply), - NULL); - - return GTK_WIDGET (dialog); -} - - -void App::Private::prefs_dialog (GtkWidget *parent) -{ - g_return_if_fail (instance != nullptr); - GtkWidget *dialog = instance->p->create_prefs_dialog (); - g_return_if_fail (MOO_IS_PREFS_DIALOG (dialog)); - moo_prefs_dialog_run (MOO_PREFS_DIALOG (dialog), parent); -} - - -void App::Private::load_prefs () -{ - gerrp error; - char **sys_files; - - rc_files[MOO_PREFS_RC].set_new(moo_get_user_data_file (MOO_PREFS_XML_FILE_NAME)); - rc_files[MOO_PREFS_STATE].set_new(moo_get_user_cache_file (MOO_STATE_XML_FILE_NAME)); - - sys_files = moo_get_sys_data_files (MOO_PREFS_XML_FILE_NAME); - - if (!moo_prefs_load (sys_files, - rc_files[MOO_PREFS_RC], - rc_files[MOO_PREFS_STATE], - error)) - { - g_warning ("could not read config files: %s", moo_error_message (error)); - } - - g_strfreev (sys_files); -} - - -#define MOO_APP_CMD_VERSION "1.0" - -static MooOpenInfoArray * -moo_app_parse_files (const char *data, - guint32 *stamp) -{ - MooMarkupDoc *xml; - MooMarkupNode *root; - MooMarkupNode *node; - const char *version; - MooOpenInfoArray *files; - - *stamp = 0; - - xml = moo_markup_parse_memory (data, -1, NULL); - g_return_val_if_fail (xml != NULL, FALSE); - - if (!(root = moo_markup_get_root_element (xml, "moo-app-open-files")) || - !(version = moo_markup_get_prop (root, "version")) || - strcmp (version, MOO_APP_CMD_VERSION) != 0) - { - g_warning ("%s: invalid markup", G_STRFUNC); - moo_markup_doc_unref (xml); - return NULL; - } - - *stamp = moo_markup_uint_prop (root, "stamp", 0); - files = moo_open_info_array_new (); - - for (node = root->children; node != NULL; node = node->next) - { - const char *uri; - const char *encoding; - MooOpenInfo *info; - int line; - - if (!MOO_MARKUP_IS_ELEMENT (node)) - continue; - - if (strcmp (node->name, "file") != 0 || - !(uri = moo_markup_get_content (node)) || - !uri[0]) - { - g_critical ("%s: oops", G_STRFUNC); - continue; - } - - encoding = moo_markup_get_prop (node, "encoding"); - if (!encoding || !encoding[0]) - encoding = NULL; - - info = moo_open_info_new_uri (uri, encoding, -1, MOO_OPEN_FLAG_CREATE_NEW); - - line = moo_markup_int_prop (node, "line", 0); - if (line > 0) - moo_open_info_set_line (info, line - 1); - - if (moo_markup_bool_prop (node, "new-window", FALSE)) - moo_open_info_add_flags (info, MOO_OPEN_FLAG_NEW_WINDOW); - if (moo_markup_bool_prop (node, "new-tab", FALSE)) - moo_open_info_add_flags (info, MOO_OPEN_FLAG_NEW_TAB); - if (moo_markup_bool_prop (node, "reload", FALSE)) - moo_open_info_add_flags (info, MOO_OPEN_FLAG_RELOAD); - - moo_open_info_array_take (files, info); - } - - moo_markup_doc_unref (xml); - return files; -} - -void App::Private::cmd_open_files (const char *data) -{ - MooOpenInfoArray *files; - guint32 stamp; - files = moo_app_parse_files (data, &stamp); - app.open_files (files, stamp); - moo_open_info_array_free (files); -} - -G_GNUC_PRINTF(2, 3) static void -append_escaped (GString *str, const char *format, ...) -{ - va_list args; - char *escaped; - - va_start (args, format); - - escaped = g_markup_vprintf_escaped (format, args); - g_string_append (str, escaped); - g_free (escaped); - - va_end (args); -} - -bool App::send_files (MooOpenInfoArray *files, - guint32 stamp, - const char *pid) -{ - gboolean result; - GString *msg; - int i, c; - -#if 0 - _moo_message ("moo_app_send_files: got %d files to pid %s", - n_files, pid ? pid : "NONE"); -#endif - - msg = g_string_new (NULL); - g_string_append_printf (msg, "%s", - CMD_OPEN_FILES_S, MOO_APP_CMD_VERSION, stamp); - - for (i = 0, c = moo_open_info_array_get_size (files); i < c; ++i) - { - MooOpenInfo *info = files->elms[i]; - const char *encoding = moo_open_info_get_encoding (info); - int line = moo_open_info_get_line (info); - MooOpenFlags flags = moo_open_info_get_flags (info); - char *uri; - - g_string_append (msg, "= 0) - g_string_append_printf (msg, " line=\"%u\"", (guint) line + 1); - if (flags & MOO_OPEN_FLAG_NEW_WINDOW) - g_string_append_printf (msg, " new-window=\"true\""); - if (flags & MOO_OPEN_FLAG_NEW_TAB) - g_string_append_printf (msg, " new-tab=\"true\""); - if (flags & MOO_OPEN_FLAG_RELOAD) - g_string_append_printf (msg, " reload=\"true\""); - - uri = moo_open_info_get_uri (info); - append_escaped (msg, ">%s", uri); - g_free (uri); - } - - g_string_append (msg, ""); - - result = _moo_app_input_send_msg (pid, msg->str, msg->len); - - g_string_free (msg, TRUE); - return result; -} - -bool App::send_msg(const char* pid, const char* data, gssize len) -{ - return _moo_app_input_send_msg (pid, data, len); -} diff --git a/moo/mooapp/mooapp.h b/moo/mooapp/mooapp.h index 66222e92..4c9811fe 100644 --- a/moo/mooapp/mooapp.h +++ b/moo/mooapp/mooapp.h @@ -1,7 +1,7 @@ /* * mooapp/mooapp.h * - * Copyright (C) 2004-2016 by Yevgen Muntyan + * Copyright (C) 2004-2010 by Yevgen Muntyan * * This file is part of medit. medit is free software; you can * redistribute it and/or modify it under the terms of the @@ -13,7 +13,8 @@ * License along with medit. If not, see . */ -#pragma once +#ifndef MOO_APP_H +#define MOO_APP_H #include @@ -28,15 +29,17 @@ G_BEGIN_DECLS #define MOO_APP_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), MOO_TYPE_APP, MooAppClass)) -typedef struct MooApp MooApp; -typedef struct MooAppClass MooAppClass; +typedef struct _MooApp MooApp; +typedef struct _MooAppPrivate MooAppPrivate; +typedef struct _MooAppClass MooAppClass; -struct MooApp +struct _MooApp { - GObject object; + GObject parent; + MooAppPrivate *priv; }; -struct MooAppClass +struct _MooAppClass { GObjectClass parent_class; @@ -57,62 +60,41 @@ struct MooAppClass GType moo_app_get_type (void) G_GNUC_CONST; MooApp *moo_app_instance (void); + +gboolean moo_app_init (MooApp *app); +int moo_app_run (MooApp *app); gboolean moo_app_quit (MooApp *app); + +void moo_app_set_exit_status (MooApp *app, + int value); + +void moo_app_load_session (MooApp *app); + MooEditor *moo_app_get_editor (MooApp *app); +void moo_app_prefs_dialog (GtkWidget *parent); +void moo_app_about_dialog (GtkWidget *parent); + +char *moo_app_get_system_info (MooApp *app); + +MooUiXml *moo_app_get_ui_xml (MooApp *app); +void moo_app_set_ui_xml (MooApp *app, + MooUiXml *xml); + +gboolean moo_app_send_msg (const char *pid, + const char *data, + gssize len); + +gboolean moo_app_send_files (MooOpenInfoArray *files, + guint32 stamp, + const char *pid); +void moo_app_open_files (MooApp *app, + MooOpenInfoArray *files, + guint32 stamp); +void moo_app_run_script (MooApp *app, + const char *script); + G_END_DECLS -#ifdef __cplusplus - -#include - -namespace moo { -MOO_DEFINE_SIMPLE_GOBJ_CLASS(App, g::Object, MooApp, MOO_TYPE_APP); -} - -struct MeditApp : public moo::App -{ - MOO_CUSTOM_GOBJ_CLASS_DECL(MeditApp, moo::App) - -public: - struct StartupOptions - { - bool run_input = false; - int use_session = -1; - g::gstr instance_name; - }; - - MeditApp(const StartupOptions& opts); - ~MeditApp(); - - static MeditApp& instance(); - - bool init(); - int run(); - - bool quit(); - void set_exit_status(int value); - - void load_session(); - - MooEditor* get_editor(); - - static g::gstr get_system_info(); - static void about_dialog(GtkWidget* parent); - - static bool send_msg(const char* pid, const char* data, gssize len); - static bool send_files(MooOpenInfoArray* files, guint32 stamp, const char* pid); - - void open_files(MooOpenInfoArray* files, guint32 stamp); - void run_script(const char* script); - -protected: - virtual void init_plugins() {} - -private: - struct Private; - Private* p; -}; - -#endif // __cplusplus +#endif /* MOO_APP_H */ diff --git a/moo/mooapp/mooappabout.cpp b/moo/mooapp/mooappabout.c similarity index 76% rename from moo/mooapp/mooappabout.cpp rename to moo/mooapp/mooappabout.c index fa638988..8067d10a 100644 --- a/moo/mooapp/mooappabout.cpp +++ b/moo/mooapp/mooappabout.c @@ -36,10 +36,8 @@ #include #include -using namespace moo; - -static GtkDialog* about_dialog; -static GtkDialog* credits_dialog; +static gpointer about_dialog; +static gpointer credits_dialog; #undef MOO_USE_HTML #define MOO_USE_HTML 1 @@ -92,7 +90,7 @@ show_credits (void) if (credits_dialog) { if (about_dialog) - moo_window_set_parent (GTK_WIDGET (credits_dialog), GTK_WIDGET (about_dialog)); + moo_window_set_parent (credits_dialog, about_dialog); gtk_window_present (GTK_WINDOW (credits_dialog)); return; } @@ -108,7 +106,7 @@ show_credits (void) credits_dialog = gxml->CreditsDialog; g_return_if_fail (credits_dialog != NULL); - g_object_add_weak_pointer (G_OBJECT (credits_dialog), (void**)&credits_dialog); + g_object_add_weak_pointer (G_OBJECT (credits_dialog), &credits_dialog); g_signal_connect (credits_dialog, "response", G_CALLBACK (gtk_widget_destroy), NULL); #ifdef MOO_USE_HTML @@ -128,7 +126,7 @@ show_credits (void) gtk_text_buffer_insert_at_cursor (buffer, MOO_APP_CREDITS, -1); if (about_dialog) - moo_window_set_parent (GTK_WIDGET (credits_dialog), GTK_WIDGET (about_dialog)); + moo_window_set_parent (credits_dialog, about_dialog); gtk_window_present (GTK_WINDOW (credits_dialog)); } @@ -154,30 +152,31 @@ about_dialog_key_press (GtkWidget *dialog, if (event->keyval == GDK_s && (event->state & GDK_CONTROL_MASK)) { - g::gstr info = App::get_system_info (); - if (!info.empty()) + char *info = moo_app_get_system_info (moo_app_instance ()); + if (info) gtk_clipboard_set_text (gtk_widget_get_clipboard (dialog, GDK_SELECTION_CLIPBOARD), info, -1); + g_free (info); } return FALSE; } -static GtkDialog* +static GtkWidget * create_about_dialog (void) { AboutDialogXml *gxml; - GtkDialog *dialog; + GtkWidget *dialog; char *markup; GtkStockItem dummy; moo_glade_xml_register_type (MOO_TYPE_LINK_LABEL); gxml = about_dialog_xml_new (); - dialog = gxml->AboutDialog; + dialog = GTK_WIDGET (gxml->AboutDialog); g_signal_connect (dialog, "key-press-event", G_CALLBACK (about_dialog_key_press), NULL); - g_object_add_weak_pointer (G_OBJECT (dialog), (void**)&about_dialog); + g_object_add_weak_pointer (G_OBJECT (dialog), &about_dialog); g_signal_connect (dialog, "delete-event", G_CALLBACK (gtk_widget_hide_on_delete), NULL); markup = g_markup_printf_escaped ("%s %s", @@ -209,57 +208,67 @@ create_about_dialog (void) } -void App::about_dialog (GtkWidget *parent) +void +moo_app_about_dialog (GtkWidget *parent) { - if (!::about_dialog) - ::about_dialog = create_about_dialog (); + if (!about_dialog) + about_dialog = create_about_dialog (); if (parent) parent = gtk_widget_get_toplevel (parent); if (parent && GTK_IS_WINDOW (parent)) - moo_window_set_parent (GTK_WIDGET (::about_dialog), parent); + moo_window_set_parent (about_dialog, parent); - gtk_window_present (GTK_WINDOW (::about_dialog)); + gtk_window_present (GTK_WINDOW (about_dialog)); } -gstr App::get_system_info () +char * +moo_app_get_system_info (MooApp *app) { + GString *text; char **dirs, **p; + char *string; - strbuilder text; + g_return_val_if_fail (MOO_IS_APP (app), NULL); - text.append_printf ("%s-%s\n", MOO_APP_FULL_NAME, MOO_DISPLAY_VERSION); - text.append_printf ("OS: %s\n", get_system_name ()); - text.append_printf ("GTK version: %u.%u.%u\n", - gtk_major_version, - gtk_minor_version, - gtk_micro_version); - text.append_printf ("Built with GTK %d.%d.%d\n", - GTK_MAJOR_VERSION, - GTK_MINOR_VERSION, - GTK_MICRO_VERSION); + text = g_string_new (NULL); - text.append_printf ("libxml2: %s\n", LIBXML_DOTTED_VERSION); + g_string_append_printf (text, "%s-%s\n", MOO_APP_FULL_NAME, MOO_DISPLAY_VERSION); - text.append ("Data dirs: "); + string = get_system_name (); + g_string_append_printf (text, "OS: %s\n", string); + g_free (string); + + g_string_append_printf (text, "GTK version: %u.%u.%u\n", + gtk_major_version, + gtk_minor_version, + gtk_micro_version); + g_string_append_printf (text, "Built with GTK %d.%d.%d\n", + GTK_MAJOR_VERSION, + GTK_MINOR_VERSION, + GTK_MICRO_VERSION); + + g_string_append_printf (text, "libxml2: %s\n", LIBXML_DOTTED_VERSION); + + g_string_append (text, "Data dirs: "); dirs = moo_get_data_dirs (); for (p = dirs; p && *p; ++p) - text.append_printf ("%s'%s'", p == dirs ? "" : ", ", *p); - text.append ("\n"); + g_string_append_printf (text, "%s'%s'", p == dirs ? "" : ", ", *p); + g_string_append (text, "\n"); g_strfreev (dirs); - text.append ("Lib dirs: "); + g_string_append (text, "Lib dirs: "); dirs = moo_get_lib_dirs (); for (p = dirs; p && *p; ++p) - text.append_printf ("%s'%s'", p == dirs ? "" : ", ", *p); - text.append ("\n"); + g_string_append_printf (text, "%s'%s'", p == dirs ? "" : ", ", *p); + g_string_append (text, "\n"); g_strfreev (dirs); #ifdef MOO_BROKEN_GTK_THEME - text.append ("Broken gtk theme: yes\n"); + g_string_append (text, "Broken gtk theme: yes\n"); #endif - return text.release(); + return g_string_free (text, FALSE); } diff --git a/moo/mooapp/mooappabout.h b/moo/mooapp/mooappabout.h index 1e0e1e8f..a410561f 100644 --- a/moo/mooapp/mooappabout.h +++ b/moo/mooapp/mooappabout.h @@ -25,20 +25,16 @@ #endif #ifdef __WIN32__ -#include #include #endif -#include #include #include #include -using namespace moo; - #ifdef __WIN32__ -static gstr +static char * get_system_name (void) { OSVERSIONINFOEXW ver; @@ -47,36 +43,55 @@ get_system_name (void) ver.dwOSVersionInfoSize = sizeof (OSVERSIONINFOW); if (!GetVersionExW ((OSVERSIONINFOW*) &ver)) - return gstr::wrap_const ("Windows"); + return g_strdup ("Windows"); switch (ver.dwMajorVersion) { + case 4: /* Windows NT 4.0, Windows Me, Windows 98, or Windows 95 */ + switch (ver.dwMinorVersion) + { + case 0: /* Windows NT 4.0 or Windows95 */ + if (ver.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) + return g_strdup ("Windows 95"); + else + return g_strdup ("Windows NT 4.0"); + + case 10: + return g_strdup ("Windows 98"); + + case 90: + return g_strdup ("Windows 98"); + } + + break; + case 5: /* Windows Server 2003 R2, Windows Server 2003, Windows XP, or Windows 2000 */ switch (ver.dwMinorVersion) { case 0: - return gstr::wrap_const ("Windows 2000"); + return g_strdup ("Windows 2000"); case 1: - return gstr::wrap_const ("Windows XP"); + return g_strdup ("Windows XP"); case 2: - return gstr::wrap_const ("Windows Server 2003"); + return g_strdup ("Windows Server 2003"); } break; case 6: - if (!IsWindowsServer()) + memset (&ver, 0, sizeof (ver)); + ver.dwOSVersionInfoSize = sizeof (OSVERSIONINFOEXW); + + if (!GetVersionExW ((OSVERSIONINFOW*) &ver) || ver.wProductType == VER_NT_WORKSTATION) { switch (ver.dwMinorVersion) { case 0: - return gstr::wrap_const ("Windows Vista"); + return g_strdup ("Windows Vista"); case 1: - return gstr::wrap_const ("Windows 7"); + return g_strdup ("Windows 7"); case 2: - return gstr::wrap_const ("Windows 8"); - case 3: - return gstr::wrap_const("Windows 8.1"); + return g_strdup ("Windows 8"); } } else @@ -84,45 +99,23 @@ get_system_name (void) switch (ver.dwMinorVersion) { case 0: - return gstr::wrap_const ("Windows Server 2008"); + return g_strdup ("Windows Server 2008"); case 1: - return gstr::wrap_const ("Windows Server 2008 R2"); + return g_strdup ("Windows Server 2008 R2"); case 2: - return gstr::wrap_const("Windows Server 2012"); - case 3: - return gstr::wrap_const("Windows Server 2012 R2"); - } - } - - break; - - case 10: - if (!IsWindowsServer()) - { - switch (ver.dwMinorVersion) - { - case 0: - return gstr::wrap_const("Windows 10"); - } - } - else - { - switch (ver.dwMinorVersion) - { - case 0: - return gstr::wrap_const("Windows Server 2016"); + return g_strdup ("Windows Server 2012"); } } break; } - return IsWindowsServer() ? gstr::wrap_const("Windows Server") : gstr::wrap_const("Windows"); + return g_strdup ("Windows"); } #elif defined(HAVE_SYS_UTSNAME_H) -static gstr +static char * get_system_name (void) { struct utsname name; @@ -130,13 +123,13 @@ get_system_name (void) if (uname (&name) != 0) { MGW_ERROR_IF_NOT_SHARED_LIBC - mgw_errno_t err = { mgw_errno_value_t (errno) }; + mgw_errno_t err = { errno }; g_critical ("%s", mgw_strerror (err)); - return gstr::wrap_const ("unknown"); + return g_strdup ("unknown"); } - return gstr::printf ("%s %s (%s), %s", name.sysname, - name.release, name.version, name.machine); + return g_strdup_printf ("%s %s (%s), %s", name.sysname, + name.release, name.version, name.machine); } #else diff --git a/moo/mooapp/moohtml.cpp b/moo/mooapp/moohtml.c similarity index 97% rename from moo/mooapp/moohtml.cpp rename to moo/mooapp/moohtml.c index 48bdc814..bb00f929 100644 --- a/moo/mooapp/moohtml.cpp +++ b/moo/mooapp/moohtml.c @@ -18,7 +18,6 @@ #include "marshals.h" #include "mooutils/mooutils-misc.h" #include "mooutils/moocompat.h" -#include "moocpp/moocpp.h" #include #include #include @@ -27,8 +26,6 @@ #include -#include - #define DEFAULT_PAR_SPACING 6 @@ -63,8 +60,6 @@ struct _MooHtmlData { }; typedef enum { - MOO_HTML_ATTR_MASK_NONE = 0, - MOO_HTML_FG = 1 << 0, MOO_HTML_BG = 1 << 1, MOO_HTML_BOLD = 1 << 2, @@ -87,8 +82,6 @@ typedef enum { MOO_HTML_FONT_FACE = 1 << 17 } MooHtmlAttrMask; -MOO_DEFINE_FLAGS(MooHtmlAttrMask); - struct _MooHtmlAttr { MooHtmlAttrMask mask; @@ -416,15 +409,15 @@ moo_html_get_data (gpointer object) { MooHtmlData *data; - data = reinterpret_cast(g_object_get_data(G_OBJECT(object), "moo-html-data")); + data = g_object_get_data (object, "moo-html-data"); if (!data) { - init_funcs(); - data = moo_html_data_new(); - g_object_set_data_full(G_OBJECT(object), "moo-html-data", data, - (GDestroyNotify) moo_html_data_free); - g_signal_connect(object, "size-allocate", G_CALLBACK(moo_html_size_allocate_cb), NULL); + init_funcs (); + data = moo_html_data_new (); + g_object_set_data_full (object, "moo-html-data", data, + (GDestroyNotify) moo_html_data_free); + g_signal_connect (object, "size-allocate", G_CALLBACK (moo_html_size_allocate_cb), NULL); } return data; @@ -978,9 +971,9 @@ moo_html_create_tag (GtkTextView *view, { MooHtmlTag *tag; MooHtmlAttr real_attr; - MooHtmlData *data = moo_html_get_data(view); + MooHtmlData *data = moo_html_get_data (view); - g_return_val_if_fail(attr != NULL, NULL); + g_return_val_if_fail (attr != NULL, NULL); if (!attr->mask && !force) return parent; @@ -988,22 +981,22 @@ moo_html_create_tag (GtkTextView *view, if (parent && parent->attr) { real_attr = *parent->attr; - attr_compose(&real_attr, attr); + attr_compose (&real_attr, attr); } else { real_attr = *attr; } - tag = MOO_HTML_TAG(g_object_new(MOO_TYPE_HTML_TAG, nullptr)); - gtk_text_tag_table_add(gtk_text_buffer_get_tag_table(gtk_text_view_get_buffer(view)), - GTK_TEXT_TAG(tag)); - g_object_unref(tag); + tag = g_object_new (MOO_TYPE_HTML_TAG, (const char*) NULL); + gtk_text_tag_table_add (gtk_text_buffer_get_tag_table (gtk_text_view_get_buffer (view)), + GTK_TEXT_TAG (tag)); + g_object_unref (tag); if (tag->href) - data->href_tags = g_slist_prepend(data->href_tags, tag); + data->href_tags = g_slist_prepend (data->href_tags, tag); - attr_apply(&real_attr, tag, view); + attr_apply (&real_attr, tag, view); return tag; } @@ -1091,7 +1084,7 @@ moo_html_motion (GtkWidget *widget, { x = event->x; y = event->y; - state = GdkModifierType (event->state); + state = event->state; } if (state & (GDK_BUTTON1_MASK | GDK_BUTTON2_MASK | GDK_BUTTON3_MASK)) @@ -1159,7 +1152,7 @@ moo_html_get_tag (GtkTextIter *iter) { if (MOO_IS_HTML_TAG (l->data)) { - tag = MOO_HTML_TAG (l->data); + tag = l->data; break; } } @@ -1231,13 +1224,10 @@ moo_html_parse_url (const char *url, g_return_val_if_fail (url != NULL, FALSE); g_return_val_if_fail (scheme && base && anchor, FALSE); - regex = g_regex_new ("^([a-zA-Z]+:(//)?)?([^#]*)(#(.*))?$", - GRegexCompileFlags (0), - GRegexMatchFlags (0), - nullptr); + regex = g_regex_new ("^([a-zA-Z]+:(//)?)?([^#]*)(#(.*))?$", 0, 0, NULL); g_return_val_if_fail (regex != NULL, FALSE); - if (!g_regex_match (regex, url, GRegexMatchFlags (0), &match_info)) + if (!g_regex_match (regex, url, 0, &match_info)) { g_match_info_free (match_info); g_regex_unref (regex); @@ -1267,7 +1257,7 @@ moo_html_goto_anchor (GtkTextView *view, g_return_val_if_fail (anchor != NULL, FALSE); - mark = reinterpret_cast (g_hash_table_lookup (data->anchors, anchor)); + mark = g_hash_table_lookup (data->anchors, anchor); if (!mark) { @@ -1317,8 +1307,7 @@ moo_html_size_allocate_real (GtkWidget *widget, window = gtk_text_view_get_window (GTK_TEXT_VIEW (widget), GTK_TEXT_WINDOW_TEXT); g_return_if_fail (window != NULL); - child_width = gdk_window_get_width (window); - height = gdk_window_get_height (window); + gdk_drawable_get_size (window, &child_width, &height); border_width = gtk_container_get_border_width (GTK_CONTAINER (widget)); child_width -= 2 * border_width + 2 * widget->style->xthickness + gtk_text_view_get_left_margin (GTK_TEXT_VIEW (widget)) + @@ -1327,7 +1316,7 @@ moo_html_size_allocate_real (GtkWidget *widget, for (l = data->rulers; l != NULL; l = l->next) { - GtkWidget *ruler = GTK_WIDGET (l->data); + GtkWidget *ruler = l->data; gtk_widget_set_size_request (ruler, child_width, -1); } } @@ -1765,7 +1754,7 @@ get_format_elm_attr (xmlNode *node) g_hash_table_insert (elms, (char*) "small", attr); } - return reinterpret_cast (g_hash_table_lookup (elms, node->name)); + return g_hash_table_lookup (elms, node->name); } @@ -1778,7 +1767,7 @@ static void add_func__ (const char *static_elm_name, ProcessElm func) { - g_hash_table_insert (proc_elm_funcs__, (char*) static_elm_name, (void*) func); + g_hash_table_insert (proc_elm_funcs__, (char*) static_elm_name, func); } static void @@ -2162,7 +2151,7 @@ process_font_elm (GtkTextView *view, color = GET_PROP (elm, "color"); face = GET_PROP (elm, "face"); - attr.mask = MOO_HTML_ATTR_MASK_NONE; + attr.mask = 0; attr.font_face = NULL; if (size__) diff --git a/moo/mooapp/moolinklabel.cpp b/moo/mooapp/moolinklabel.c similarity index 100% rename from moo/mooapp/moolinklabel.cpp rename to moo/mooapp/moolinklabel.c diff --git a/moo/moocpp/Makefile.incl b/moo/moocpp/Makefile.incl deleted file mode 100644 index 989e421e..00000000 --- a/moo/moocpp/Makefile.incl +++ /dev/null @@ -1,26 +0,0 @@ -moo_sources += \ - moocpp/gboxed.h \ - moocpp/gobjectutils.h \ - moocpp/gobjptr.h \ - moocpp/gobjref.h \ - moocpp/gobjinfo.h \ - moocpp/gobjrawptr.h \ - moocpp/gobjtypes.h \ - moocpp/gobjtypes-glib.h \ - moocpp/gobjtypes-gio.h \ - moocpp/gobjtypes-gtk.h \ - moocpp/gobjtypes-glib.cpp \ - moocpp/gobjtypes-gio.cpp \ - moocpp/gobjtypes-gtk.cpp \ - moocpp/gobjwrapper.h \ - moocpp/gparam.h \ - moocpp/grefptr.h \ - moocpp/gutil.h \ - moocpp/gutil.cpp \ - moocpp/memutils.h \ - moocpp/moocpp.h \ - moocpp/strutils.h \ - moocpp/strutils.cpp \ - moocpp/utils.h - -# -%- use-tabs:true, indent-width: 8, strip:true -%- diff --git a/moo/moocpp/gboxed.h b/moo/moocpp/gboxed.h deleted file mode 100644 index f78177e6..00000000 --- a/moo/moocpp/gboxed.h +++ /dev/null @@ -1,58 +0,0 @@ -/* - * moocpp/gboxed.h - * - * Copyright (C) 2004-2016 by Yevgen Muntyan - * - * This file is part of medit. medit 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. - * - * You should have received a copy of the GNU Lesser General Public - * License along with medit. If not, see . - */ - -#pragma once - -#ifndef __cplusplus -#error "This is a C++ header" -#endif - -#include -#include -#include - -namespace moo { - -template -class gboxed_helper -{ -public: - static T* array_elm_copy(T* obj) - { - return new T(*obj); - } - - static gpointer copy(gpointer p) - { - return array_elm_copy(reinterpret_cast(p)); - } - - static void array_elm_free(T* obj) - { - delete obj; - } - - static void free(gpointer p) - { - array_elm_free(reinterpret_cast(p)); - } -}; - -#define MOO_DEFINE_BOXED_CPP_TYPE(Object, object) \ - MOO_DEFINE_BOXED_TYPE(Object, object, \ - gboxed_helper::copy, \ - gboxed_helper::free) - -} // namespace moo diff --git a/moo/moocpp/moocpp.cmake b/moo/moocpp/moocpp.cmake deleted file mode 100644 index 3a1d738f..00000000 --- a/moo/moocpp/moocpp.cmake +++ /dev/null @@ -1,5 +0,0 @@ -SET(moocpp_sources - moocpp/moocpp.cmake - moocpp/moocpp.h - moocpp/utils.h -) diff --git a/moo/moocpp/moocpp.h b/moo/moocpp/moocpp.h deleted file mode 100644 index d2539ddd..00000000 --- a/moo/moocpp/moocpp.h +++ /dev/null @@ -1,36 +0,0 @@ -/* - * moocpp/moocpp.h - * - * Copyright (C) 2004-2016 by Yevgen Muntyan - * - * This file is part of medit. medit 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. - * - * You should have received a copy of the GNU Lesser General Public - * License along with medit. If not, see . - */ - -#pragma once - -#include -#include - -#ifdef __cplusplus - -#include - -#include - -namespace moo { - -using gstr = g::gstr; -using gerrp = g::gerrp; - -} - -#endif __cplusplus - -#include diff --git a/moo/moocpp/old/gobjinfo.h b/moo/moocpp/old/gobjinfo.h deleted file mode 100644 index 96720c1d..00000000 --- a/moo/moocpp/old/gobjinfo.h +++ /dev/null @@ -1,134 +0,0 @@ -/* - * moocpp/gobjinfo.h - * - * Copyright (C) 2004-2016 by Yevgen Muntyan - * - * This file is part of medit. medit 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. - * - * You should have received a copy of the GNU Lesser General Public - * License along with medit. If not, see . - */ - -#pragma once - -#ifdef __cplusplus - -#include -#include -#include - -namespace moo { - -void init_gobj_system (); - -/////////////////////////////////////////////////////////////////////////////////////////// -// -// gobjinfo -// - -template -struct gobj_is_subclass -{ - static const bool value = false; -}; - -// Generic implementation, all we know it's a subclass of GObject; we don't -// even know its GType. This implementation is needed so that it's possible -// to have gobj_ptr without having to define gobjinfo for it. -template -struct gobjinfo -{ - static const bool is_gobject = true; - using object_type = Object; - using parent_type = GObject; - // object_g_type() is not defined -}; - -template<> -struct gobjinfo -{ - static const bool is_gobject = true; - using object_type = GObject; - static GType object_g_type() { return G_TYPE_OBJECT; } -}; - -template -inline GType get_g_type() -{ - return gobjinfo::object_g_type(); -} - -template<> -struct gobj_is_subclass -{ - static const bool value = true; - static GObject* down_cast(GObject* o) { return o; } -}; - -#define MOO_DEFINE_GOBJ_TYPE(Object, Parent, g_type) \ -namespace moo { \ - \ - template<> \ - struct gobjinfo \ - { \ - static const bool is_gobject = true; \ - using object_type = Object; \ - using parent_type = Parent; \ - static GType object_g_type() { return g_type; } \ - }; \ - \ - template<> \ - struct gobj_is_subclass \ - { \ - static const bool value = true; \ - static Object* down_cast(Object* o) { return o; } \ - }; \ - \ - template \ - struct gobj_is_subclass \ - { \ - static const bool value = true; \ - static Super* down_cast(Object *o) \ - { \ - static_assert(gobj_is_subclass::value, \ - "Super is not a superclass of " #Object); \ - Parent* p = reinterpret_cast(o); \ - Super* s = gobj_is_subclass::down_cast(p); \ - return s; \ - } \ - }; \ -} \ - -#define MOO_DEFINE_GIFACE_TYPE(Iface, g_type) \ - MOO_DEFINE_GOBJ_TYPE(Iface, GObject, g_type) - -#define MOO_GOBJ_IMPLEMENTS_IFACE(Object, Iface) \ -namespace moo { \ - \ - template<> \ - struct gobj_is_subclass \ - { \ - static const bool value = true; \ - static Iface* down_cast(Object *o) \ - { \ - return reinterpret_cast(o); \ - } \ - }; \ -} \ - - -#define MOO_DEFINE_NON_GOBJ_TYPE(Object) \ -namespace moo { \ - template<> struct gobjinfo { static const bool is_gobject = false; }; \ -} - -template -using gobj_parent_type = typename gobjinfo::parent_type; - -} // namespace moo - -#endif // __cplusplus diff --git a/moo/moocpp/old/gobjptr.h b/moo/moocpp/old/gobjptr.h deleted file mode 100644 index 5dd0f508..00000000 --- a/moo/moocpp/old/gobjptr.h +++ /dev/null @@ -1,313 +0,0 @@ -/* - * moocpp/gobjptr.h - * - * Copyright (C) 2004-2016 by Yevgen Muntyan - * - * This file is part of medit. medit 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. - * - * You should have received a copy of the GNU Lesser General Public - * License along with medit. If not, see . - */ - -#pragma once - -#include "moocpp/gobjrawptr.h" -#include "moocpp/grefptr.h" -#include "moocpp/gobjectutils.h" - -namespace moo { - -/////////////////////////////////////////////////////////////////////////////////////////// -// -// gobj_ptr -// - -template -class gobj_ptr -{ - using ref_type = gobj_ref; - - static_assert(gobjinfo::is_gobject, "Not a GObject"); - -public: - gobj_ptr() {} - - gobj_ptr(Object* obj, ref_transfer policy) - { - assign(obj, policy); - } - - gobj_ptr(const nullptr_t&) - : gobj_ptr() - { - } - - static gobj_ptr wrap_new(Object* obj) - { - return gobj_ptr(obj, ref_transfer::take_ownership); - } - - static gobj_ptr wrap(Object* obj) - { - return gobj_ptr(obj, ref_transfer::make_copy); - } - - ~gobj_ptr() - { - reset(); - } - - void ref(Object* obj) - { - assign(obj, ref_transfer::make_copy); - } - - void set(Object* obj) - { - assign(obj, ref_transfer::make_copy); - } - - void set_new(Object* obj) - { - assign(obj, ref_transfer::take_ownership); - } - - Object* release() - { - auto* tmp = gobj(); - m_ref._set_gobj(nullptr); - return tmp; - } - - void reset() - { - auto* tmp = gobj(); - if (tmp) - { - m_ref._set_gobj(nullptr); - g_object_unref(tmp); - } - } - - // Implicit conversion to non-const Object* is dangerous because there is a lot - // of code still which frees/steals objects directly. For example: - // FooObject* tmp = x->s; - // x->s = NULL; - // g_object_unref (tmp); - operator const Object* () const { return gobj(); } - operator ref_type*() const { return m_ref.self(); } - ref_type* operator->() const { return m_ref.self(); } - ref_type& operator*() { return m_ref; } - const ref_type& operator*() const { return m_ref; } - - // These are nasty. Because of ref_type* conversion this can be converted to void*, - // which in turn can be passed to g_object_ref or g_free, etc. - operator void*() const = delete; - operator const void*() const = delete; - - Object* gobj() const { return m_ref.gobj(); } - Object** pp() { return m_ref._pp(); } - - template - Super* gobj() const - { - return gobj_is_subclass::down_cast(m_ref.gobj()); - } - - template - operator const Super* () const { return gobj(); } - - template - operator gobj_ptr () const { return gobj_ptr::wrap (gobj ()); } - - operator bool() const { return gobj() != nullptr; } - bool operator!() const { return gobj() == nullptr; } - - gobj_ptr(const gobj_ptr& other) - : gobj_ptr() - { - ref(other.gobj()); - } - - gobj_ptr& operator=(const gobj_ptr& other) - { - ref(other.gobj()); - return *this; - } - - gobj_ptr(gobj_ptr&& other) - : gobj_ptr() - { - m_ref._set_gobj(other.gobj()); - other.m_ref._set_gobj(nullptr); - } - - gobj_ptr& operator=(const nullptr_t&) - { - reset(); - return *this; - } - - gobj_ptr& operator=(gobj_ptr&& other) - { - if (gobj() != other.gobj()) - { - assign(other.gobj(), ref_transfer::take_ownership); - other.m_ref._set_gobj(nullptr); - } - - return *this; - } - -private: - void assign(Object* obj, ref_transfer policy) - { - g_assert(!obj || G_IS_OBJECT(obj)); - - if (gobj() != obj) - { - Object* tmp = gobj(); - m_ref._set_gobj(obj); - - if (obj) - { - if (policy == ref_transfer::make_copy) - g_object_ref(obj); - else if (g_object_is_floating(obj)) - g_object_ref_sink(obj); - } - - if (tmp) - g_object_unref(tmp); - } - } - -private: - mutable gobj_ref m_ref; -}; - -template -inline gobj_ptr wrap_new(Object *obj) -{ - return gobj_ptr::wrap_new(obj); -} - -template -inline gobj_ptr wrap(Object* obj) -{ - return gobj_ptr::wrap(obj); -} - -template -inline gobj_ptr wrap(const gobj_raw_ptr& obj) -{ - return gobj_ptr::wrap(obj); -} - -template -inline gobj_ref wrap (Object& obj) -{ - return *wrap (&obj); -} - -template -inline gobj_ptr create_gobj(GType obj_type, Args&& ...args) -{ - return wrap_new(reinterpret_cast(g_object_new(obj_type, std::forward(args)...))); -} - -template -inline gobj_ptr create_gobj(Args&& ...args) -{ - // object_g_type() will produce a compiler error if the type wasn't registered - return create_gobj(gobjinfo::object_g_type(), std::forward(args)...); -} - -template -inline gobj_ptr create_gobj() -{ - // object_g_type() will produce a compiler error if the type wasn't registered - return create_gobj(gobjinfo::object_g_type(), nullptr); -} - -template -Object* up_cast (Super* o) -{ - return G_TYPE_CHECK_INSTANCE_CAST ((o), gobjinfo::object_g_type(), Object); -} - -} // namespace moo - -template -void g_object_unref(const moo::gobj_ptr&) = delete; -template -void g_free(const moo::gobj_ptr&) = delete; - -template -inline bool operator==(const moo::gobj_ptr& p, const nullptr_t&) -{ - return p.gobj() == nullptr; -} - -template -inline bool operator==(const nullptr_t&, const moo::gobj_ptr& p) -{ - return p.gobj() == nullptr; -} - -template -inline bool operator==(const moo::gobj_ptr& p1, const moo::gobj_ptr& p2) -{ - return p1.gobj() == p2.gobj(); -} - -template -inline bool operator==(const moo::gobj_ptr& p1, const Y* p2) -{ - return p1.gobj() == p2; -} - -template -inline bool operator==(const X* p1, const moo::gobj_ptr& p2) -{ - return p1 == p2.gobj(); -} - -template -inline bool operator==(const moo::gobj_ptr& p1, const moo::gobj_raw_ptr& p2) -{ - return p1.gobj() == p2.gobj(); -} - -template -inline bool operator==(const moo::gobj_raw_ptr& p1, const moo::gobj_ptr& p2) -{ - return p1.gobj() == p2.gobj(); -} - -template -bool operator!=(const moo::gobj_ptr& p1, const moo::gobj_ptr& p2) -{ - return !(p1 == p2); -} - -template -bool operator!=(const moo::gobj_ptr& p1, const Y& p2) -{ - return !(p1 == p2); -} - -template -bool operator!=(const X& p1, const moo::gobj_ptr& p2) -{ - return !(p1 == p2); -} - -template bool operator==(const moo::gobj_ptr& p1, int) = delete; -template bool operator==(int, const moo::gobj_ptr& p2) = delete; -template bool operator!=(const moo::gobj_ptr& p1, int) = delete; -template bool operator!=(int, const moo::gobj_ptr& p2) = delete; diff --git a/moo/moocpp/old/gobjrawptr.h b/moo/moocpp/old/gobjrawptr.h deleted file mode 100644 index 7fb674a4..00000000 --- a/moo/moocpp/old/gobjrawptr.h +++ /dev/null @@ -1,147 +0,0 @@ -/* - * moocpp/gobjrawptr.h - * - * Copyright (C) 2004-2016 by Yevgen Muntyan - * - * This file is part of medit. medit 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. - * - * You should have received a copy of the GNU Lesser General Public - * License along with medit. If not, see . - */ - -#pragma once - -#include "moocpp/gobjref.h" - -namespace moo { - -/////////////////////////////////////////////////////////////////////////////////////////// -// -// gobj_raw_ptr -// - -template -class gobj_raw_ptr -{ - using ref_type = gobj_ref; - -public: - gobj_raw_ptr(Object* obj = nullptr) { m_ref._set_gobj(obj); } - - operator Object*() const { return gobj(); } - operator GTypeInstance*() const { return reinterpret_cast(gobj()); } - operator gpointer() const { return gobj(); } - operator gobj_ref*() const { return m_ref.self(); } - - ref_type* operator->() const { return m_ref.self(); } - ref_type& operator*() const { return m_ref; } - - Object* gobj() const { return m_ref.gobj(); } - void set(Object* p) { m_ref._set_gobj(p); } - - template - Super* gobj() const - { - return gobj_is_subclass::down_cast(m_ref.gobj()); - } - - template - void set(Subclass* p) - { - set(gobj_is_subclass::down_cast(p)); - } - - operator bool() const { return gobj() != nullptr; } - bool operator!() const { return gobj() == nullptr; } - - gobj_raw_ptr(const gobj_raw_ptr& other) = default; - gobj_raw_ptr& operator=(const gobj_raw_ptr& other) = default; - - gobj_raw_ptr(gobj_raw_ptr&& other) - : m_ref(std::move(other.m_ref)) - { - other.set(nullptr); - } - - gobj_raw_ptr& operator=(gobj_raw_ptr&& other) - { - m_ref = std::move(other.m_ref); - return *this; - } - - template - gobj_raw_ptr& operator=(T* p) - { - set(p); - return *this; - } - -private: - mutable gobj_ref m_ref; -}; - -} // namespace moo - -template -inline bool operator==(const moo::gobj_raw_ptr& p, const nullptr_t&) -{ - return p.gobj() == nullptr; -} - -template -inline bool operator==(const nullptr_t&, const moo::gobj_raw_ptr& p) -{ - return p.gobj() == nullptr; -} - -template -inline bool operator==(const moo::gobj_raw_ptr& p1, const moo::gobj_raw_ptr& p2) -{ - return p1.gobj() == p2.gobj(); -} - -template -inline bool operator==(const moo::gobj_raw_ptr& p1, const X* p2) -{ - return p1.gobj() == p2; -} - -template -inline bool operator==(const moo::gobj_raw_ptr& p1, X* p2) -{ - return p1.gobj() == p2; -} - -template -inline bool operator==(const X* p1, const moo::gobj_raw_ptr& p2) -{ - return p1 == p2.gobj(); -} - -template -inline bool operator==(X* p1, const moo::gobj_raw_ptr& p2) -{ - return p1 == p2.gobj(); -} - -template -bool operator!=(const moo::gobj_raw_ptr& p1, const moo::gobj_raw_ptr& p2) -{ - return !(p1 == p2); -} - -template -bool operator!=(const moo::gobj_raw_ptr& p1, const Y& p2) -{ - return !(p1 == p2); -} - -template -bool operator!=(const X& p1, const moo::gobj_raw_ptr& p2) -{ - return !(p1 == p2); -} diff --git a/moo/moocpp/old/gobjref.h b/moo/moocpp/old/gobjref.h deleted file mode 100644 index af9ccbc9..00000000 --- a/moo/moocpp/old/gobjref.h +++ /dev/null @@ -1,174 +0,0 @@ -/* - * moocpp/gobjref.h - * - * Copyright (C) 2004-2016 by Yevgen Muntyan - * - * This file is part of medit. medit 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. - * - * You should have received a copy of the GNU Lesser General Public - * License along with medit. If not, see . - */ - -#pragma once - -#include "moocpp/gobjinfo.h" - -namespace moo { - -template -class gobj_ref; -template -class gobj_ptr; -template -class gobj_raw_ptr; -template -class gobj_wrapper; - -/////////////////////////////////////////////////////////////////////////////////////////// -// -// gobj_ref -// - -class gobj_ref_base -{ -protected: - gobj_ref_base() : m_gobj(nullptr) {} - using object_type = GObject; - -public: - gobj_ref_base(const gobj_ref_base&) = default; - gobj_ref_base& operator=(const gobj_ref_base&) = default; - - gobj_ref_base(gobj_ref_base&& other) - : m_gobj(other.m_gobj) - { - other.m_gobj = nullptr; - } - - gobj_ref_base& operator=(gobj_ref_base&& other) - { - m_gobj = other.m_gobj; - other.m_gobj = nullptr; - return *this; - } - - GObject* gobj() const { return m_gobj; } - operator GObject&() const { return *m_gobj; } - operator GTypeInstance&() const { return *reinterpret_cast(m_gobj); } - -protected: - GObject* raw_gobj() const { return const_cast(m_gobj); } - - void** _pp () - { - g_return_val_if_fail(m_gobj == nullptr, nullptr); - return reinterpret_cast(&m_gobj); - } - -private: - template friend class gobj_ptr; - template friend class gobj_raw_ptr; - template friend class gobj_ref; - template friend class gobj_wrapper; - - void _set_gobj(gpointer gobj) { m_gobj = reinterpret_cast(gobj); } - -private: - GObject* m_gobj; -}; - -template<> -class gobj_ref; // : public gobj_ref_base - -#define MOO_DEFINE_GOBJREF_METHODS_IMPL(Object, Super) \ - using super = Super; \ - using object_type = Object; \ - using ptrtype = gobj_ptr; \ - \ -protected: \ - friend class gobj_ptr; \ - friend class gobj_raw_ptr; \ - \ - gobj_ref() {} \ - \ - object_type** _pp () \ - { \ - return reinterpret_cast(gobj_ref_base::_pp()); \ - } \ - \ -public: \ - gobj_ref(object_type& gobj) \ - { \ - super::_set_gobj(&gobj); \ - } \ - \ - object_type* gobj() const \ - { \ - return reinterpret_cast(super::raw_gobj()); \ - } \ - \ - template \ - X* gobj() const \ - { \ - return nc_gobj(); \ - } \ - \ - object_type* nc_gobj() const \ - { \ - return const_cast(gobj()); \ - } \ - \ - template \ - X* nc_gobj() const \ - { \ - object_type* o = const_cast(gobj()); \ - return gobj_is_subclass::down_cast(o); \ - } \ - \ - gobj_ref* self() { return this; } \ - const gobj_ref* self() const { return this; } \ - \ - operator object_type&() const { return *gobj(); } \ - gobj_raw_ptr operator&() const { return nc_gobj(); } \ - \ - gobj_ref(const gobj_ref&) = default; \ - gobj_ref& operator=(const gobj_ref&) = default; \ - \ - gobj_ref(gobj_ref&& other) \ - : super(std::move(static_cast(other))) \ - { \ - } \ - \ - gobj_ref& operator=(gobj_ref&& other) \ - { \ - super::operator=(std::move(static_cast(other))); \ - return *this; \ - } - -#define MOO_DEFINE_GOBJREF_METHODS(Object) \ - MOO_DEFINE_GOBJREF_METHODS_IMPL(Object, gobj_ref>) - - -template -using gobj_ref_parent = gobj_ref>; - -// Generic implementation, falls back to the parent type's gobj_ref implementation -// if that's known, or to GObject's one, coming from the generic gobjinfo. -template -class gobj_ref : public virtual gobj_ref_parent -{ -public: - MOO_DEFINE_GOBJREF_METHODS(Object) -}; - -} // namespace moo - -// Make sure these aren't called in code ported from pure glib C -template -void g_object_unref(const moo::gobj_ref*) = delete; -template -void g_free(const moo::gobj_ref*) = delete; diff --git a/moo/moocpp/old/gobjtypes-gio.cpp b/moo/moocpp/old/gobjtypes-gio.cpp deleted file mode 100644 index aab582d6..00000000 --- a/moo/moocpp/old/gobjtypes-gio.cpp +++ /dev/null @@ -1,330 +0,0 @@ -/* - * moocpp/gobjtypes-gio.cpp - * - * Copyright (C) 2004-2016 by Yevgen Muntyan - * - * This file is part of medit. medit 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. - * - * You should have received a copy of the GNU Lesser General Public - * License along with medit. If not, see . - */ - -#include "moocpp/moocpp.h" - -using namespace moo; -using namespace moo::g; - -////////////////////////////////////////////////////////////////////////////////////////////////////////// -// -// GFile -// - -FilePtr File::new_for_path(const char* path) -{ - return wrap_new(g_file_new_for_path(path)); -} - -FilePtr File::new_for_uri(const char* uri) -{ - return wrap_new(g_file_new_for_uri(uri)); -} - -FilePtr File::new_for_commandline_arg(const char* arg) -{ - return wrap_new(g_file_new_for_commandline_arg(arg)); -} - -FilePtr File::parse_name(const char* parse_name) -{ - return wrap_new(g_file_parse_name(parse_name)); -} - -FilePtr File::dup() -{ - return FilePtr::wrap_new(g_file_dup(nc_gobj())); -} - -bool File::equal(File file2) -{ - return g_file_equal(nc_gobj(), file2.gobj()); -} - -gstr File::get_basename() -{ - return gstr::wrap_new(g_file_get_basename(nc_gobj())); -} - -gstr File::get_path() -{ - return gstr::wrap_new(g_file_get_path(nc_gobj())); -} - -gstr File::get_uri() -{ - return gstr::wrap_new(g_file_get_uri(nc_gobj())); -} - -gstr File::get_parse_name() -{ - return gstr::wrap_new(g_file_get_parse_name(nc_gobj())); -} - -FilePtr File::get_parent() -{ - return FilePtr::wrap_new(g_file_get_parent(nc_gobj())); -} - -bool File::has_parent(File parent) -{ - return g_file_has_parent(nc_gobj(), parent.gobj()); -} - -FilePtr File::get_child(const char* name) -{ - return FilePtr::wrap_new(g_file_get_child(nc_gobj(), name)); -} - -FilePtr File::get_child_for_display_name(const char* display_name, gerrp& error) -{ - return FilePtr::wrap_new(g_file_get_child_for_display_name(nc_gobj(), display_name, &error)); -} - -bool File::has_prefix(File prefix) -{ - return g_file_has_prefix(nc_gobj(), prefix.gobj()); -} - -gstr File::get_relative_path(File descendant) -{ - return gstr::wrap_new(g_file_get_relative_path(nc_gobj(), descendant.gobj())); -} - -FilePtr File::resolve_relative_path(const char *relative_path) -{ - return FilePtr::wrap_new(g_file_resolve_relative_path(nc_gobj(), relative_path)); -} - -bool File::is_native() -{ - return g_file_is_native(nc_gobj()); -} - -bool File::has_uri_scheme(const char *uri_scheme) -{ - return g_file_has_uri_scheme(nc_gobj(), uri_scheme); -} - -gstr File::get_uri_scheme() -{ - return gstr::wrap_new(g_file_get_uri_scheme(nc_gobj())); -} - -g::FileInputStreamPtr File::read(GCancellable* cancellable, gerrp& error) -{ - return wrap_new (g_file_read(gobj(), cancellable, &error)); -} - -g::FileOutputStreamPtr File::append_to(GFileCreateFlags flags, GCancellable* cancellable, gerrp& error) -{ - return wrap_new (g_file_append_to(gobj(), flags, cancellable, &error)); -} - -g::FileOutputStreamPtr File::create(GFileCreateFlags flags, GCancellable* cancellable, gerrp& error) -{ - return wrap_new (g_file_create(gobj(), flags, cancellable, &error)); -} - -g::FileOutputStreamPtr File::replace(const char* etag, gboolean make_backup, GFileCreateFlags flags, GCancellable* cancellable, gerrp& error) -{ - return wrap_new (g_file_replace(gobj(), etag, make_backup, flags, cancellable, &error)); -} - -g::FileIOStreamPtr File::open_readwrite(GCancellable* cancellable, gerrp& error) -{ - return wrap_new (g_file_open_readwrite(gobj(), cancellable, &error)); -} - -g::FileIOStreamPtr File::create_readwrite(GFileCreateFlags flags, GCancellable* cancellable, gerrp& error) -{ - return wrap_new (g_file_create_readwrite(gobj(), flags, cancellable, &error)); -} - -g::FileIOStreamPtr File::replace_readwrite(const char* etag, gboolean make_backup, GFileCreateFlags flags, GCancellable* cancellable, gerrp& error) -{ - return wrap_new (g_file_replace_readwrite(gobj(), etag, make_backup, flags, cancellable, &error)); -} - -bool File::query_exists(GCancellable* cancellable) -{ - return g_file_query_exists(nc_gobj(), cancellable); -} - -GFileType File::query_file_type(GFileQueryInfoFlags flags, GCancellable* cancellable) -{ - return g_file_query_file_type(nc_gobj(), flags, cancellable); -} - -FileInfoPtr File::query_info(const char *attributes, GFileQueryInfoFlags flags, GCancellable* cancellable, gerrp& error) -{ - return wrap_new(g_file_query_info(nc_gobj(), attributes, flags, cancellable, &error)); -} - -FileInfoPtr File::query_filesystem_info(const char *attributes, GCancellable* cancellable, gerrp& error) -{ - return wrap_new(g_file_query_filesystem_info(nc_gobj(), attributes, cancellable, &error)); -} - -GFileEnumerator* File::enumerate_children(const char *attributes, GFileQueryInfoFlags flags, GCancellable* cancellable, gerrp& error) -{ - return g_file_enumerate_children(nc_gobj(), attributes, flags, cancellable, &error); -} - -FilePtr File::set_display_name(const char* display_name, GCancellable* cancellable, gerrp& error) -{ - return FilePtr::wrap_new(g_file_set_display_name(nc_gobj(), display_name, cancellable, &error)); -} - -bool File::delete_(GCancellable* cancellable, gerrp& error) -{ - return g_file_delete(nc_gobj(), cancellable, &error); -} - -bool File::trash(GCancellable* cancellable, gerrp& error) -{ - return g_file_trash(nc_gobj(), cancellable, &error); -} - -bool File::copy(File destination, GFileCopyFlags flags, GCancellable* cancellable, GFileProgressCallback progress_callback, gpointer progress_callback_data, gerrp& error) -{ - return g_file_copy(nc_gobj(), destination.gobj(), flags, cancellable, progress_callback, progress_callback_data, &error); -} - -bool File::move(File destination, GFileCopyFlags flags, GCancellable* cancellable, GFileProgressCallback progress_callback, gpointer progress_callback_data, gerrp& error) -{ - return g_file_move(nc_gobj(), destination.gobj(), flags, cancellable, progress_callback, progress_callback_data, &error); -} - -bool File::make_directory(GCancellable* cancellable, gerrp& error) -{ - return g_file_make_directory(nc_gobj(), cancellable, &error); -} - -bool File::make_directory_with_parents(GCancellable* cancellable, gerrp& error) -{ - return g_file_make_directory_with_parents(nc_gobj(), cancellable, &error); -} - -bool File::make_symbolic_link(const char *symlink_value, GCancellable* cancellable, gerrp& error) -{ - return g_file_make_symbolic_link(nc_gobj(), symlink_value, cancellable, &error); -} - -bool File::load_contents(GCancellable* cancellable, char** contents, gsize* length, char** etag_out, gerrp& error) -{ - return g_file_load_contents(nc_gobj(), cancellable, contents, length, etag_out, &error); -} - -bool File::replace_contents(const char* contents, gsize length, const char* etag, gboolean make_backup, GFileCreateFlags flags, char** new_etag, GCancellable* cancellable, gerrp& error) -{ - return g_file_replace_contents(nc_gobj(), contents, length, etag, make_backup, flags, new_etag, cancellable, &error); -} - - -////////////////////////////////////////////////////////////////////////////////////////////////////////// -// -// GOutputStream -// - -gssize OutputStream::write(const void* buffer, gsize count, GCancellable* cancellable, gerrp& error) -{ - return g_output_stream_write(gobj(), buffer, count, cancellable, &error); -} - -bool OutputStream::write_all(const void* buffer, gsize count, gsize* bytes_written, GCancellable* cancellable, gerrp& error) -{ - return g_output_stream_write_all(gobj(), buffer, count, bytes_written, cancellable, &error); -} - -gssize OutputStream::splice(g::InputStream source, GOutputStreamSpliceFlags flags, GCancellable* cancellable, gerrp& error) -{ - return g_output_stream_splice(gobj(), source.gobj(), flags, cancellable, &error); -} - -bool OutputStream::flush(GCancellable* cancellable, gerrp& error) -{ - return g_output_stream_flush(gobj(), cancellable, &error); -} - -bool OutputStream::close(GCancellable* cancellable, gerrp& error) -{ - return g_output_stream_close(gobj(), cancellable, &error); -} - -void OutputStream::write_async(const void* buffer, gsize count, int io_priority, GCancellable* cancellable, GAsyncReadyCallback callback, gpointer user_data) -{ - g_output_stream_write_async(gobj(), buffer, count, io_priority, cancellable, callback, user_data); -} - -gssize OutputStream::write_finish(GAsyncResult* result, gerrp& error) -{ - return g_output_stream_write_finish(gobj(), result, &error); -} - -void OutputStream::splice_async(g::InputStream source, GOutputStreamSpliceFlags flags, int io_priority, GCancellable* cancellable, GAsyncReadyCallback callback, gpointer user_data) -{ - g_output_stream_splice_async(gobj(), source.gobj(), flags, io_priority, cancellable, callback, user_data); -} - -gssize OutputStream::splice_finish(GAsyncResult* result, gerrp& error) -{ - return g_output_stream_splice_finish(gobj(), result, &error); -} - -void OutputStream::flush_async(int io_priority, GCancellable* cancellable, GAsyncReadyCallback callback, gpointer user_data) -{ - g_output_stream_flush_async(gobj(), io_priority, cancellable, callback, user_data); -} - -bool OutputStream::flush_finish(GAsyncResult* result, gerrp& error) -{ - return g_output_stream_flush_finish(gobj(), result, &error); -} - -void OutputStream::close_async(int io_priority, GCancellable* cancellable, GAsyncReadyCallback callback, gpointer user_data) -{ - g_output_stream_close_async(gobj(), io_priority, cancellable, callback, user_data); -} - -bool OutputStream::close_finish(GAsyncResult* result, gerrp& error) -{ - return g_output_stream_close_finish(gobj(), result, &error); -} - -bool OutputStream::is_closed() -{ - return g_output_stream_is_closed(gobj()); -} - -bool OutputStream::is_closing() -{ - return g_output_stream_is_closing(gobj()); -} - -bool OutputStream::has_pending() -{ - return g_output_stream_has_pending(gobj()); -} - -bool OutputStream::set_pending(gerrp& error) -{ - return g_output_stream_set_pending(gobj(), &error); -} - -void OutputStream::clear_pending() -{ - g_output_stream_clear_pending(gobj()); -} diff --git a/moo/moocpp/old/gobjtypes-gio.h b/moo/moocpp/old/gobjtypes-gio.h deleted file mode 100644 index c6ac6bad..00000000 --- a/moo/moocpp/old/gobjtypes-gio.h +++ /dev/null @@ -1,225 +0,0 @@ -/* - * moocpp/gobjtypes-gio.h - * - * Copyright (C) 2004-2016 by Yevgen Muntyan - * - * This file is part of medit. medit 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. - * - * You should have received a copy of the GNU Lesser General Public - * License along with medit. If not, see . - */ - -#pragma once - -#include -#include - -#ifdef __cplusplus - -#include "moocpp/gobjtypes-glib.h" -#include "moocpp/strutils.h" - -MOO_DEFINE_GOBJ_TYPE(GFile, GObject, G_TYPE_FILE) -MOO_DEFINE_GOBJ_TYPE(GFileInfo, GObject, G_TYPE_FILE_INFO) - -MOO_DEFINE_GOBJ_TYPE(GOutputStream, GObject, G_TYPE_OUTPUT_STREAM) -MOO_DEFINE_GOBJ_TYPE(GFileOutputStream, GOutputStream, G_TYPE_FILE_OUTPUT_STREAM) -MOO_DEFINE_GOBJ_TYPE(GInputStream, GObject, G_TYPE_INPUT_STREAM) -MOO_DEFINE_GOBJ_TYPE(GFileInputStream, GInputStream, G_TYPE_FILE_INPUT_STREAM) -MOO_DEFINE_GOBJ_TYPE(GIOStream, GObject, G_TYPE_IO_STREAM) -MOO_DEFINE_GOBJ_TYPE(GFileIOStream, GIOStream, G_TYPE_FILE_IO_STREAM) - -MOO_DECLARE_CUSTOM_GOBJ_TYPE(GFile) -MOO_DECLARE_CUSTOM_GOBJ_TYPE(GOutputStream) - -namespace moo { - -namespace g { - -MOO_GOBJ_TYPEDEFS(File, GFile); -MOO_GOBJ_TYPEDEFS(FileInfo, GFileInfo); -MOO_GOBJ_TYPEDEFS(OutputStream, GOutputStream); -MOO_GOBJ_TYPEDEFS(FileOutputStream, GFileOutputStream); -MOO_GOBJ_TYPEDEFS(InputStream, GInputStream); -MOO_GOBJ_TYPEDEFS(FileInputStream, GFileInputStream); -MOO_GOBJ_TYPEDEFS(IOStream, GIOStream); -MOO_GOBJ_TYPEDEFS(FileIOStream, GFileIOStream); - -} // namespace g - -template<> -class gobj_ref : public virtual gobj_ref_parent -{ -public: - MOO_DEFINE_GOBJREF_METHODS(GFile) - - static g::FilePtr new_for_path (const char* path); - static g::FilePtr new_for_uri (const char* uri); - static g::FilePtr new_for_commandline_arg (const char* arg); - static g::FilePtr parse_name (const char* parse_name); - - g::FilePtr dup (); - - bool equal (g::File file2); - gstr get_basename (); - gstr get_path (); - gstr get_uri (); - gstr get_parse_name (); - g::FilePtr get_parent (); - bool has_parent (g::File parent); - g::FilePtr get_child (const char* name); - g::FilePtr get_child_for_display_name (const char* display_name, - gerrp& error); - bool has_prefix (g::File prefix); - gstr get_relative_path (g::File descendant); - g::FilePtr resolve_relative_path (const char *relative_path); - bool is_native (); - bool has_uri_scheme (const char *uri_scheme); - gstr get_uri_scheme (); - g::FileInputStreamPtr read (GCancellable* cancellable, - gerrp& error); - g::FileOutputStreamPtr append_to (GFileCreateFlags flags, - GCancellable* cancellable, - gerrp& error); - g::FileOutputStreamPtr create (GFileCreateFlags flags, - GCancellable* cancellable, - gerrp& error); - g::FileOutputStreamPtr replace (const char *etag, - gboolean make_backup, - GFileCreateFlags flags, - GCancellable* cancellable, - gerrp& error); - g::FileIOStreamPtr open_readwrite (GCancellable* cancellable, - gerrp& error); - g::FileIOStreamPtr create_readwrite (GFileCreateFlags flags, - GCancellable* cancellable, - gerrp& error); - g::FileIOStreamPtr replace_readwrite (const char *etag, - gboolean make_backup, - GFileCreateFlags flags, - GCancellable* cancellable, - gerrp& error); - bool query_exists (GCancellable* cancellable); - GFileType query_file_type (GFileQueryInfoFlags flags, - GCancellable* cancellable); - g::FileInfoPtr query_info (const char *attributes, - GFileQueryInfoFlags flags, - GCancellable* cancellable, - gerrp& error); - g::FileInfoPtr query_filesystem_info (const char *attributes, - GCancellable* cancellable, - gerrp& error); - GFileEnumerator* enumerate_children (const char *attributes, - GFileQueryInfoFlags flags, - GCancellable* cancellable, - gerrp& error); - g::FilePtr set_display_name (const char* display_name, - GCancellable* cancellable, - gerrp& error); - bool delete_ (GCancellable* cancellable, - gerrp& error); - bool trash (GCancellable* cancellable, - gerrp& error); - bool copy (g::File destination, - GFileCopyFlags flags, - GCancellable* cancellable, - GFileProgressCallback progress_callback, - gpointer progress_callback_data, - gerrp& error); - bool move (g::File destination, - GFileCopyFlags flags, - GCancellable* cancellable, - GFileProgressCallback progress_callback, - gpointer progress_callback_data, - gerrp& error); - bool make_directory (GCancellable* cancellable, - gerrp& error); - bool make_directory_with_parents (GCancellable* cancellable, - gerrp& error); - bool make_symbolic_link (const char *symlink_value, - GCancellable* cancellable, - gerrp& error); - - bool load_contents (GCancellable* cancellable, - char** contents, - gsize* length, - char** etag_out, - gerrp& error); - bool replace_contents (const char* contents, - gsize length, - const char* etag, - gboolean make_backup, - GFileCreateFlags flags, - char** new_etag, - GCancellable* cancellable, - gerrp& error); -}; - - -template<> -class gobj_ref : public virtual gobj_ref_parent -{ -public: - MOO_DEFINE_GOBJREF_METHODS(GOutputStream) - - gssize write (const void *buffer, - gsize count, - GCancellable *cancellable, - gerrp& error); - bool write_all (const void *buffer, - gsize count, - gsize *bytes_written, - GCancellable *cancellable, - gerrp& error); - gssize splice (g::InputStream source, - GOutputStreamSpliceFlags flags, - GCancellable *cancellable, - gerrp& error); - bool flush (GCancellable *cancellable, - gerrp& error); - bool close (GCancellable *cancellable, - gerrp& error); - void write_async (const void *buffer, - gsize count, - int io_priority, - GCancellable *cancellable, - GAsyncReadyCallback callback, - gpointer user_data); - gssize write_finish (GAsyncResult *result, - gerrp& error); - void splice_async (g::InputStream source, - GOutputStreamSpliceFlags flags, - int io_priority, - GCancellable *cancellable, - GAsyncReadyCallback callback, - gpointer user_data); - gssize splice_finish (GAsyncResult *result, - gerrp& error); - void flush_async (int io_priority, - GCancellable *cancellable, - GAsyncReadyCallback callback, - gpointer user_data); - bool flush_finish (GAsyncResult *result, - gerrp& error); - void close_async (int io_priority, - GCancellable *cancellable, - GAsyncReadyCallback callback, - gpointer user_data); - bool close_finish (GAsyncResult *result, - gerrp& error); - - bool is_closed (); - bool is_closing (); - bool has_pending (); - bool set_pending (gerrp& error); - void clear_pending (); -}; - - -} // namespace moo - -#endif // __cplusplus diff --git a/moo/moocpp/old/gobjtypes-glib.cpp b/moo/moocpp/old/gobjtypes-glib.cpp deleted file mode 100644 index b94952e8..00000000 --- a/moo/moocpp/old/gobjtypes-glib.cpp +++ /dev/null @@ -1,194 +0,0 @@ -/* - * moocpp/gobjtypes-glib.cpp - * - * Copyright (C) 2004-2016 by Yevgen Muntyan - * - * This file is part of medit. medit 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. - * - * You should have received a copy of the GNU Lesser General Public - * License along with medit. If not, see . - */ - -#include "moocpp/moocpp.h" - -using namespace moo; -using namespace g; - -void extern_g_free(gpointer p) -{ - g_free(p); -} - -void extern_g_object_unref(gpointer o) -{ - g_object_unref(o); -} - -void extern_g_strfreev(char** p) -{ - if (p) - g_strfreev (p); -} - - -void moo::init_gobj_system () -{ -} - - -GQuark gobj_wrapper_base::qdata_key = g_quark_from_static_string ("__moo_gobj_wrapper__"); - -gobj_wrapper_base& gobj_wrapper_base::get(Object g) -{ - void* o = g.get_data(qdata_key); - g_assert(o != nullptr); - return *reinterpret_cast(o); -} - -gobj_wrapper_base::gobj_wrapper_base(gobj_ref g) -{ - g.set_data(qdata_key, this, free_qdata); -} - -gobj_wrapper_base::~gobj_wrapper_base() -{ -} - -void gobj_wrapper_base::free_qdata(gpointer d) -{ - gobj_wrapper_base* self = reinterpret_cast(d); - delete self; -} - - -gulong Object::connect(const char *detailed_signal, GCallback c_handler, void *data) -{ - return g_signal_connect(gobj(), detailed_signal, c_handler, data); -} - -gulong Object::connect_swapped(const char *detailed_signal, GCallback c_handler, void *data) -{ - return g_signal_connect_swapped(gobj(), detailed_signal, c_handler, data); -} - -void Object::signal_emit_by_name(const char* detailed_signal, ...) -{ - guint signal_id; - GQuark detail; - g_return_if_fail(g_signal_parse_name(detailed_signal, - G_OBJECT_TYPE(gobj()), - &signal_id, &detail, - true)); - - va_list args; - va_start(args, detailed_signal); - g_signal_emit_valist(gobj(), signal_id, detail, args); - va_end(args); -} - -void Object::signal_emit(guint signal_id, GQuark detail, ...) -{ - va_list args; - va_start(args, detail); - g_signal_emit_valist(gobj(), signal_id, detail, args); - va_end(args); -} - -bool Object::signal_has_handler_pending(guint signal_id, GQuark detail, bool may_be_blocked) -{ - return g_signal_has_handler_pending(gobj(), signal_id, detail, may_be_blocked); -} - -gulong Object::signal_connect_closure_by_id(guint signal_id, GQuark detail, GClosure* closure, bool after) -{ - return g_signal_connect_closure_by_id(gobj(), signal_id, detail, closure, after); -} - -gulong Object::signal_connect_closure(const char* detailed_signal, GClosure* closure, bool after) -{ - return g_signal_connect_closure(gobj(), detailed_signal, closure, after); -} - -gulong Object::signal_connect_data(const char* detailed_signal, GCallback c_handler, gpointer data, GClosureNotify destroy_data, GConnectFlags connect_flags) -{ - return g_signal_connect_data(gobj(), detailed_signal, c_handler, data, destroy_data, connect_flags); -} - -void Object::signal_handler_block(gulong handler_id) -{ - g_signal_handler_block(gobj(), handler_id); -} - -void Object::signal_handler_unblock(gulong handler_id) -{ - g_signal_handler_unblock(gobj(), handler_id); -} - -void Object::signal_handler_disconnect(gulong handler_id) -{ - g_signal_handler_disconnect(gobj(), handler_id); -} - -gulong Object::signal_handler_find(GSignalMatchType mask, guint signal_id, GQuark detail, GClosure* closure, gpointer func, gpointer data) -{ - return g_signal_handler_find(gobj(), mask, signal_id, detail, closure, func, data); -} - -guint Object::signal_handlers_block_matched(GSignalMatchType mask, guint signal_id, GQuark detail, GClosure* closure, gpointer func, gpointer data) -{ - return g_signal_handlers_block_matched(gobj(), mask, signal_id, detail, closure, func, data); -} - -guint Object::signal_handlers_unblock_matched(GSignalMatchType mask, guint signal_id, GQuark detail, GClosure* closure, gpointer func, gpointer data) -{ - return g_signal_handlers_unblock_matched(gobj(), mask, signal_id, detail, closure, func, data); -} - -guint Object::signal_handlers_disconnect_matched(GSignalMatchType mask, guint signal_id, GQuark detail, GClosure* closure, gpointer func, gpointer data) -{ - return g_signal_handlers_disconnect_matched(gobj(), mask, signal_id, detail, closure, func, data); -} - -void Object::set_data(const char* key, gpointer value, GDestroyNotify destroy) -{ - g_object_set_data_full(gobj(), key, value, destroy); -} - -void Object::set_data(GQuark q, gpointer data, GDestroyNotify destroy) -{ - g_object_set_qdata_full(gobj(), q, data, destroy); -} - -void* Object::get_data(const char* key) -{ - return g_object_get_data(gobj(), key); -} - -void* Object::get_data(GQuark q) -{ - return g_object_get_qdata(gobj(), q); -} - -void Object::set_property(const gchar *property_name, const GValue *value) -{ - g_object_set_property(gobj(), property_name, value); -} - -void Object::notify(const char* property_name) -{ - g_object_notify(gobj(), property_name); -} - -void Object::freeze_notify() -{ - g_object_freeze_notify(gobj()); -} - -void Object::thaw_notify() -{ - g_object_thaw_notify(gobj()); -} diff --git a/moo/moocpp/old/gobjtypes-glib.h b/moo/moocpp/old/gobjtypes-glib.h deleted file mode 100644 index ac54b307..00000000 --- a/moo/moocpp/old/gobjtypes-glib.h +++ /dev/null @@ -1,134 +0,0 @@ -/* - * moocpp/gobjtypes-glib.h - * - * Copyright (C) 2004-2016 by Yevgen Muntyan - * - * This file is part of medit. medit 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. - * - * You should have received a copy of the GNU Lesser General Public - * License along with medit. If not, see . - */ - -#pragma once - -#include -#include - -#ifdef __cplusplus - -#include "moocpp/gobjptr.h" -#include "moocpp/gobjectutils.h" - -#include - -#define MOO_GOBJ_TYPEDEFS(CppObject, CObject) \ - using CppObject = ::moo::gobj_ref; \ - using CppObject##Ptr = ::moo::gobj_ptr; \ - using CppObject##RawPtr = ::moo::gobj_raw_ptr; \ - -#define MOO_GIFACE_TYPEDEFS(CppObject, CObject) \ - MOO_GOBJ_TYPEDEFS(CppObject, CObject) - -#define MOO_DECLARE_CUSTOM_GOBJ_TYPE(CObject) \ -namespace moo { \ -template<> class gobj_ref; \ -} - -MOO_DEFINE_FLAGS(GSignalFlags); -MOO_DEFINE_FLAGS(GConnectFlags); -MOO_DEFINE_FLAGS(GSpawnFlags); -MOO_DEFINE_FLAGS(GLogLevelFlags); -MOO_DEFINE_FLAGS(GRegexCompileFlags); -MOO_DEFINE_FLAGS(GIOCondition); - -namespace moo { - -/////////////////////////////////////////////////////////////////////////////////////////// -// -// GObject -// - -template<> -class gobj_ref : public gobj_ref_base -{ -public: - MOO_DEFINE_GOBJREF_METHODS_IMPL(GObject, gobj_ref_base) - - gulong connect (const char* detailed_signal, GCallback c_handler, void* data); - gulong connect_swapped (const char* detailed_signal, GCallback c_handler, void* data); - - void signal_emit_by_name (const char* detailed_signal, ...); - void signal_emit (guint signal_id, GQuark detail, ...); - - bool signal_has_handler_pending (guint signal_id, GQuark detail, bool may_be_blocked); - gulong signal_connect_closure_by_id (guint signal_id, GQuark detail, GClosure* closure, bool after); - gulong signal_connect_closure (const char* detailed_signal, GClosure* closure, bool after); - gulong signal_connect_data (const char* detailed_signal, GCallback c_handler, gpointer data, GClosureNotify destroy_data, GConnectFlags connect_flags); - void signal_handler_block (gulong handler_id); - void signal_handler_unblock (gulong handler_id); - void signal_handler_disconnect (gulong handler_id); - bool signal_handler_is_connected (gulong handler_id); - gulong signal_handler_find (GSignalMatchType mask, guint signal_id, GQuark detail, GClosure* closure, gpointer func, gpointer data); - guint signal_handlers_block_matched (GSignalMatchType mask, guint signal_id, GQuark detail, GClosure* closure, gpointer func, gpointer data); - guint signal_handlers_unblock_matched (GSignalMatchType mask, guint signal_id, GQuark detail, GClosure* closure, gpointer func, gpointer data); - guint signal_handlers_disconnect_matched (GSignalMatchType mask, guint signal_id, GQuark detail, GClosure* closure, gpointer func, gpointer data); - guint signal_handlers_disconnect_by_func (GCallback c_handler, void* data); - - void* get_data (const char* key); - void* get_data (GQuark q); - void set_data (const char* key, gpointer value, GDestroyNotify destroy = nullptr); - void set_data (GQuark q, gpointer value, GDestroyNotify destroy = nullptr); - - void set_property (const char* property_name, const GValue* value); - - template - void set (const char* prop, const T& value) - { - g_object_set (gobj (), prop, cpp_vararg_value_fixer::apply (value), nullptr); - } - - template - void set (const char* prop, const T& value, Args&&... args) - { - set (prop, value); - set (std::forward (args)...); - } - - void get (const char* prop, bool& dest) - { - gboolean val; - g_object_get (gobj (), prop, &val, nullptr); - dest = val; - } - - template - void get (const char* prop, T&& dest) - { - g_object_get (gobj (), prop, cpp_vararg_dest_fixer::apply (std::forward (dest)), nullptr); - } - - template - void get (const char* prop, T&& dest, Args&&... args) - { - get (prop, std::forward (dest)); - get (std::forward (args)...); - } - - void notify (const char* property_name); - void freeze_notify (); - void thaw_notify (); -}; - -namespace g { - -MOO_GOBJ_TYPEDEFS(Object, GObject); - -} // namespace g - -} // namespace moo - -#endif // __cplusplus diff --git a/moo/moocpp/old/gobjtypes-gtk.cpp b/moo/moocpp/old/gobjtypes-gtk.cpp deleted file mode 100644 index 7cefe210..00000000 --- a/moo/moocpp/old/gobjtypes-gtk.cpp +++ /dev/null @@ -1,1332 +0,0 @@ -/* - * moocpp/gobjtypes-gtk.cpp - * - * Copyright (C) 2004-2016 by Yevgen Muntyan - * - * This file is part of medit. medit 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. - * - * You should have received a copy of the GNU Lesser General Public - * License along with medit. If not, see . - */ - -#include "moocpp/moocpp.h" - -using namespace moo; -using namespace moo::gtk; - -#if 0 - -namespace moo { - -namespace _test { - -void test() -{ - ListStorePtr m1 = wrap_new (gtk_list_store_new (1, G_TYPE_STRING)); - TreeStorePtr m2 = wrap_new (gtk_tree_store_new (1, G_TYPE_STRING)); - TreeModelPtr m3 = wrap_new (GTK_TREE_MODEL (gtk_tree_store_new (1, G_TYPE_STRING))); - ListStorePtr m4 = ListStore::create ({ G_TYPE_STRING }); - - if (true) - return; - - //gobj_ptr m4 = m1; - - //create_cpp_gobj(); - //init_cpp_gobj(a); - - //GtkObject* xyz = nullptr; - //init_cpp_gobj(xyz); - - //create_cpp_gobj(GTK_TYPE_TOOLBAR); - - { - gobj_ptr p; - gobj_ref r = *p; - GtkObject* o1 = r.gobj(); - GtkObject* o2 = p->gobj(); - g_assert(o1 == o2); - GObject* o = p.gobj(); - g_assert(o == nullptr); - GtkObject* x = p.gobj(); - GObject* y = p.gobj(); - g_assert((void*) x == (void*) y); - const GObject* c1 = p; - const GtkObject* c2 = p; - g_assert((void*) c1 == (void*) c2); - } - - { - gobj_ptr p = wrap_new(gtk_widget_new(0, "blah", nullptr, nullptr)); - gobj_ref r = *p; - GtkWidget* o1 = r.gobj(); - GtkWidget* o2 = p->gobj(); - g_assert(o1 == o2); - GtkWidget* x = p.gobj(); - GtkWidget* y = p.gobj(); - GtkObject* z = p.gobj(); - GObject* t = p.gobj(); - g_assert((void*) x == (void*) y); - g_assert((void*) z == (void*) t); - const GObject* c1 = p; - const GtkObject* c2 = p; - const GtkWidget* c3 = p; - g_assert((void*) c1 == (void*) c2); - g_assert((void*) c1 == (void*) c3); - - gobj_ref or(*p.gobj()); - or.freeze_notify(); - p->freeze_notify(); - - gobj_raw_ptr rp = p.gobj(); - } -} - -} // namespace _test -} // namespace moo - -#endif // 0 - - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// -// GtkObject -// - -void -Object::destroy () -{ - gtk_object_destroy (gobj ()); -} - - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// -// GtkTreeModel -// - -GtkTreeModelFlags -TreeModel::get_flags () -{ - return gtk_tree_model_get_flags (gobj ()); -} - -int -TreeModel::get_n_columns () -{ - return gtk_tree_model_get_n_columns (gobj ()); -} - -GType -TreeModel::get_column_type (int index_) -{ - return gtk_tree_model_get_column_type (gobj (), index_); -} - -bool -TreeModel::get_iter (GtkTreeIter& iter, const GtkTreePath& path) -{ - return gtk_tree_model_get_iter (gobj (), &iter, const_cast(&path)); -} - -bool -TreeModel::get_iter_from_string (GtkTreeIter& iter, const char* path_string) -{ - return gtk_tree_model_get_iter_from_string (gobj (), &iter, path_string); -} - -gstr -TreeModel::get_string_from_iter (const GtkTreeIter& iter) -{ - return gstr::wrap_new (gtk_tree_model_get_string_from_iter (gobj (), const_cast(&iter))); -} - -bool -TreeModel::get_iter_first (GtkTreeIter& iter) -{ - return gtk_tree_model_get_iter_first (gobj (), &iter); -} - -GtkTreePath* -TreeModel::get_path (const GtkTreeIter& iter) -{ - return gtk_tree_model_get_path (gobj (), const_cast(&iter)); -} - -void -TreeModel::get_value (const GtkTreeIter& iter, int column, GValue* value) -{ - gtk_tree_model_get_value (gobj (), const_cast(&iter), column, value); -} - -bool -TreeModel::iter_next (GtkTreeIter& iter) -{ - return gtk_tree_model_iter_next (gobj (), &iter); -} - -bool -TreeModel::iter_children (GtkTreeIter& iter, const GtkTreeIter& parent) -{ - return gtk_tree_model_iter_children (gobj (), &iter, const_cast(&parent)); -} - -bool -TreeModel::iter_has_child (const GtkTreeIter& iter) -{ - return gtk_tree_model_iter_has_child (gobj (), const_cast(&iter)); -} - -int -TreeModel::iter_n_children (const GtkTreeIter& iter) -{ - return gtk_tree_model_iter_n_children (gobj (), const_cast(&iter)); -} - -bool -TreeModel::iter_nth_child (GtkTreeIter& iter, const GtkTreeIter& parent, int n) -{ - return gtk_tree_model_iter_nth_child (gobj (), &iter, const_cast(&parent), n); -} - -bool -TreeModel::iter_parent (GtkTreeIter& iter, const GtkTreeIter& child) -{ - return gtk_tree_model_iter_parent (gobj (), &iter, const_cast(&child)); -} - - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// -// GtkListStore -// - -ListStorePtr -ListStore::create (size_t n_types, const GType* types) -{ - g_return_val_if_fail (types != nullptr, nullptr); - g_return_val_if_fail (n_types != 0, nullptr); - return wrap_new (gtk_list_store_newv (n_types, const_cast(types))); -} - -void -ListStore::set_value (const GtkTreeIter& iter, - int column, - GValue* value) -{ - gtk_list_store_set_value (gobj (), const_cast(&iter), column, value); -} - -void -ListStore::set_valuesv (const GtkTreeIter& iter, - int* columns, - GValue* values, - int n_values) -{ - gtk_list_store_set_valuesv (gobj (), const_cast(&iter), columns, values, n_values); -} - -bool -ListStore::remove (GtkTreeIter& iter) -{ - return gtk_list_store_remove (gobj (), &iter); -} - -void -ListStore::insert (GtkTreeIter& iter, - int position) -{ - gtk_list_store_insert (gobj (), &iter, position); -} - -void -ListStore::insert_before (GtkTreeIter& iter, - GtkTreeIter& sibling) -{ - gtk_list_store_insert_before (gobj (), &iter, &sibling); -} - -void -ListStore::insert_after (GtkTreeIter& iter, - GtkTreeIter& sibling) -{ - gtk_list_store_insert_after (gobj (), &iter, &sibling); -} - -//void -//ListStore::insert_with_values (GtkTreeIter* iter, -// int position, -// ...) -//{ -// gtk_list_store_insert_with_values (gobj (), &iter, position, ...); -//} -// -//void -//ListStore::insert_with_values (GtkTreeIter* iter, -// int position, -// int* columns, -// GValue* values, -// int n_values) -//{ -// gtk_list_store_insert_with_values (gobj (), &iter, position, columns, values, n_values); -//} - -void -ListStore::prepend (GtkTreeIter& iter) -{ - gtk_list_store_prepend (gobj (), &iter); -} - -void -ListStore::append (GtkTreeIter& iter) -{ - gtk_list_store_append (gobj (), &iter); -} - -void -ListStore::clear () -{ - gtk_list_store_clear (gobj ()); -} - -bool -ListStore::iter_is_valid (const GtkTreeIter& iter) -{ - return gtk_list_store_iter_is_valid (gobj (), const_cast(&iter)); -} - -void -ListStore::reorder (int* new_order) -{ - gtk_list_store_reorder (gobj (), new_order); -} - -void -ListStore::swap (GtkTreeIter& a, - GtkTreeIter& b) -{ - gtk_list_store_swap (gobj (), &a, &b); -} - -void -ListStore::move_after (GtkTreeIter& iter, - GtkTreeIter& position) -{ - gtk_list_store_move_after (gobj (), &iter, &position); -} - -void -ListStore::move_before (GtkTreeIter& iter, - GtkTreeIter& position) -{ - gtk_list_store_move_before (gobj (), &iter, &position); -} - - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// -// GtkTreeView -// - -TreeViewPtr -TreeView::create (TreeModelPtr model) -{ - GtkWidget* w = model ? gtk_tree_view_new_with_model (model->gobj ()) : gtk_tree_view_new (); - return w ? wrap_new (GTK_TREE_VIEW (w)) : nullptr; -} - -TreeModelPtr -TreeView::get_model () -{ - return wrap (gtk_tree_view_get_model (gobj())); -} - -void -TreeView::set_model (TreeModelPtr model) -{ - gtk_tree_view_set_model (gobj (), model ? model->gobj () : nullptr); -} - -GtkTreeSelection* -TreeView::get_selection () -{ - return gtk_tree_view_get_selection (gobj ()); -} - -GtkAdjustment* -TreeView::get_hadjustment () -{ - return gtk_tree_view_get_hadjustment (gobj ()); -} - -void -TreeView::set_hadjustment (GtkAdjustment* adjustment) -{ - gtk_tree_view_set_hadjustment (gobj (), adjustment); -} - -GtkAdjustment* -TreeView::get_vadjustment () -{ - return gtk_tree_view_get_vadjustment (gobj ()); -} - -void -TreeView::set_vadjustment (GtkAdjustment* adjustment) -{ - gtk_tree_view_set_vadjustment (gobj (), adjustment); -} - -bool -TreeView::get_headers_visible () -{ - return gtk_tree_view_get_headers_visible (gobj ()); -} - -void -TreeView::set_headers_visible (bool headers_visible) -{ - gtk_tree_view_set_headers_visible (gobj (), headers_visible); -} - -void -TreeView::columns_autosize () -{ - gtk_tree_view_columns_autosize (gobj ()); -} - -bool -TreeView::get_headers_clickable () -{ - return gtk_tree_view_get_headers_clickable (gobj ()); -} - -void -TreeView::set_headers_clickable (bool setting) -{ - gtk_tree_view_set_headers_clickable (gobj (), setting); -} - -void -TreeView::set_rules_hint (bool setting) -{ - gtk_tree_view_set_rules_hint (gobj (), setting); -} - -bool -TreeView::get_rules_hint () -{ - return gtk_tree_view_get_rules_hint (gobj ()); -} - -int -TreeView::append_column (TreeViewColumn& column) -{ - return gtk_tree_view_append_column (gobj (), column.gobj ()); -} - -int -TreeView::remove_column (TreeViewColumn& column) -{ - return gtk_tree_view_remove_column (gobj (), column.gobj ()); -} - -int -TreeView::insert_column (TreeViewColumn& column, - int position) -{ - return gtk_tree_view_insert_column (gobj (), column.gobj (), position); -} - -//int -//TreeView::insert_column_with_attributes (int position, -// const char* title, -// CellRenderer& cell, -// ...) -//{ -// gtk_tree_view_insert_column_with_attributes (gobj (), position, -// const char* title, -// CellRenderer& cell, -// ...); -//} - -TreeViewColumnPtr -TreeView::get_column (int n) -{ - return wrap_new (gtk_tree_view_get_column (gobj (), n)); -} - -std::vector -TreeView::get_columns () -{ - GList* list = gtk_tree_view_get_columns (gobj ()); - auto ret = object_list_to_vector (list); - g_list_free (list); - return ret; -} - -void -TreeView::move_column_after (TreeViewColumn& column, - TreeViewColumn& base_column) -{ - return gtk_tree_view_move_column_after (gobj (), column.gobj (), base_column.gobj ()); -} - -void -TreeView::set_expander_column (TreeViewColumn& column) -{ - return gtk_tree_view_set_expander_column (gobj (), column.gobj ()); -} - -TreeViewColumnPtr -TreeView::get_expander_column () -{ - return wrap (gtk_tree_view_get_expander_column (gobj ())); -} - -void -TreeView::set_column_drag_function (GtkTreeViewColumnDropFunc func, - gpointer user_data, - GDestroyNotify destroy) -{ - gtk_tree_view_set_column_drag_function (gobj (), func, user_data, destroy); -} - -void -TreeView::scroll_to_point (int tree_x, - int tree_y) -{ - gtk_tree_view_scroll_to_point (gobj (), tree_x, tree_y); -} - -void -TreeView::scroll_to_cell (GtkTreePath* path, - TreeViewColumn& column, - bool use_align, - float row_align, - float col_align) -{ - gtk_tree_view_scroll_to_cell (gobj (), path, column.gobj (), use_align, row_align, col_align); -} - -void -TreeView::row_activated (GtkTreePath* path, - TreeViewColumn& column) -{ - gtk_tree_view_row_activated (gobj (), path, column.gobj ()); -} - -void -TreeView::expand_all () -{ - gtk_tree_view_expand_all (gobj ()); -} - -void -TreeView::collapse_all () -{ - gtk_tree_view_collapse_all (gobj ()); -} - -void -TreeView::expand_to_path (GtkTreePath* path) -{ - gtk_tree_view_expand_to_path (gobj (), path); -} - -bool -TreeView::expand_row (GtkTreePath* path, - bool open_all) -{ - return gtk_tree_view_expand_row (gobj (), path, open_all); -} - -bool -TreeView::collapse_row (GtkTreePath* path) -{ - return gtk_tree_view_collapse_row (gobj (), path); -} - -void -TreeView::map_expanded_rows (GtkTreeViewMappingFunc func, - gpointer data) -{ - gtk_tree_view_map_expanded_rows (gobj (), func, data); -} - -bool -TreeView::row_expanded (GtkTreePath* path) -{ - return gtk_tree_view_row_expanded (gobj (), path); -} - -void -TreeView::set_reorderable (bool reorderable) -{ - gtk_tree_view_set_reorderable (gobj (), reorderable); -} - -bool -TreeView::get_reorderable () -{ - return gtk_tree_view_get_reorderable (gobj ()); -} - -void -TreeView::set_cursor (GtkTreePath* path, - TreeViewColumn& focus_column, - bool start_editing) -{ - gtk_tree_view_set_cursor (gobj (), path, focus_column.gobj (), start_editing); -} - -void -TreeView::set_cursor_on_cell (GtkTreePath* path, - TreeViewColumn& focus_column, - CellRenderer& focus_cell, - bool start_editing) -{ - gtk_tree_view_set_cursor_on_cell (gobj (), path, focus_column.gobj (), focus_cell.gobj (), start_editing); -} - -void -TreeView::get_cursor (GtkTreePath** path, - TreeViewColumnPtr& focus_column) -{ - GtkTreeViewColumn* col = nullptr; - gtk_tree_view_get_cursor (gobj (), path, &col); - focus_column.set (col); -} - -GdkWindow* -TreeView::get_bin_window () -{ - return gtk_tree_view_get_bin_window (gobj ()); -} - -bool -TreeView::get_path_at_pos (int x, - int y, - GtkTreePath** path, - TreeViewColumnPtr& column, - int* cell_x, - int* cell_y) -{ - GtkTreeViewColumn* col = nullptr; - bool ret = gtk_tree_view_get_path_at_pos (gobj (), x, y, path, &col, cell_x, cell_y); - column.set (col); - return ret; -} - -void -TreeView::get_cell_area (GtkTreePath* path, - TreeViewColumn& column, - GdkRectangle& rect) -{ - gtk_tree_view_get_cell_area (gobj (), path, column.gobj(), &rect); -} - -void -TreeView::get_background_area (GtkTreePath* path, - TreeViewColumn& column, - GdkRectangle& rect) -{ - gtk_tree_view_get_background_area (gobj (), path, column.gobj (), &rect); -} - -void -TreeView::get_visible_rect (GdkRectangle& visible_rect) -{ - gtk_tree_view_get_visible_rect (gobj (), &visible_rect); -} - -bool -TreeView::get_visible_range (GtkTreePath** start_path, - GtkTreePath** end_path) -{ - return gtk_tree_view_get_visible_range (gobj (), start_path, end_path); -} - -void -TreeView::enable_model_drag_source (GdkModifierType start_button_mask, - const GtkTargetEntry* targets, - int n_targets, - GdkDragAction actions) -{ - gtk_tree_view_enable_model_drag_source (gobj (), start_button_mask, - targets, n_targets, actions); -} - -void -TreeView::enable_model_drag_dest (const GtkTargetEntry* targets, - int n_targets, - GdkDragAction actions) -{ - gtk_tree_view_enable_model_drag_dest (gobj (), targets, n_targets, actions); -} - -void -TreeView::unset_rows_drag_source () -{ - gtk_tree_view_unset_rows_drag_source (gobj ()); -} - -void -TreeView::unset_rows_drag_dest () -{ - gtk_tree_view_unset_rows_drag_dest (gobj ()); -} - -void -TreeView::set_drag_dest_row (GtkTreePath* path, - GtkTreeViewDropPosition pos) -{ - gtk_tree_view_set_drag_dest_row (gobj (), path, pos); -} - -void -TreeView::get_drag_dest_row (GtkTreePath** path, - GtkTreeViewDropPosition* pos) -{ - gtk_tree_view_get_drag_dest_row (gobj (), path, pos); -} - -bool -TreeView::get_dest_row_at_pos (int drag_x, - int drag_y, - GtkTreePath** path, - GtkTreeViewDropPosition* pos) -{ - return gtk_tree_view_get_dest_row_at_pos (gobj (), drag_x, drag_y, path, pos); -} - -GdkPixmap* -TreeView::create_row_drag_icon (GtkTreePath* path) -{ - return gtk_tree_view_create_row_drag_icon (gobj (), path); -} - -void -TreeView::set_enable_search (bool enable_search) -{ - gtk_tree_view_set_enable_search (gobj (), enable_search); -} - -bool -TreeView::get_enable_search () -{ - return gtk_tree_view_get_enable_search (gobj ()); -} - -int -TreeView::get_search_column () -{ - return gtk_tree_view_get_search_column (gobj ()); -} - -void -TreeView::set_search_column (int column) -{ - gtk_tree_view_set_search_column (gobj (), column); -} - -GtkTreeViewSearchEqualFunc -TreeView::get_search_equal_func () -{ - return gtk_tree_view_get_search_equal_func (gobj ()); -} - -void -TreeView::set_search_equal_func (GtkTreeViewSearchEqualFunc search_equal_func, - gpointer search_user_data, - GDestroyNotify search_destroy) -{ - gtk_tree_view_set_search_equal_func (gobj (), search_equal_func, search_user_data, search_destroy); -} - -GtkEntry* -TreeView::get_search_entry () -{ - return gtk_tree_view_get_search_entry (gobj ()); -} - -void -TreeView::set_search_entry (GtkEntry* entry) -{ - gtk_tree_view_set_search_entry (gobj (), entry); -} - -GtkTreeViewSearchPositionFunc -TreeView::get_search_position_func () -{ - return gtk_tree_view_get_search_position_func (gobj ()); -} - -void -TreeView::set_search_position_func (GtkTreeViewSearchPositionFunc func, - gpointer data, - GDestroyNotify destroy) -{ - gtk_tree_view_set_search_position_func (gobj (), func, data, destroy); -} - -void -TreeView::convert_widget_to_tree_coords (int wx, - int wy, - int* tx, - int* ty) -{ - gtk_tree_view_convert_widget_to_tree_coords (gobj (), wx, wy, tx, ty); -} - -void -TreeView::convert_tree_to_widget_coords (int tx, - int ty, - int* wx, - int* wy) -{ - gtk_tree_view_convert_tree_to_widget_coords (gobj (), tx, ty, wx, wy); -} - -void -TreeView::convert_widget_to_bin_window_coords (int wx, - int wy, - int* bx, - int* by) -{ - gtk_tree_view_convert_widget_to_bin_window_coords (gobj (), wx, wy, bx, by); -} - -void -TreeView::convert_bin_window_to_widget_coords (int bx, - int by, - int* wx, - int* wy) -{ - gtk_tree_view_convert_bin_window_to_widget_coords (gobj (), bx, by, wx, wy); -} - -void -TreeView::convert_tree_to_bin_window_coords (int tx, - int ty, - int* bx, - int* by) -{ - gtk_tree_view_convert_tree_to_bin_window_coords (gobj (), tx, ty, bx, by); -} - -void -TreeView::convert_bin_window_to_tree_coords (int bx, - int by, - int* tx, - int* ty) -{ - gtk_tree_view_convert_bin_window_to_tree_coords (gobj (), bx, by, tx, ty); -} - -void -TreeView::set_fixed_height_mode (bool enable) -{ - gtk_tree_view_set_fixed_height_mode (gobj (), enable); -} - -bool -TreeView::get_fixed_height_mode () -{ - return gtk_tree_view_get_fixed_height_mode (gobj ()); -} - -void -TreeView::set_hover_selection (bool hover) -{ - gtk_tree_view_set_hover_selection (gobj (), hover); -} - -bool -TreeView::get_hover_selection () -{ - return gtk_tree_view_get_hover_selection (gobj ()); -} - -void -TreeView::set_hover_expand (bool expand) -{ - gtk_tree_view_set_hover_expand (gobj (), expand); -} - -bool -TreeView::get_hover_expand () -{ - return gtk_tree_view_get_hover_expand (gobj ()); -} - -void -TreeView::set_rubber_banding (bool enable) -{ - gtk_tree_view_set_rubber_banding (gobj (), enable); -} - -bool -TreeView::get_rubber_banding () -{ - return gtk_tree_view_get_rubber_banding (gobj ()); -} - -bool -TreeView::is_rubber_banding_active () -{ - return gtk_tree_view_is_rubber_banding_active (gobj ()); -} - -GtkTreeViewRowSeparatorFunc -TreeView::get_row_separator_func () -{ - return gtk_tree_view_get_row_separator_func (gobj ()); -} - -void -TreeView::set_row_separator_func (GtkTreeViewRowSeparatorFunc func, - gpointer data, - GDestroyNotify destroy) -{ - gtk_tree_view_set_row_separator_func (gobj (), func, data, destroy); -} - -GtkTreeViewGridLines -TreeView::get_grid_lines () -{ - return gtk_tree_view_get_grid_lines (gobj ()); -} - -void -TreeView::set_grid_lines (GtkTreeViewGridLines grid_lines) -{ - gtk_tree_view_set_grid_lines (gobj (), grid_lines); -} - -bool -TreeView::get_enable_tree_lines () -{ - return gtk_tree_view_get_enable_tree_lines (gobj ()); -} - -void -TreeView::set_enable_tree_lines (bool enabled) -{ - gtk_tree_view_set_enable_tree_lines (gobj (), enabled); -} - -void -TreeView::set_show_expanders (bool enabled) -{ - gtk_tree_view_set_show_expanders (gobj (), enabled); -} - -bool -TreeView::get_show_expanders () -{ - return gtk_tree_view_get_show_expanders (gobj ()); -} - -void -TreeView::set_level_indentation (int indentation) -{ - gtk_tree_view_set_level_indentation (gobj (), indentation); -} - -int -TreeView::get_level_indentation () -{ - return gtk_tree_view_get_level_indentation (gobj ()); -} - -void -TreeView::set_tooltip_row (GtkTooltip* tooltip, - GtkTreePath* path) -{ - gtk_tree_view_set_tooltip_row (gobj (), tooltip, path); -} - -void -TreeView::set_tooltip_cell (GtkTooltip* tooltip, - GtkTreePath* path, - TreeViewColumn& column, - CellRenderer& cell) -{ - gtk_tree_view_set_tooltip_cell (gobj (), tooltip, path, column.gobj (), cell.gobj ()); -} - -bool -TreeView::get_tooltip_context (int* x, - int* y, - bool keyboard_tip, - GtkTreeModel** model, - GtkTreePath** path, - GtkTreeIter* iter) -{ - return gtk_tree_view_get_tooltip_context (gobj (), x, y, keyboard_tip, model, path, iter); -} - -void -TreeView::set_tooltip_column (int column) -{ - gtk_tree_view_set_tooltip_column (gobj (), column); -} - -int -TreeView::get_tooltip_column () -{ - return gtk_tree_view_get_tooltip_column (gobj ()); -} - - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// -// GtkTreeViewColumn -// - -TreeViewColumnPtr -TreeViewColumn::create () -{ - return wrap_new (gtk_tree_view_column_new ()); -} - -//TreeViewColumnPtr -//TreeViewColumn::create (const char* title, -// CellRendererPtr cell, -// ...) -//{ -//} - -void -TreeViewColumn::pack_start (CellRenderer& cell, bool expand) -{ - gtk_tree_view_column_pack_start (gobj (), cell.gobj(), expand); -} - -void -TreeViewColumn::pack_end (CellRenderer& cell, bool expand) -{ - gtk_tree_view_column_pack_end (gobj (), cell.gobj (), expand); -} - -void -TreeViewColumn::clear () -{ - gtk_tree_view_column_clear (gobj ()); -} - -std::vector -TreeViewColumn::get_cell_renderers () -{ - GList* list = gtk_tree_view_column_get_cell_renderers (gobj ()); - auto ret = object_list_to_vector (list); - g_list_free (list); - return ret; -} - -void -TreeViewColumn::add_attribute (CellRenderer& cell, - const char* attribute, - int column) -{ - gtk_tree_view_column_add_attribute (gobj (), cell.gobj (), attribute, column); -} - -void -TreeViewColumn::set_attributes (gtk::CellRenderer& cell_renderer, const char* prop, int column) -{ - gtk_tree_view_column_set_attributes (gobj (), cell_renderer.gobj (), prop, column, nullptr); -} - -void -TreeViewColumn::clear_attributes (CellRenderer& cell_renderer) -{ - gtk_tree_view_column_clear_attributes (gobj (), cell_renderer.gobj ()); -} - -void -TreeViewColumn::set_spacing (int spacing) -{ - gtk_tree_view_column_set_spacing (gobj (), spacing); -} - -int -TreeViewColumn::get_spacing () -{ - return gtk_tree_view_column_get_spacing (gobj ()); -} - -void -TreeViewColumn::set_visible (bool visible) -{ - gtk_tree_view_column_set_visible (gobj (), visible); -} - -bool -TreeViewColumn::get_visible () -{ - return gtk_tree_view_column_get_visible (gobj ()); -} - -void -TreeViewColumn::set_resizable (bool resizable) -{ - gtk_tree_view_column_set_resizable (gobj (), resizable); -} - -bool -TreeViewColumn::get_resizable () -{ - return gtk_tree_view_column_get_resizable (gobj ()); -} - -void -TreeViewColumn::set_sizing (GtkTreeViewColumnSizing type) -{ - gtk_tree_view_column_set_sizing (gobj (), type); -} - -GtkTreeViewColumnSizing -TreeViewColumn::get_sizing () -{ - return gtk_tree_view_column_get_sizing (gobj ()); -} - -int -TreeViewColumn::get_width () -{ - return gtk_tree_view_column_get_width (gobj ()); -} - -int -TreeViewColumn::get_fixed_width () -{ - return gtk_tree_view_column_get_fixed_width (gobj ()); -} - -void -TreeViewColumn::set_fixed_width (int fixed_width) -{ - gtk_tree_view_column_set_fixed_width (gobj (), fixed_width); -} - -void -TreeViewColumn::set_min_width (int min_width) -{ - gtk_tree_view_column_set_min_width (gobj (), min_width); -} - -int -TreeViewColumn::get_min_width () -{ - return gtk_tree_view_column_get_min_width (gobj ()); -} - -void -TreeViewColumn::set_max_width (int max_width) -{ - gtk_tree_view_column_set_max_width (gobj (), max_width); -} - -int -TreeViewColumn::get_max_width () -{ - return gtk_tree_view_column_get_max_width (gobj ()); -} - -void -TreeViewColumn::clicked () -{ - gtk_tree_view_column_clicked (gobj ()); -} - -void -TreeViewColumn::set_title (const char* title) -{ - gtk_tree_view_column_set_title (gobj (), title); -} - -gstr -TreeViewColumn::get_title () -{ - return gstr::wrap (gtk_tree_view_column_get_title (gobj ())); -} - -void -TreeViewColumn::set_expand (bool expand) -{ - gtk_tree_view_column_set_expand (gobj (), expand); -} - -bool -TreeViewColumn::get_expand () -{ - return gtk_tree_view_column_get_expand (gobj ()); -} - -void -TreeViewColumn::set_clickable (bool clickable) -{ - gtk_tree_view_column_set_clickable (gobj (), clickable); -} - -bool -TreeViewColumn::get_clickable () -{ - return gtk_tree_view_column_get_clickable (gobj ()); -} - -void -TreeViewColumn::set_widget (WidgetPtr widget) -{ - gtk_tree_view_column_set_widget (gobj (), widget.gobj ()); -} - -WidgetPtr -TreeViewColumn::get_widget () -{ - return wrap (gtk_tree_view_column_get_widget (gobj ())); -} - -void -TreeViewColumn::set_alignment (float xalign) -{ - gtk_tree_view_column_set_alignment (gobj (), xalign); -} - -float -TreeViewColumn::get_alignment () -{ - return gtk_tree_view_column_get_alignment (gobj ()); -} - -void -TreeViewColumn::set_reorderable (bool reorderable) -{ - gtk_tree_view_column_set_reorderable (gobj (), reorderable); -} - -bool -TreeViewColumn::get_reorderable () -{ - return gtk_tree_view_column_get_reorderable (gobj ()); -} - -void -TreeViewColumn::set_sort_column_id (int sort_column_id) -{ - gtk_tree_view_column_set_sort_column_id (gobj (), sort_column_id); -} - -int -TreeViewColumn::get_sort_column_id () -{ - return gtk_tree_view_column_get_sort_column_id (gobj ()); -} - -void -TreeViewColumn::set_sort_indicator (bool setting) -{ - gtk_tree_view_column_set_sort_indicator (gobj (), setting); -} - -bool -TreeViewColumn::get_sort_indicator () -{ - return gtk_tree_view_column_get_sort_indicator (gobj ()); -} - -void -TreeViewColumn::set_sort_order (GtkSortType order) -{ - gtk_tree_view_column_set_sort_order (gobj (), order); -} - -GtkSortType -TreeViewColumn::get_sort_order () -{ - return gtk_tree_view_column_get_sort_order (gobj ()); -} - -TreeViewPtr -TreeViewColumn::get_tree_view () -{ - GtkWidget* w = gtk_tree_view_column_get_tree_view (gobj ()); - return w ? wrap (GTK_TREE_VIEW (w)) : nullptr; -} - - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// -// GtkCellRenderer -// - - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// -// GtkCellRendererText -// - -gtk::CellRendererTextPtr -CellRendererText::create () -{ - return wrap_new (up_cast (gtk_cell_renderer_text_new ())); -} - -void CellRendererText::set_fixed_height_from_font (int number_of_rows) -{ - gtk_cell_renderer_text_set_fixed_height_from_font (gobj (), number_of_rows); -} - - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// -// GtkCellRendererPixbuf -// - -gtk::CellRendererPixbufPtr -CellRendererPixbuf::create () -{ - return wrap_new (up_cast (gtk_cell_renderer_pixbuf_new ())); -} - - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// -// GtkCellRendererToggle -// - -gtk::CellRendererTogglePtr -CellRendererToggle::create () -{ - return wrap_new (up_cast (gtk_cell_renderer_toggle_new ())); -} - -bool -CellRendererToggle::get_radio () -{ - return gtk_cell_renderer_toggle_get_radio (gobj ()); -} - -void -CellRendererToggle::set_radio (bool radio) -{ - gtk_cell_renderer_toggle_set_radio (gobj (), radio); -} - -bool -CellRendererToggle::get_active () -{ - return gtk_cell_renderer_toggle_get_active (gobj ()); -} - -void -CellRendererToggle::set_active (bool active) -{ - gtk_cell_renderer_toggle_set_active (gobj(), active); -} diff --git a/moo/moocpp/old/gobjtypes-gtk.h b/moo/moocpp/old/gobjtypes-gtk.h deleted file mode 100644 index b94a34cc..00000000 --- a/moo/moocpp/old/gobjtypes-gtk.h +++ /dev/null @@ -1,653 +0,0 @@ -/* - * moocpp/gobjtypes-gtk.h - * - * Copyright (C) 2004-2016 by Yevgen Muntyan - * - * This file is part of medit. medit 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. - * - * You should have received a copy of the GNU Lesser General Public - * License along with medit. If not, see . - */ - -#pragma once - -#include -#include - -#ifdef __cplusplus - -#include "moocpp/gobjtypes-glib.h" -#include -#include - -#define MOO_DEFINE_GTK_TYPE(Object, Parent, obj_g_type) \ - MOO_DEFINE_GOBJ_TYPE(Gtk##Object, Parent, obj_g_type) \ - namespace moo { \ - namespace gtk { \ - MOO_GOBJ_TYPEDEFS(Object, Gtk##Object) \ - } \ - } - -#define MOO_DEFINE_GTK_IFACE(Iface, iface_g_type) \ - MOO_DEFINE_GIFACE_TYPE(Gtk##Iface, iface_g_type) \ - namespace moo { \ - namespace gtk { \ - MOO_GIFACE_TYPEDEFS(Iface, Gtk##Iface) \ - } \ - } - - -MOO_DECLARE_CUSTOM_GOBJ_TYPE (GtkObject) -MOO_DECLARE_CUSTOM_GOBJ_TYPE (GtkWidget) -MOO_DECLARE_CUSTOM_GOBJ_TYPE (GtkTextView) -MOO_DECLARE_CUSTOM_GOBJ_TYPE (GtkTreeModel) -MOO_DECLARE_CUSTOM_GOBJ_TYPE (GtkTreeStore) -MOO_DECLARE_CUSTOM_GOBJ_TYPE (GtkListStore) -MOO_DECLARE_CUSTOM_GOBJ_TYPE (GtkTreeView) -MOO_DECLARE_CUSTOM_GOBJ_TYPE (GtkTreeViewColumn) -MOO_DECLARE_CUSTOM_GOBJ_TYPE (GtkCellRenderer) -MOO_DECLARE_CUSTOM_GOBJ_TYPE (GtkCellRendererText) -MOO_DECLARE_CUSTOM_GOBJ_TYPE (GtkCellRendererToggle) -MOO_DECLARE_CUSTOM_GOBJ_TYPE (GtkCellRendererPixbuf) - - -MOO_DEFINE_GTK_TYPE (Object, GObject, GTK_TYPE_OBJECT) -MOO_DEFINE_GTK_TYPE (Widget, GtkObject, GTK_TYPE_WIDGET) - -template<> -class moo::gobj_ref : public virtual moo::gobj_ref_parent -{ -public: - MOO_DEFINE_GOBJREF_METHODS (GtkObject); - - void destroy (); -}; - -template<> -class moo::gobj_ref : public virtual moo::gobj_ref_parent -{ -public: - MOO_DEFINE_GOBJREF_METHODS (GtkWidget); -}; - - -MOO_DEFINE_GTK_TYPE(Entry, GtkWidget, GTK_TYPE_ENTRY) -MOO_DEFINE_GTK_TYPE(Action, GObject, GTK_TYPE_ACTION) -MOO_DEFINE_GTK_TYPE(TextBuffer, GObject, GTK_TYPE_TEXT_BUFFER) -MOO_DEFINE_GTK_TYPE(TextMark, GObject, GTK_TYPE_TEXT_MARK) -MOO_DEFINE_GTK_TYPE(MenuShell, GtkWidget, GTK_TYPE_MENU_SHELL) -MOO_DEFINE_GTK_TYPE(Menu, GtkMenuShell, GTK_TYPE_MENU) - - -MOO_DEFINE_GTK_TYPE (TextView, GtkWidget, GTK_TYPE_TEXT_VIEW) - -template<> -class moo::gobj_ref : public virtual moo::gobj_ref_parent -{ -public: - MOO_DEFINE_GOBJREF_METHODS(GtkTextView); - - gtk::TextBuffer get_buffer (); -}; - - -MOO_DEFINE_GTK_IFACE (TreeModel, GTK_TYPE_TREE_MODEL) - -template<> -class moo::gobj_ref : public virtual moo::gobj_ref_parent -{ -public: - MOO_DEFINE_GOBJREF_METHODS (GtkTreeModel); - - GtkTreeModelFlags get_flags (); - int get_n_columns (); - GType get_column_type (int index_); - - bool get_iter (GtkTreeIter& iter, const GtkTreePath& path); - bool get_iter_from_string (GtkTreeIter& iter, const char* path_string); - gstr get_string_from_iter (const GtkTreeIter& iter); - bool get_iter_first (GtkTreeIter& iter); - GtkTreePath* get_path (const GtkTreeIter& iter); - void get_value (const GtkTreeIter& iter, int column, GValue* value); - bool iter_next (GtkTreeIter& iter); - bool iter_children (GtkTreeIter& iter, const GtkTreeIter& parent); - bool iter_has_child (const GtkTreeIter& iter); - int iter_n_children (const GtkTreeIter& iter); - bool iter_nth_child (GtkTreeIter& iter, const GtkTreeIter& parent, int n); - bool iter_parent (GtkTreeIter& iter, const GtkTreeIter& child); - - void get (const GtkTreeIter& iter, int column, bool& dest) - { - gboolean val; - gtk_tree_model_get (gobj (), const_cast(&iter), column, &val, -1); - dest = val; - } - - template - void get (const GtkTreeIter& iter, int column, T&& dest) - { - gtk_tree_model_get (gobj (), const_cast(&iter), column, cpp_vararg_dest_fixer::apply (std::forward (dest)), -1); - } - - template - void get (const GtkTreeIter& iter, int column, T&& dest, Args&&... args) - { - get (iter, column, std::forward (dest)); - get (iter, std::forward (args)...); - } - - // bool TFunc (const GtkTreePath&, const GtkTreeIter&) - template - void foreach (const TFunc& func) - { - const void* p = &func; - gtk_tree_model_foreach (gobj (), foreach_func, const_cast(p)); - } - -private: - template - static gboolean foreach_func (GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data) - { - const TFunc& func = *reinterpret_cast(data); - return func (const_cast(*path), const_cast(*iter)); - } -}; - -MOO_DEFINE_GTK_TYPE (ListStore, GObject, GTK_TYPE_LIST_STORE) -MOO_GOBJ_IMPLEMENTS_IFACE (GtkListStore, GtkTreeModel) - -template<> -class moo::gobj_ref - : public virtual moo::gobj_ref_parent - , public virtual moo::gobj_ref -{ -public: - MOO_DEFINE_GOBJREF_METHODS(GtkListStore); - - static gtk::ListStorePtr create (std::initializer_list types) - { - return create (types.size (), types.begin ()); - } - - static gtk::ListStorePtr create (size_t n_columns, std::initializer_list types) - { - g_return_val_if_fail (n_columns == types.size (), nullptr); - return create (n_columns, types.begin ()); - } - - static gtk::ListStorePtr create (size_t n_columns, const GType* types); - - template - void set (const GtkTreeIter& iter, int column, T&& value) - { - gtk_list_store_set (gobj (), const_cast(&iter), column, cpp_vararg_value_fixer::apply (std::forward (value)), -1); - } - - template - void set (const GtkTreeIter& iter, int column, T&& value, Args&&... args) - { - set (iter, column, std::forward (value)); - set (iter, std::forward (args)...); - } - - void set_value (const GtkTreeIter& iter, - int column, - GValue* value); - void set_valuesv (const GtkTreeIter& iter, - int* columns, - GValue* values, - int n_values); - bool remove (GtkTreeIter& iter); - void insert (GtkTreeIter& iter, - int position); - void insert_before (GtkTreeIter& iter, - GtkTreeIter& sibling); - void insert_after (GtkTreeIter& iter, - GtkTreeIter& sibling); - //void insert_with_values (GtkTreeIter* iter, - // int position, - // ...); - //void insert_with_values (GtkTreeIter* iter, - // int position, - // int* columns, - // GValue* values, - // int n_values); - void prepend (GtkTreeIter& iter); - void append (GtkTreeIter& iter); - void clear (); - bool iter_is_valid (const GtkTreeIter& iter); - void reorder (int* new_order); - void swap (GtkTreeIter& a, - GtkTreeIter& b); - void move_after (GtkTreeIter& iter, - GtkTreeIter& position); - void move_before (GtkTreeIter& iter, - GtkTreeIter& position); -}; - -MOO_DEFINE_GTK_TYPE (TreeStore, GObject, GTK_TYPE_TREE_STORE) -MOO_GOBJ_IMPLEMENTS_IFACE (GtkTreeStore, GtkTreeModel) - -template<> -class moo::gobj_ref - : public virtual moo::gobj_ref_parent - , public virtual moo::gobj_ref -{ -public: - MOO_DEFINE_GOBJREF_METHODS (GtkTreeStore); -}; - -MOO_DEFINE_GTK_TYPE (TreeView, GtkContainer, GTK_TYPE_TREE_VIEW) -MOO_DEFINE_GTK_TYPE (TreeViewColumn, GtkObject, GTK_TYPE_TREE_VIEW_COLUMN) -MOO_DEFINE_GTK_TYPE (CellRenderer, GtkObject, GTK_TYPE_CELL_RENDERER) -MOO_DEFINE_GTK_TYPE (CellRendererText, GtkCellRenderer, GTK_TYPE_CELL_RENDERER_TEXT) -MOO_DEFINE_GTK_TYPE (CellRendererPixbuf, GtkCellRenderer, GTK_TYPE_CELL_RENDERER_PIXBUF) -MOO_DEFINE_GTK_TYPE (CellRendererToggle, GtkCellRenderer, GTK_TYPE_CELL_RENDERER_TOGGLE) - - -template -class TreeCellDataFunc -{ -public: - TreeCellDataFunc (TFunc func) : m_func (std::move (func)) {} - ~TreeCellDataFunc () {} - - MOO_DISABLE_COPY_OPS (TreeCellDataFunc); - - static void destroy (gpointer d) { delete reinterpret_cast(d); } - - static void cell_data_func (GtkTreeViewColumn *tree_column, - GtkCellRenderer *cell, - GtkTreeModel *tree_model, - GtkTreeIter *iter, - gpointer p); - -private: - TFunc m_func; -}; - - -template<> -class moo::gobj_ref : public virtual moo::gobj_ref_parent -{ -public: - MOO_DEFINE_GOBJREF_METHODS (GtkTreeView); - - static gtk::TreeViewPtr create (gtk::TreeModelPtr model); - - gtk::TreeModelPtr get_model (); - void set_model (gtk::TreeModelPtr model); - GtkTreeSelection* get_selection (); - GtkAdjustment* get_hadjustment (); - void set_hadjustment (GtkAdjustment* adjustment); - GtkAdjustment* get_vadjustment (); - void set_vadjustment (GtkAdjustment* adjustment); - bool get_headers_visible (); - void set_headers_visible (bool headers_visible); - void columns_autosize (); - bool get_headers_clickable (); - void set_headers_clickable (bool setting); - void set_rules_hint (bool setting); - bool get_rules_hint (); - - /* Column funtions */ - int append_column (gtk::TreeViewColumn& column); - int remove_column (gtk::TreeViewColumn& column); - int insert_column (gtk::TreeViewColumn& column, - int position); - int insert_column_with_attributes (int position, - const char* title, - gtk::CellRenderer& cell, - ...) G_GNUC_NULL_TERMINATED; - - template - int insert_column_with_data_func (int position, - const char* title, - gtk::CellRenderer& cell, - TFunc func); - - gtk::TreeViewColumnPtr get_column (int n); - std::vector get_columns (); - void move_column_after (gtk::TreeViewColumn& column, - gtk::TreeViewColumn& base_column); - void set_expander_column (gtk::TreeViewColumn& column); - gtk::TreeViewColumnPtr get_expander_column (); - void set_column_drag_function (GtkTreeViewColumnDropFunc func, - gpointer user_data, - GDestroyNotify destroy); - - /* Actions */ - void scroll_to_point (int tree_x, - int tree_y); - void scroll_to_cell (GtkTreePath* path, - gtk::TreeViewColumn& column, - bool use_align, - float row_align, - float col_align); - void row_activated (GtkTreePath* path, - gtk::TreeViewColumn& column); - void expand_all (); - void collapse_all (); - void expand_to_path (GtkTreePath* path); - bool expand_row (GtkTreePath* path, - bool open_all); - bool collapse_row (GtkTreePath* path); - void map_expanded_rows (GtkTreeViewMappingFunc func, - gpointer data); - bool row_expanded (GtkTreePath* path); - void set_reorderable (bool reorderable); - bool get_reorderable (); - void set_cursor (GtkTreePath* path, - gtk::TreeViewColumn& focus_column, - bool start_editing); - void set_cursor_on_cell (GtkTreePath* path, - gtk::TreeViewColumn& focus_column, - gtk::CellRenderer& focus_cell, - bool start_editing); - void get_cursor (GtkTreePath** path, - gtk::TreeViewColumnPtr& focus_column); - - /* Layout information */ - GdkWindow* get_bin_window (); - bool get_path_at_pos (int x, - int y, - GtkTreePath** path, - gtk::TreeViewColumnPtr& column, - int* cell_x, - int* cell_y); - void get_cell_area (GtkTreePath* path, - gtk::TreeViewColumn& column, - GdkRectangle& rect); - void get_background_area (GtkTreePath* path, - gtk::TreeViewColumn& column, - GdkRectangle& rect); - void get_visible_rect (GdkRectangle& visible_rect); - - bool get_visible_range (GtkTreePath** start_path, - GtkTreePath** end_path); - - /* Drag-and-Drop support */ - void enable_model_drag_source (GdkModifierType start_button_mask, - const GtkTargetEntry* targets, - int n_targets, - GdkDragAction actions); - void enable_model_drag_dest (const GtkTargetEntry* targets, - int n_targets, - GdkDragAction actions); - void unset_rows_drag_source (); - void unset_rows_drag_dest (); - - /* These are useful to implement your own custom stuff. */ - void set_drag_dest_row (GtkTreePath* path, - GtkTreeViewDropPosition pos); - void get_drag_dest_row (GtkTreePath** path, - GtkTreeViewDropPosition* pos); - bool get_dest_row_at_pos (int drag_x, - int drag_y, - GtkTreePath** path, - GtkTreeViewDropPosition* pos); - GdkPixmap* create_row_drag_icon (GtkTreePath* path); - - /* Interactive search */ - void set_enable_search (bool enable_search); - bool get_enable_search (); - int get_search_column (); - void set_search_column (int column); - GtkTreeViewSearchEqualFunc get_search_equal_func (); - void set_search_equal_func (GtkTreeViewSearchEqualFunc search_equal_func, - gpointer search_user_data, - GDestroyNotify search_destroy); - - GtkEntry* get_search_entry (); - void set_search_entry (GtkEntry* entry); - GtkTreeViewSearchPositionFunc get_search_position_func (); - void set_search_position_func (GtkTreeViewSearchPositionFunc func, - gpointer data, - GDestroyNotify destroy); - - /* Convert between the different coordinate systems */ - void convert_widget_to_tree_coords (int wx, - int wy, - int* tx, - int* ty); - void convert_tree_to_widget_coords (int tx, - int ty, - int* wx, - int* wy); - void convert_widget_to_bin_window_coords (int wx, - int wy, - int* bx, - int* by); - void convert_bin_window_to_widget_coords (int bx, - int by, - int* wx, - int* wy); - void convert_tree_to_bin_window_coords (int tx, - int ty, - int* bx, - int* by); - void convert_bin_window_to_tree_coords (int bx, - int by, - int* tx, - int* ty); - - void set_fixed_height_mode (bool enable); - bool get_fixed_height_mode (); - void set_hover_selection (bool hover); - bool get_hover_selection (); - void set_hover_expand (bool expand); - bool get_hover_expand (); - void set_rubber_banding (bool enable); - bool get_rubber_banding (); - - bool is_rubber_banding_active (); - - GtkTreeViewRowSeparatorFunc get_row_separator_func (); - void set_row_separator_func (GtkTreeViewRowSeparatorFunc func, - gpointer data, - GDestroyNotify destroy); - - GtkTreeViewGridLines get_grid_lines (); - void set_grid_lines (GtkTreeViewGridLines grid_lines); - bool get_enable_tree_lines (); - void set_enable_tree_lines (bool enabled); - void set_show_expanders (bool enabled); - bool get_show_expanders (); - void set_level_indentation (int indentation); - int get_level_indentation (); - - /* Convenience functions for setting tooltips */ - void set_tooltip_row (GtkTooltip* tooltip, - GtkTreePath* path); - void set_tooltip_cell (GtkTooltip* tooltip, - GtkTreePath* path, - gtk::TreeViewColumn& column, - gtk::CellRenderer& cell); - bool get_tooltip_context (int* x, - int* y, - bool keyboard_tip, - GtkTreeModel** model, - GtkTreePath** path, - GtkTreeIter* iter); - void set_tooltip_column (int column); - int get_tooltip_column (); -}; - -template<> -class moo::gobj_ref : public virtual moo::gobj_ref_parent -{ -public: - MOO_DEFINE_GOBJREF_METHODS (GtkTreeViewColumn); - - static gtk::TreeViewColumnPtr create (); - static gtk::TreeViewColumnPtr create (const char* title, - gtk::CellRendererPtr cell, - ...) G_GNUC_NULL_TERMINATED; - - void pack_start (gtk::CellRenderer& cell, - bool expand); - void pack_end (gtk::CellRenderer& cell, - bool expand); - void clear (); - std::vector get_cell_renderers (); - void add_attribute (gtk::CellRenderer& cell, - const char* attribute, - int column); - - void set_attributes (gtk::CellRenderer& cell_renderer, const char* prop, int column); - - template - void set_attributes (gtk::CellRenderer& cell_renderer, const char* prop, int column, Args&&... args) - { - set_attributes (cell_renderer, prop, column); - set_attributes (cell_renderer, std::forward (args)...); - } - - // void TFunc(gtk::TreeViewColumn, gtk::CellRenderer, gtk::TreeModel, const GtkTreeIter&) - template - inline void set_cell_data_func (gtk::CellRenderer& cell_renderer, TFunc func); - - void clear_attributes (gtk::CellRenderer& cell_renderer); - void set_spacing (int spacing); - int get_spacing (); - void set_visible (bool visible); - bool get_visible (); - void set_resizable (bool resizable); - bool get_resizable (); - void set_sizing (GtkTreeViewColumnSizing type); - GtkTreeViewColumnSizing get_sizing (); - int get_width (); - int get_fixed_width (); - void set_fixed_width (int fixed_width); - void set_min_width (int min_width); - int get_min_width (); - void set_max_width (int max_width); - int get_max_width (); - void clicked (); - - /* Options for manipulating the column headers - */ - void set_title (const char* title); - gstr get_title (); - void set_expand (bool expand); - bool get_expand (); - void set_clickable (bool clickable); - bool get_clickable (); - void set_widget (gtk::WidgetPtr widget); - gtk::WidgetPtr get_widget (); - void set_alignment (float xalign); - float get_alignment (); - void set_reorderable (bool reorderable); - bool get_reorderable (); - - /* You probably only want to use gtk_tree_view_column_set_sort_column_id. The - * other sorting functions exist primarily to let others do their own custom sorting. - */ - void set_sort_column_id (int sort_column_id); - int get_sort_column_id (); - void set_sort_indicator (bool setting); - bool get_sort_indicator (); - void set_sort_order (GtkSortType order); - GtkSortType get_sort_order (); - - gtk::TreeViewPtr get_tree_view (); -}; - -template<> -class moo::gobj_ref : public virtual moo::gobj_ref_parent -{ -public: - MOO_DEFINE_GOBJREF_METHODS (GtkCellRenderer); -}; - -template<> -class moo::gobj_ref : public virtual moo::gobj_ref_parent -{ -public: - MOO_DEFINE_GOBJREF_METHODS (GtkCellRendererText); - - static gtk::CellRendererTextPtr create (); - - void set_fixed_height_from_font (int number_of_rows); -}; - -template<> -class moo::gobj_ref : public virtual moo::gobj_ref_parent -{ -public: - MOO_DEFINE_GOBJREF_METHODS (GtkCellRendererToggle); - - static gtk::CellRendererTogglePtr create (); - - bool get_radio (); - void set_radio (bool radio); - bool get_active (); - void set_active (bool active); -}; - -template<> -class moo::gobj_ref : public virtual moo::gobj_ref_parent -{ -public: - MOO_DEFINE_GOBJREF_METHODS (GtkCellRendererPixbuf); - - static gtk::CellRendererPixbufPtr create (); -}; - - -template -inline void -TreeCellDataFunc::cell_data_func (GtkTreeViewColumn *tree_column, - GtkCellRenderer *cell, - GtkTreeModel *tree_model, - GtkTreeIter *iter, - gpointer p) -{ - g_return_if_fail (GTK_IS_TREE_VIEW_COLUMN (tree_column)); - g_return_if_fail (GTK_IS_CELL_RENDERER (cell)); - g_return_if_fail (GTK_IS_TREE_MODEL (tree_model)); - g_return_if_fail (iter != nullptr); - g_return_if_fail (p != nullptr); - TreeCellDataFunc& data = *reinterpret_cast(p); - data.m_func (moo::wrap (*tree_column), moo::wrap (*cell), moo::wrap (*tree_model), - const_cast(*iter)); -} - - -template -inline int -moo::gobj_ref::insert_column_with_data_func (int position, - const char* title, - gtk::CellRenderer& cell, - TFunc func) -{ - TreeCellDataFunc *data = new TreeCellDataFunc{ std::move (func) }; - return gtk_tree_view_insert_column_with_data_func (gobj (), position, title, cell.gobj (), - TreeCellDataFunc::cell_data_func, data, - TreeCellDataFunc::destroy); -} - - -// void TFunc(gtk::TreeViewColumn, gtk::CellRenderer, gtk::TreeModel, const GtkTreeIter&) -template -inline void -moo::gobj_ref::set_cell_data_func (gtk::CellRenderer& cell_renderer, TFunc func) -{ - TreeCellDataFunc *data = new TreeCellDataFunc{ std::move (func) }; - gtk_tree_view_column_set_cell_data_func (gobj (), cell_renderer.gobj (), - TreeCellDataFunc::cell_data_func, data, - TreeCellDataFunc::destroy); -} - - -MOO_DEFINE_FLAGS(GdkEventMask); -MOO_DEFINE_FLAGS(GdkModifierType); -MOO_DEFINE_FLAGS(GtkCellRendererState); -MOO_DEFINE_FLAGS(GtkAttachOptions); -MOO_DEFINE_FLAGS(GdkDragAction); - -#endif // __cplusplus diff --git a/moo/moocpp/old/gobjtypes.h b/moo/moocpp/old/gobjtypes.h deleted file mode 100644 index 3905807d..00000000 --- a/moo/moocpp/old/gobjtypes.h +++ /dev/null @@ -1,20 +0,0 @@ -/* - * moocpp/gobjtypes.h - * - * Copyright (C) 2004-2016 by Yevgen Muntyan - * - * This file is part of medit. medit 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. - * - * You should have received a copy of the GNU Lesser General Public - * License along with medit. If not, see . - */ - -#pragma once - -#include -#include -#include diff --git a/moo/moocpp/old/gobjwrapper.h b/moo/moocpp/old/gobjwrapper.h deleted file mode 100644 index 5abed2c5..00000000 --- a/moo/moocpp/old/gobjwrapper.h +++ /dev/null @@ -1,111 +0,0 @@ -/* - * moocpp/gobjwrapper.h - * - * Copyright (C) 2004-2016 by Yevgen Muntyan - * - * This file is part of medit. medit 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. - * - * You should have received a copy of the GNU Lesser General Public - * License along with medit. If not, see . - */ - -#pragma once - -#ifdef __cplusplus - -#include -#include -#include -#include - -namespace moo { - -/////////////////////////////////////////////////////////////////////////////////////////// -// -// gobj_wrapper -// - -class gobj_wrapper_base -{ -protected: - static gobj_wrapper_base& get(gobj_ref g); - - gobj_wrapper_base(gobj_ref g); - virtual ~gobj_wrapper_base(); - - MOO_DISABLE_COPY_OPS(gobj_wrapper_base); - -private: - static GQuark qdata_key; - static void free_qdata(gpointer d); -}; - -template -class gobj_wrapper : public gobj_ref, public gobj_wrapper_base -{ - using obj_ref_type = gobj_ref; - using obj_ptr_type = gobj_ptr; - -public: - template - static gref_ptr create(Args&& ...args) - { - return create(std::forward(args)...); - } - - template - static gref_ptr create(Args&& ...args) - { - obj_ptr_type g = create_gobj(); - gobj_wrapper_data d{g.gobj()}; - auto o = gref_ptr::create(d, std::forward(args)...); - // Now g and o share the ref count, which is currently owned by the g pointer; steal it. - g.release(); - return o; - } - - static CppObject& get(obj_ref_type gobj) - { - gobj_wrapper_base& b = gobj_wrapper_base::get(gobj); - return static_cast(b); - } - - CppObject* operator&() { return static_cast(this); } - - void ref() - { - g_object_ref (obj_ref_type::gobj()); - } - - void unref() - { - g_object_unref (obj_ref_type::gobj()); - } - - MOO_DISABLE_COPY_OPS(gobj_wrapper); - -protected: - struct gobj_wrapper_data { CObject* g; }; - - gobj_wrapper(gobj_wrapper_data& d) - : obj_ref_type(*d.g) - , gobj_wrapper_base(obj_ref_type(*d.g)) - { - } - - virtual ~gobj_wrapper() - { - } -}; - -} // namespace moo - -void g_signal_emit_valist(const moo::gobj_wrapper_base*, guint, GQuark, va_list) = delete; -void g_signal_emit(const moo::gobj_wrapper_base*, guint, GQuark, ...) = delete; -void g_signal_emit_by_name(const moo::gobj_wrapper_base*, const gchar*, ...) = delete; - -#endif // __cplusplus diff --git a/moo/moocpp/old/grefptr.h b/moo/moocpp/old/grefptr.h deleted file mode 100644 index c87f13c2..00000000 --- a/moo/moocpp/old/grefptr.h +++ /dev/null @@ -1,193 +0,0 @@ -/* - * moocpp/grefptr.h - * - * Copyright (C) 2004-2016 by Yevgen Muntyan - * - * This file is part of medit. medit 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. - * - * You should have received a copy of the GNU Lesser General Public - * License along with medit. If not, see . - */ - -#pragma once - -#ifdef __cplusplus - -#include "moocpp/utils.h" - -namespace moo { - -template -struct obj_ref_unref -{ - static void ref(Object* obj) { obj->ref(); } - static void unref(Object* obj) { obj->unref(); } -}; - -enum class ref_transfer -{ - take_ownership, - make_copy, -}; - -template> -class gref_ptr -{ -public: - gref_ptr() : m_p(nullptr) {} - gref_ptr(const nullptr_t&) : gref_ptr() {} - - gref_ptr(Object* obj, ref_transfer policy) - : gref_ptr() - { - assign(obj, policy); - } - - template - static gref_ptr create(Args&& ...args) - { - return wrap_new(new Object(std::forward(args)...)); - } - - static gref_ptr wrap_new(Object* obj) - { - return gref_ptr(obj, ref_transfer::take_ownership); - } - - ~gref_ptr() - { - reset(); - } - - void ref(Object* obj) - { - set(obj); - } - - void set(Object* obj) - { - assign(obj, ref_transfer::make_copy); - } - - void set_new(Object* obj) - { - assign(obj, ref_transfer::take_ownership); - } - - Object* release() - { - auto* tmp = m_p; - m_p = nullptr; - return tmp; - } - - void reset() - { - auto* tmp = m_p; - m_p = nullptr; - if (tmp) - ObjRefUnref::unref(tmp); - } - - // Implicit conversion to Object* is dangerous because there is a lot - // of code still which frees/steals objects directly. For example: - // FooObject* tmp = x->s; - // x->s = NULL; - // g_object_unref (tmp); - operator const Object* () const { return gobj(); } - Object* gobj() const { return m_p; } - Object& operator*() const { return *gobj(); } - Object* operator->() const { return gobj(); } - - // Explicitly forbid other pointer conversions. This way it's still possible to implement - // implicit conversions in subclasses, like that to GTypeInstance in gobj_ptr. - template - operator T*() const = delete; - - operator bool() const { return gobj() != nullptr; } - bool operator!() const { return gobj() == nullptr; } - - template - bool operator==(X* other) const - { - return gobj() == other; - } - - template - bool operator==(const gref_ptr& other) const - { - return gobj() == other.gobj(); - } - - template - bool operator!=(const X& anything) const - { - return !(*this == anything); - } - - gref_ptr(const gref_ptr& other) - : gref_ptr(other.gobj(), ref_transfer::make_copy) - { - } - - gref_ptr(gref_ptr&& other) - : gref_ptr() - { - this->m_p = other.m_p; - other.m_p = nullptr; - } - - gref_ptr& operator=(const gref_ptr& other) - { - assign(other.gobj(), ref_transfer::make_copy); - return *this; - } - - // Pointer assignment is easy to misuse - template - gref_ptr& operator=(T* p) = delete; - - gref_ptr& operator=(gref_ptr&& other) - { - if (gobj() != other.gobj()) - { - assign(other.m_p, ref_transfer::take_ownership); - other.m_p = nullptr; - } - - return *this; - } - -private: - void assign(Object* obj, ref_transfer policy) - { - if (gobj() != obj) - { - Object* tmp = gobj(); - m_p = obj; - if (obj && (policy == ref_transfer::make_copy)) - ObjRefUnref::ref(obj); - if (tmp) - ObjRefUnref::unref(tmp); - } - } - -private: - // This must be a raw pointer, so that zero-initialized gref_ptr is a valid null pointer - Object* m_p; -}; - -// Make sure these aren't called in code ported from pure glib C -template -void g_object_unref(const gref_ptr&) = delete; -template -void g_free(const gref_ptr&) = delete; - -} // namespace moo - -#endif // __cplusplus diff --git a/moo/moocpp/utils.h b/moo/moocpp/utils.h deleted file mode 100644 index e6df621b..00000000 --- a/moo/moocpp/utils.h +++ /dev/null @@ -1,177 +0,0 @@ -/* - * moocpp/utils.h - * - * Copyright (C) 2004-2015 by Yevgen Muntyan - * - * This file is part of medit. medit 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. - * - * You should have received a copy of the GNU Lesser General Public - * License along with medit. If not, see . - */ - -#pragma once - -#ifndef __cplusplus - -#define MOO_CPP_DECLS(code) -#define MOO_CPP_DFLT_PARAM(val) - -#else // __cplusplus - -#define MOO_CPP_DECLS(code) G_END_DECLS code G_BEGIN_DECLS -#define MOO_CPP_DFLT_PARAM(val) = val - -#include -#include -#include -#include -#include -#include - -namespace moo { - -#define MOO_DISABLE_COPY_OPS(Object) \ - Object(const Object&) = delete; \ - Object& operator=(const Object&) = delete; - -#define MOO_DEFINE_FLAGS(Flags) \ - inline Flags operator | (Flags f1, Flags f2) { return static_cast(static_cast(f1) | f2); } \ - inline Flags operator & (Flags f1, Flags f2) { return static_cast(static_cast(f1) & f2); } \ - inline Flags& operator |= (Flags& f1, Flags f2) { f1 = f1 | f2; return f1; } \ - inline Flags& operator &= (Flags& f1, Flags f2) { f1 = f1 & f2; return f1; } \ - inline Flags operator ~ (Flags f) { return static_cast(~static_cast(f)); } \ - -template -auto find(const Container& cont, const U& elm) -> decltype(cont.begin()) -{ - return std::find(cont.begin(), cont.end(), elm); -} - -template -auto find(Container& cont, const U& elm) -> decltype(cont.begin()) -{ - return std::find(cont.begin(), cont.end(), elm); -} - -template -auto find_if(const Container& cont, const UnPr& pred) -> decltype(cont.begin()) -{ - return std::find_if(cont.begin(), cont.end(), pred); -} - -template -bool contains(const Container& vec, const U& elm) -{ - return find(vec, elm) != vec.end(); -} - -template -bool contains_key(const Container& map, const U& elm) -{ - return map.find(elm) != map.end(); -} - -template -bool any_of(const Container& cont, const UnPr& pred) -{ - return std::any_of(cont.begin(), cont.end(), pred); -} - -template -void remove(Container& vec, const U& elm) -{ - auto itr = find(vec, elm); - g_return_if_fail(itr != vec.end()); - vec.erase(itr); -} - -template -void remove_if (Container& vec, const UnPr& pr) -{ - auto itr = find_if (vec, pr); - g_return_if_fail (itr != vec.end ()); - vec.erase (itr); -} - -// C++14 -template -std::unique_ptr make_unique(Args&&... args) -{ - return std::unique_ptr (new T (std::forward (args)...)); -} - -template -std::shared_ptr make_shared (Args&&... args) -{ - return std::shared_ptr (new T (std::forward (args)...)); -} - -class raii -{ -public: - using func_type = std::function; - - raii(func_type&& f) : m_f(std::move(f)) {} - ~raii() { if (m_do) m_f(); } - - raii(raii&& other) : m_f(move(other.m_f)) { other.m_do = false; } - - MOO_DISABLE_COPY_OPS(raii); - -private: - func_type m_f; - bool m_do = true; -}; - -template -raii on_scope_exit(Func&& f) -{ - return raii{ move(f) }; -} - -template -class value_restore -{ -public: - value_restore(T& x) - : m_r(x) - , m_v(x) - { - } - - value_restore(value_restore&& other) - : m_r(other.m_r) - , m_v(std::move(other.m_v)) - { - other.m_do = false; - } - - ~value_restore() - { - if (m_do) - m_r = m_v; - } - - MOO_DISABLE_COPY_OPS(value_restore); - -private: - T& m_r; - T m_v; - bool m_do = true; -}; - -template -value_restore set_temp_value(T& x, const T& tmp_val) -{ - value_restore r(x); - x = tmp_val; - return r; -} - -} // namespace moo - -#endif // __cplusplus diff --git a/moo/mooedit/Makefile.incl b/moo/mooedit/Makefile.incl index a27965d0..da60f578 100644 --- a/moo/mooedit/Makefile.incl +++ b/moo/mooedit/Makefile.incl @@ -1,100 +1,100 @@ -moo_edit_enum_headers = \ +moo_edit_enum_headers = \ mooedit/mooedit-enums.h -moo_sources += \ - $(moo_edit_enum_headers) \ - mooedit/mooeditor.h \ - mooedit/mootextview.h \ - mooedit/mootextprint.h \ - mooedit/mooeditview.h \ - mooedit/mooeditaction.h \ - mooedit/mooeditbookmark.h \ - mooedit/mooeditconfig.h \ - mooedit/mooeditdialogs.h \ - mooedit/mooeditfiltersettings.h \ - mooedit/mooedit.h \ - mooedit/mooedithistoryitem.h \ - mooedit/mooeditprefs.h \ - mooedit/mooedittypes.h \ - mooedit/mooeditwindow.h \ - mooedit/mooeditfileinfo.h \ - mooedit/mooplugin.h \ - mooedit/mootextbuffer.h \ - mooedit/mootextfind.h \ - mooedit/mootextiter.h \ - mooedit/mootextsearch.h \ - mooedit/mootextstylescheme.h \ - mooedit/mooeditview.cpp \ - mooedit/mooeditview-priv.h \ - mooedit/mooeditview-impl.h \ - mooedit/mooeditview-script.cpp \ - mooedit/mooeditview-script.h \ - mooedit/mooedit-accels.h \ - mooedit/mooeditaction.cpp \ - mooedit/mooeditaction-factory.cpp \ - mooedit/mooeditaction-factory.h \ - mooedit/mooeditbookmark.cpp \ - mooedit/mooedit.cpp \ - mooedit/mooeditconfig.cpp \ - mooedit/mooeditdialogs.cpp \ - mooedit/mooedit-enum-types.c \ - mooedit/mooedit-enum-types.h \ - mooedit/mooedit-enums.h \ - mooedit/mooedit-fileops.cpp \ - mooedit/mooedit-fileops.h \ - mooedit/mooeditfiltersettings.cpp \ - mooedit/mooedithistoryitem.cpp \ - mooedit/mooedit-impl.h \ - mooedit/mooedit-script.cpp \ - mooedit/mooedit-script.h \ - mooedit/mooeditprefs.cpp \ - mooedit/mooeditprefspage.cpp \ - mooedit/mooedit-private.h \ - mooedit/mooeditprogress.h \ - mooedit/mooeditprogress.cpp \ - mooedit/mooedittab.cpp \ - mooedit/mooedittab.h \ - mooedit/mooedittab-impl.h \ - mooedit/mooeditwindow.cpp \ - mooedit/mooeditwindow-impl.h \ - mooedit/mooeditfileinfo-impl.h \ - mooedit/mooeditfileinfo.cpp \ - mooedit/moofold.cpp \ - mooedit/moofold.h \ - mooedit/mooindenter.cpp \ - mooedit/mooindenter.h \ - mooedit/moolang.cpp \ - mooedit/moolang.h \ - mooedit/moolangmgr.cpp \ - mooedit/moolangmgr.h \ - mooedit/moolangmgr-private.h \ - mooedit/moolang-private.h \ - mooedit/moolinebuffer.cpp \ - mooedit/moolinebuffer.h \ - mooedit/moolinemark.cpp \ - mooedit/moolinemark.h \ - mooedit/mooplugin.cpp \ - mooedit/mooplugin-loader.cpp \ - mooedit/mooplugin-loader.h \ - mooedit/mooplugin-macro.h \ - mooedit/mootextbtree.cpp \ - mooedit/mootextbtree.h \ - mooedit/mootextbuffer.cpp \ - mooedit/mootextfind.cpp \ - mooedit/mootextprint.cpp \ - mooedit/mootextprint-private.h \ - mooedit/mootext-private.h \ - mooedit/mootextsearch.cpp \ - mooedit/mootextsearch-private.h \ - mooedit/mootextstylescheme.cpp \ - mooedit/mootextview.cpp \ - mooedit/mootextview-input.cpp \ - mooedit/mootextview-private.h \ - mooedit/mooeditor.cpp \ - mooedit/mooeditor-impl.h \ - mooedit/mooeditor-private.h \ - mooedit/mooeditor-tests.cpp \ - mooedit/mooeditor-tests.h \ +moo_sources += \ + $(moo_edit_enum_headers) \ + mooedit/mooeditor.h \ + mooedit/mootextview.h \ + mooedit/mootextprint.h \ + mooedit/mooeditview.h \ + mooedit/mooeditaction.h \ + mooedit/mooeditbookmark.h \ + mooedit/mooeditconfig.h \ + mooedit/mooeditdialogs.h \ + mooedit/mooeditfiltersettings.h \ + mooedit/mooedit.h \ + mooedit/mooedithistoryitem.h \ + mooedit/mooeditprefs.h \ + mooedit/mooedittypes.h \ + mooedit/mooeditwindow.h \ + mooedit/mooeditfileinfo.h \ + mooedit/mooplugin.h \ + mooedit/mootextbuffer.h \ + mooedit/mootextfind.h \ + mooedit/mootextiter.h \ + mooedit/mootextsearch.h \ + mooedit/mootextstylescheme.h \ + mooedit/mooeditview.c \ + mooedit/mooeditview-priv.h \ + mooedit/mooeditview-impl.h \ + mooedit/mooeditview-script.c \ + mooedit/mooeditview-script.h \ + mooedit/mooedit-accels.h \ + mooedit/mooeditaction.c \ + mooedit/mooeditaction-factory.c \ + mooedit/mooeditaction-factory.h \ + mooedit/mooeditbookmark.c \ + mooedit/mooedit.c \ + mooedit/mooeditconfig.c \ + mooedit/mooeditdialogs.c \ + mooedit/mooedit-enum-types.c \ + mooedit/mooedit-enum-types.h \ + mooedit/mooedit-enums.h \ + mooedit/mooedit-fileops.c \ + mooedit/mooedit-fileops.h \ + mooedit/mooeditfiltersettings.c \ + mooedit/mooedithistoryitem.c \ + mooedit/mooedit-impl.h \ + mooedit/mooedit-script.c \ + mooedit/mooedit-script.h \ + mooedit/mooeditprefs.c \ + mooedit/mooeditprefspage.c \ + mooedit/mooedit-private.h \ + mooedit/mooeditprogress.h \ + mooedit/mooeditprogress.c \ + mooedit/mooedittab.c \ + mooedit/mooedittab.h \ + mooedit/mooedittab-impl.h \ + mooedit/mooeditwindow.c \ + mooedit/mooeditwindow-impl.h \ + mooedit/mooeditfileinfo-impl.h \ + mooedit/mooeditfileinfo.c \ + mooedit/moofold.c \ + mooedit/moofold.h \ + mooedit/mooindenter.c \ + mooedit/mooindenter.h \ + mooedit/moolang.c \ + mooedit/moolang.h \ + mooedit/moolangmgr.c \ + mooedit/moolangmgr.h \ + mooedit/moolangmgr-private.h \ + mooedit/moolang-private.h \ + mooedit/moolinebuffer.c \ + mooedit/moolinebuffer.h \ + mooedit/moolinemark.c \ + mooedit/moolinemark.h \ + mooedit/mooplugin.c \ + mooedit/mooplugin-loader.c \ + mooedit/mooplugin-loader.h \ + mooedit/mooplugin-macro.h \ + mooedit/mootextbtree.c \ + mooedit/mootextbtree.h \ + mooedit/mootextbuffer.c \ + mooedit/mootextfind.c \ + mooedit/mootextprint.c \ + mooedit/mootextprint-private.h \ + mooedit/mootext-private.h \ + mooedit/mootextsearch.c \ + mooedit/mootextsearch-private.h \ + mooedit/mootextstylescheme.c \ + mooedit/mootextview.c \ + mooedit/mootextview-input.c \ + mooedit/mootextview-private.h \ + mooedit/mooeditor.cpp \ + mooedit/mooeditor-impl.h \ + mooedit/mooeditor-private.h \ + mooedit/mooeditor-tests.c \ + mooedit/mooeditor-tests.h \ mooedit/mooeditor-tests.h EXTRA_DIST += \ diff --git a/moo/mooedit/mooedit-enums.h b/moo/mooedit/mooedit-enums.h index 01edd7b1..95a0ba45 100644 --- a/moo/mooedit/mooedit-enums.h +++ b/moo/mooedit/mooedit-enums.h @@ -137,7 +137,7 @@ G_END_DECLS #ifdef __cplusplus -#include "moocpp/utils.h" +#include "mooutils/mooutils-cpp.h" MOO_DEFINE_FLAGS(MooEditStatus) MOO_DEFINE_FLAGS(MooOpenFlags) diff --git a/moo/mooedit/mooedit-fileops.c b/moo/mooedit/mooedit-fileops.c new file mode 100644 index 00000000..cf308548 --- /dev/null +++ b/moo/mooedit/mooedit-fileops.c @@ -0,0 +1,1477 @@ +/* + * mooedit-fileops.c + * + * Copyright (C) 2004-2010 by Yevgen Muntyan + * Copyright (C) 2014 by Ulrich Eckhardt + * + * This file is part of medit. medit 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. + * + * You should have received a copy of the GNU Lesser General Public + * License along with medit. If not, see . + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "mooedit/mooedit-private.h" +#include "mooedit/mooeditor-impl.h" +#include "mooedit/mooedit-fileops.h" +#include "mooedit/mooeditdialogs.h" +#include "mooedit/mootextbuffer.h" +#include "mooedit/mooeditprefs.h" +#include "mooutils/moofileicon.h" +#include "mooutils/moofilewatch.h" +#include "mooutils/mooencodings.h" +#include "mooutils/mooi18n.h" +#include "mooutils/mootype-macros.h" +#include "mooutils/mooutils.h" +#include "mooutils/mooutils-fs.h" +#include "mooutils/moocompat.h" +#include +#include +#include +#ifdef HAVE_UNISTD_H +#include +#endif +#include + +#include + +#define ENCODING_LOCALE "LOCALE" + +MOO_DEFINE_QUARK (MooEditFileErrorQuark, _moo_edit_file_error_quark) + +static GSList *UNTITLED = NULL; +static GHashTable *UNTITLED_NO = NULL; + +static void block_buffer_signals (MooEdit *edit); +static void unblock_buffer_signals (MooEdit *edit); +static void check_file_status (MooEdit *edit); +static void file_modified_on_disk (MooEdit *edit); +static void file_deleted (MooEdit *edit); +static void add_status (MooEdit *edit, + MooEditStatus s); + +static void moo_edit_load_text (MooEdit *edit, + GFile *file, + const char *encoding, + const char *text); +static gboolean moo_edit_reload_local (MooEdit *edit, + const char *encoding, + GError **error); +static gboolean moo_edit_save_local (MooEdit *edit, + GFile *file, + const char *encoding, + MooEditSaveFlags flags, + GError **error); +static gboolean moo_edit_save_copy_local (MooEdit *edit, + GFile *file, + const char *encoding, + MooEditSaveFlags flags, + GError **error); +static void _moo_edit_start_file_watch (MooEdit *edit); + +static char *moo_convert_file_data_to_utf8 (const char *data, + gsize len, + const char *encoding, + const char *cached_encoding, + char **used_enc); +static gboolean encoding_needs_bom_save (const char *enc, + const char **enc_no_bom, + const char **bom, + gsize *bom_len); +static gboolean encoding_is_utf8 (const char *encoding); + +static gboolean check_regular (GFile *file, + GError **error); + +gboolean +_moo_is_file_error_cancelled (GError *error) +{ + return error && error->domain == MOO_EDIT_FILE_ERROR && + error->code == MOO_EDIT_FILE_ERROR_CANCELLED; +} + + +static const char * +normalize_encoding (const char *encoding, + gboolean for_save) +{ + if (!encoding || !encoding[0] || !strcmp (encoding, MOO_ENCODING_AUTO)) + encoding = for_save ? MOO_ENCODING_UTF8 : NULL; + return encoding; +} + + +gboolean +_moo_edit_file_is_new (GFile *file) +{ + gboolean is_new; + char *filename; + g_return_val_if_fail (G_IS_FILE (file), FALSE); + filename = g_file_get_path (file); + g_return_val_if_fail (filename != NULL, FALSE); + is_new = !g_file_test (filename, G_FILE_TEST_EXISTS); + g_free (filename); + return is_new; +} + + +static gboolean +load_file_contents (GFile *gfile, + char **data, + gsize *data_len, + GError **error) +{ + char *path = NULL; + gboolean retval = FALSE; + + if (!check_regular (gfile, error)) + return FALSE; + + if (!(path = g_file_get_path (gfile))) + { + g_set_error (error, MOO_EDIT_FILE_ERROR, + MOO_EDIT_FILE_ERROR_NOT_IMPLEMENTED, + "Loading remote files is not implemented"); + return FALSE; + } + + retval = g_file_get_contents (path, data, data_len, error); + + g_free (path); + return retval; +} + +static char * +convert_file_data_to_utf8_with_prompt (const char *data, + gsize data_len, + GFile *file, + const char *encoding, + const char *cached_encoding, + char **used_encoding) +{ + char *freeme = NULL; + char *text_utf8 = NULL; + char *new_encoding = NULL; + + while (TRUE) + { + MooEditTryEncodingResponse response; + + text_utf8 = moo_convert_file_data_to_utf8 (data, data_len, encoding, cached_encoding, &new_encoding); + + if (text_utf8) + break; + + g_free (new_encoding); + new_encoding = NULL; + + response = _moo_edit_try_encoding_dialog (file, encoding, &new_encoding); + + switch (response) + { + case MOO_EDIT_TRY_ENCODING_RESPONSE_CANCEL: + g_free (new_encoding); + new_encoding = NULL; + break; + + case MOO_EDIT_TRY_ENCODING_RESPONSE_TRY_ANOTHER: + g_assert (new_encoding != NULL); + break; + } + + if (!new_encoding) + break; + + g_free (freeme); + freeme = new_encoding; + encoding = normalize_encoding (new_encoding, FALSE); + cached_encoding = NULL; + } + + *used_encoding = g_strdup (new_encoding); + + g_free (freeme); + return text_utf8; +} + +gboolean +_moo_edit_load_file (MooEdit *edit, + GFile *file, + const char *encoding, + const char *cached_encoding, + GError **error) +{ + char *freeme1 = NULL; + char *freeme2 = NULL; + gboolean result = FALSE; + GError *error_here = NULL; + char *data = NULL; + gsize data_len = 0; + char *data_utf8 = NULL; + char *used_encoding = NULL; + + moo_return_error_if_fail (MOO_IS_EDIT (edit)); + moo_return_error_if_fail (G_IS_FILE (file)); + moo_return_error_if_fail (!MOO_EDIT_IS_BUSY (edit)); + + encoding = freeme1 = g_strdup (normalize_encoding (encoding, FALSE)); + cached_encoding = freeme2 = cached_encoding ? g_strdup (normalize_encoding (cached_encoding, FALSE)) : NULL; + + if (!load_file_contents (file, &data, &data_len, &error_here)) + goto done; + + data_utf8 = convert_file_data_to_utf8_with_prompt (data, data_len, file, encoding, cached_encoding, &used_encoding); + + if (data_utf8 == NULL) + { + error_here = g_error_new (MOO_EDIT_FILE_ERROR, + MOO_EDIT_FILE_ERROR_CANCELLED, + "Cancelled"); + goto done; + } + + moo_edit_load_text (edit, file, used_encoding, data_utf8); + result = TRUE; + +done: + if (!result) + _moo_edit_stop_file_watch (edit); + + if (error_here) + g_propagate_error (error, error_here); + + g_free (used_encoding); + g_free (data_utf8); + g_free (data); + g_free (freeme1); + g_free (freeme2); + return result; +} + + +gboolean +_moo_edit_reload_file (MooEdit *edit, + const char *encoding, + GError **error) +{ + GError *error_here = NULL; + gboolean result; + + moo_return_error_if_fail (MOO_IS_EDIT (edit)); + + result = moo_edit_reload_local (edit, encoding, &error_here); + + if (error_here) + g_propagate_error (error, error_here); + + return result; +} + + +gboolean +_moo_edit_save_file (MooEdit *edit, + GFile *file, + const char *encoding, + MooEditSaveFlags flags, + GError **error) +{ + GError *error_here = NULL; + char *encoding_copy; + gboolean result; + + moo_return_error_if_fail (MOO_IS_EDIT (edit)); + moo_return_error_if_fail (G_IS_FILE (file)); + + encoding_copy = g_strdup (normalize_encoding (encoding, TRUE)); + + result = moo_edit_save_local (edit, file, encoding_copy, flags, &error_here); + + if (error_here) + g_propagate_error (error, error_here); + + g_free (encoding_copy); + return result; +} + + +gboolean +_moo_edit_save_file_copy (MooEdit *edit, + GFile *file, + const char *encoding, + MooEditSaveFlags flags, + GError **error) +{ + char *encoding_copy; + gboolean result; + + moo_return_error_if_fail (MOO_IS_EDIT (edit)); + moo_return_error_if_fail (G_IS_FILE (file)); + + encoding_copy = g_strdup (normalize_encoding (encoding, TRUE)); + + result = moo_edit_save_copy_local (edit, file, encoding_copy, flags, error); + + g_free (encoding_copy); + return result; +} + + +static void +set_encoding_error (GError **error) +{ + GError *tmp_error = NULL; + g_set_error (&tmp_error, MOO_EDIT_FILE_ERROR, + MOO_EDIT_FILE_ERROR_ENCODING, + "%s", *error ? (*error)->message : "ERROR"); + g_clear_error (error); + g_propagate_error (error, tmp_error); +} + + +/** + * moo_edit_get_line_end_type: + **/ +MooLineEndType +moo_edit_get_line_end_type (MooEdit *edit) +{ + g_return_val_if_fail (MOO_IS_EDIT (edit), MOO_LE_NATIVE); + if (edit->priv->line_end_type == MOO_LE_NONE) + return MOO_LE_NATIVE; + else + return edit->priv->line_end_type; +} + +static void +moo_edit_set_line_end_type_full (MooEdit *edit, + MooLineEndType le, + gboolean quiet) +{ + g_return_if_fail (MOO_IS_EDIT (edit)); + g_return_if_fail (le > 0); + + if (edit->priv->line_end_type != le) + { + edit->priv->line_end_type = le; + if (!quiet) + g_object_notify (G_OBJECT (edit), "line-end-type"); + } +} + +/** + * moo_edit_set_line_end_type: + **/ +void +moo_edit_set_line_end_type (MooEdit *edit, + MooLineEndType le) +{ + g_return_if_fail (MOO_IS_EDIT (edit)); + moo_edit_set_line_end_type_full (edit, le, FALSE); +} + + +/***************************************************************************/ +/* File loading + */ + +static void do_load_text (MooEdit *edit, + const char *text); + +static GSList * +get_encodings (void) +{ + const char *encodings; + char **raw, **p; + GSList *result; + + encodings = moo_prefs_get_string (moo_edit_setting (MOO_EDIT_PREFS_ENCODINGS)); + + if (!encodings || !encodings[0]) + encodings = _moo_get_default_encodings (); + + result = NULL; + raw = g_strsplit (encodings, ",", 0); + + for (p = raw; p && *p; ++p) + { + const char *enc; + + if (!g_ascii_strcasecmp (*p, ENCODING_LOCALE)) + { + if (g_get_charset (&enc)) + enc = "UTF-8"; + } + else + { + enc = *p; + } + + if (!g_slist_find_custom (result, enc, (GCompareFunc) g_ascii_strcasecmp)) + result = g_slist_prepend (result, g_strdup (enc)); + } + + if (!result) + { + g_critical ("oops"); + result = g_slist_prepend (NULL, g_strdup ("UTF-8")); + } + + g_strfreev (raw); + return g_slist_reverse (result); +} + + +static gboolean +check_regular (GFile *file, + GError **error) +{ + GFileInfo *info; + GFileType type; + gboolean retval = TRUE; + + if (!g_file_is_native (file)) + return TRUE; + + if (!(info = g_file_query_info (file, G_FILE_ATTRIBUTE_STANDARD_TYPE, (GFileQueryInfoFlags) 0, NULL, NULL))) + return TRUE; + + type = g_file_info_get_file_type (info); + if (type != G_FILE_TYPE_REGULAR && type != G_FILE_TYPE_UNKNOWN) + { + g_set_error (error, MOO_EDIT_FILE_ERROR, + MOO_EDIT_FILE_ERROR_FAILED, + "%s", D_("Not a regular file", "glib20")); + retval = FALSE; + } + + g_object_unref (info); + return retval; +} + +static void +moo_edit_load_text (MooEdit *edit, + GFile *file, + const char *encoding, + const char *text) +{ + GtkTextIter start; + GtkTextBuffer *buffer; + gboolean undo; + char *freeme = NULL; + MooLineEndType saved_le; + + if (moo_edit_is_empty (edit)) + undo = FALSE; + else + undo = TRUE; + + buffer = moo_edit_get_buffer (edit); + + block_buffer_signals (edit); + + if (undo) + gtk_text_buffer_begin_user_action (buffer); + else + moo_text_buffer_begin_non_undoable_action (MOO_TEXT_BUFFER (buffer)); + + moo_text_buffer_begin_non_interactive_action (MOO_TEXT_BUFFER (buffer)); + + saved_le = edit->priv->line_end_type; + + { + gboolean enable_highlight; + buffer = moo_edit_get_buffer (edit); + gtk_text_buffer_set_text (buffer, "", 0); + g_object_get (buffer, "highlight-syntax", &enable_highlight, (char*) 0); + g_object_set (buffer, "highlight-syntax", FALSE, (char*) 0); + do_load_text (edit, text); + g_object_set (buffer, "highlight-syntax", enable_highlight, (char*) 0); + } + + unblock_buffer_signals (edit); + + if (undo) + gtk_text_buffer_end_user_action (buffer); + else + moo_text_buffer_end_non_undoable_action (MOO_TEXT_BUFFER (buffer)); + + moo_text_buffer_end_non_interactive_action (MOO_TEXT_BUFFER (buffer)); + + gtk_text_buffer_get_start_iter (buffer, &start); + gtk_text_buffer_place_cursor (buffer, &start); + edit->priv->status = (MooEditStatus) 0; + moo_edit_set_modified (edit, FALSE); + _moo_edit_set_file (edit, file, encoding); + if (edit->priv->line_end_type != saved_le) + g_object_notify (G_OBJECT (edit), "line-end-type"); + _moo_edit_start_file_watch (edit); + + g_free (freeme); +} + + +static void +do_load_text (MooEdit *edit, + const char *text) +{ + GtkTextBuffer *buffer; + MooLineEndType le = MOO_LE_NONE; + gboolean mixed_le = FALSE; + const char *line = NULL; + MooLineReader lr; + gsize line_len; + gsize line_term_len; + GString *strbuf; + + strbuf = g_string_new (NULL); + buffer = moo_edit_get_buffer (edit); + + moo_line_reader_init (&lr, text, -1); + + while ((line = moo_line_reader_get_line (&lr, &line_len, &line_term_len)) != NULL) + { + gboolean insert_line_term = FALSE; + MooLineEndType le_here = MOO_LE_NONE; + gsize copy_len = line_len; + + if (line_term_len != 0) + { + const char *line_term = line + line_len; + + insert_line_term = TRUE; + + if (line_term_len == 1 && !strncmp (line_term, "\r", line_term_len)) + { + le_here = MOO_LE_MAC; + } + else if (line_term_len == 1 && !strncmp (line_term, "\n", line_term_len)) + { + le_here = MOO_LE_UNIX; + } + else if (line_term_len == 2 && !strncmp (line_term, "\r\n", line_term_len)) + { + le_here = MOO_LE_WIN32; + } + else if (line_term_len == 3 && !strncmp ("\xe2\x80\xa9", line_term, line_term_len)) + { + insert_line_term = FALSE; + copy_len += line_term_len; + } + else + { + g_critical ("oops"); + copy_len += line_term_len; + } + + if (le_here) + { + if (mixed_le || (le && le != le_here)) + mixed_le = TRUE; + else + le = le_here; + } + } + + g_string_append_len (strbuf, line, copy_len); + + if (insert_line_term) + g_string_append_c (strbuf, '\n'); + } + + gtk_text_buffer_insert_at_cursor (buffer, strbuf->str, (int) strbuf->len); + + if (mixed_le) + le = MOO_LE_NATIVE; + + if (le != MOO_LE_NONE) + moo_edit_set_line_end_type_full (edit, le, TRUE); + + g_string_free (strbuf, TRUE); +} + + +/* XXX */ +static gboolean +moo_edit_reload_local (MooEdit *edit, + const char *encoding, + GError **error) +{ + gboolean result; + GFile *file; + + file = moo_edit_get_file (edit); + moo_return_error_if_fail (G_IS_FILE (file)); + + result = _moo_edit_load_file (edit, file, + encoding ? encoding : edit->priv->encoding, + NULL, + error); + + if (result) + { + edit->priv->status = (MooEditStatus) 0; + moo_edit_set_modified (edit, FALSE); + _moo_edit_start_file_watch (edit); + g_clear_error (error); + } + + g_object_unref (file); + return result; +} + + +/***************************************************************************/ +/* File saving + */ + +static char * +get_contents_with_fixed_line_end (GtkTextBuffer *buffer, const char *le, gsize le_len) +{ + GtkTextIter line_start; + GString *contents; + + contents = g_string_new (NULL); + gtk_text_buffer_get_start_iter (buffer, &line_start); + + do + { + GtkTextIter line_end = line_start; + + if (!gtk_text_iter_ends_line (&line_start)) + { + char *line; + gsize len; + + gtk_text_iter_forward_to_line_end (&line_end); + line = gtk_text_buffer_get_text (buffer, &line_start, &line_end, TRUE); + len = strlen (line); + + g_string_append_len (contents, line, len); + + g_free (line); + } + + if (!gtk_text_iter_is_end (&line_end)) + g_string_append_len (contents, le, le_len); + } + while (gtk_text_iter_forward_line (&line_start)); + + return g_string_free (contents, FALSE); +} + +static char * +get_contents (MooEdit *edit) +{ + const char *le = "\n"; + gsize le_len = 1; + GtkTextBuffer *buffer; + + switch (moo_edit_get_line_end_type (edit)) + { + case MOO_LE_UNIX: + le = "\n"; + le_len = 1; + break; + case MOO_LE_WIN32: + le = "\r\n"; + le_len = 2; + break; + case MOO_LE_MAC: + le = "\r"; + le_len = 1; + break; + default: + moo_assert_not_reached (); + } + + buffer = moo_edit_get_buffer (edit); + return get_contents_with_fixed_line_end (buffer, le, le_len); +} + +static gboolean +do_write (GFile *file, + const char *data1, + gsize len1, + const char *data2, + gsize len2, + MooEditSaveFlags flags, + GError **error) +{ + MooFileWriter *writer; + MooFileWriterFlags writer_flags; + gboolean success = FALSE; + + moo_return_error_if_fail (G_IS_FILE (file)); + + writer_flags = (flags & MOO_EDIT_SAVE_BACKUP) ? MOO_FILE_WRITER_SAVE_BACKUP : (MooFileWriterFlags) 0; + + if ((writer = moo_file_writer_new_for_file (file, writer_flags, error))) + { + success = TRUE; + if (success && len1 > 0) + success = moo_file_writer_write (writer, data1, len1); + if (success && len2 > 0) + success = moo_file_writer_write (writer, data2, len2); + if (success) + success = moo_file_writer_close (writer, error); + } + + return success; +} + +static gboolean +do_save_local (MooEdit *edit, + GFile *file, + const char *encoding, + MooEditSaveFlags flags, + GError **error) +{ + char *utf8_contents; + const char *to_save; + gsize to_save_size; + GError *encoding_error = NULL; + char *freeme = NULL; + gboolean success = TRUE; + const char *enc_no_bom = NULL; + const char *bom = NULL; + gsize bom_len = 0; + + utf8_contents = get_contents (edit); + + moo_release_assert (utf8_contents != NULL); + + if (encoding_needs_bom_save (encoding, &enc_no_bom, &bom, &bom_len)) + encoding = enc_no_bom; + + if (encoding && encoding_is_utf8 (encoding)) + encoding = NULL; + + if (encoding) + { + gsize bytes_read; + gsize bytes_written; + char *encoded = g_convert (utf8_contents, -1, + encoding, "UTF-8", + &bytes_read, &bytes_written, + &encoding_error); + + if (encoded) + { + to_save = encoded; + to_save_size = bytes_written; + freeme = encoded; + } + else + { + g_propagate_error (error, encoding_error); + set_encoding_error (error); + goto error; + } + } + else + { + to_save = utf8_contents; + to_save_size = strlen (utf8_contents); + } + + if (!do_write (file, bom, bom_len, to_save, to_save_size, flags, error)) + goto error; + + goto out; + +error: + success = FALSE; +out: + g_free (freeme); + g_free (utf8_contents); + return success; +} + + +static gboolean +moo_edit_save_local (MooEdit *edit, + GFile *file, + const char *encoding, + MooEditSaveFlags flags, + GError **error) +{ + moo_return_error_if_fail (MOO_IS_EDIT (edit)); + moo_return_error_if_fail (G_IS_FILE (file)); + + if (!do_save_local (edit, file, encoding, flags, error)) + return FALSE; + + edit->priv->status = (MooEditStatus) 0; + _moo_edit_set_file (edit, file, encoding); + moo_edit_set_modified (edit, FALSE); + _moo_edit_start_file_watch (edit); + return TRUE; +} + + +static gboolean +moo_edit_save_copy_local (MooEdit *edit, + GFile *file, + const char *encoding, + MooEditSaveFlags flags, + GError **error) +{ + moo_return_error_if_fail (MOO_IS_EDIT (edit)); + moo_return_error_if_fail (G_IS_FILE (file)); + return do_save_local (edit, file, encoding, flags, error); +} + + +/***************************************************************************/ +/* Aux stuff + */ + +static void +block_buffer_signals (MooEdit *edit) +{ + g_signal_handler_block (moo_edit_get_buffer (edit), edit->priv->modified_changed_handler_id); +} + + +static void +unblock_buffer_signals (MooEdit *edit) +{ + g_signal_handler_unblock (moo_edit_get_buffer (edit), edit->priv->modified_changed_handler_id); +} + + +static void +file_watch_callback (G_GNUC_UNUSED MooFileWatch *watch, + MooFileEvent *event, + gpointer data) +{ + MooEdit *edit = MOO_EDIT (data); + + g_return_if_fail (MOO_IS_EDIT (data)); + g_return_if_fail (event->monitor_id == edit->priv->file_monitor_id); + g_return_if_fail (edit->priv->filename != NULL); + g_return_if_fail (!(edit->priv->status & MOO_EDIT_STATUS_CHANGED_ON_DISK)); + + switch (event->code) + { + case MOO_FILE_EVENT_CHANGED: + edit->priv->modified_on_disk = TRUE; + break; + + case MOO_FILE_EVENT_DELETED: + edit->priv->deleted_from_disk = TRUE; + edit->priv->file_monitor_id = 0; + break; + + case MOO_FILE_EVENT_ERROR: + /* XXX and what to do now? */ + break; + + case MOO_FILE_EVENT_CREATED: + g_critical ("oops"); + break; + } + + check_file_status (edit); +} + + +static void +_moo_edit_start_file_watch (MooEdit *edit) +{ + MooFileWatch *watch; + GError *error = NULL; + + watch = _moo_editor_get_file_watch (edit->priv->editor); + g_return_if_fail (watch != NULL); + + if (edit->priv->file_monitor_id) + moo_file_watch_cancel_monitor (watch, edit->priv->file_monitor_id); + edit->priv->file_monitor_id = 0; + + g_return_if_fail ((edit->priv->status & MOO_EDIT_STATUS_CHANGED_ON_DISK) == 0); + g_return_if_fail (edit->priv->filename != NULL); + + edit->priv->file_monitor_id = + moo_file_watch_create_monitor (watch, edit->priv->filename, + file_watch_callback, + edit, NULL, &error); + + if (!edit->priv->file_monitor_id) + { + g_warning ("could not start watch for '%s': %s", + edit->priv->filename, moo_error_message (error)); + g_error_free (error); + return; + } +} + + +void +_moo_edit_stop_file_watch (MooEdit *edit) +{ + MooFileWatch *watch; + + watch = _moo_editor_get_file_watch (edit->priv->editor); + g_return_if_fail (watch != NULL); + + if (edit->priv->file_monitor_id) + moo_file_watch_cancel_monitor (watch, edit->priv->file_monitor_id); + edit->priv->file_monitor_id = 0; +} + + +static void +check_file_status (MooEdit *edit) +{ + g_return_if_fail (edit->priv->filename != NULL); + g_return_if_fail (!(edit->priv->status & MOO_EDIT_STATUS_CHANGED_ON_DISK)); + + if (edit->priv->deleted_from_disk) + file_deleted (edit); + else if (edit->priv->modified_on_disk) + file_modified_on_disk (edit); +} + + +static void +file_modified_on_disk (MooEdit *edit) +{ + g_return_if_fail (edit->priv->filename != NULL); + + if (moo_prefs_get_bool (moo_edit_setting (MOO_EDIT_PREFS_AUTO_SYNC))) + { + moo_edit_reload (edit, NULL, NULL); + } + else + { + edit->priv->modified_on_disk = FALSE; + edit->priv->deleted_from_disk = FALSE; + _moo_edit_stop_file_watch (edit); + add_status (edit, MOO_EDIT_STATUS_MODIFIED_ON_DISK); + } +} + + +static void +file_deleted (MooEdit *edit) +{ + g_return_if_fail (edit->priv->filename != NULL); + + if (moo_prefs_get_bool (moo_edit_setting (MOO_EDIT_PREFS_AUTO_SYNC))) + { + moo_edit_close(edit); + } + else + { + edit->priv->modified_on_disk = FALSE; + edit->priv->deleted_from_disk = FALSE; + _moo_edit_stop_file_watch (edit); + add_status (edit, MOO_EDIT_STATUS_DELETED); + } +} + + +static void +add_status (MooEdit *edit, + MooEditStatus s) +{ + edit->priv->status = (MooEditStatus) (edit->priv->status | s); + g_signal_emit_by_name (edit, "doc-status-changed", NULL); +} + + +void +_moo_edit_remove_untitled (MooEdit *doc) +{ + gpointer n = g_hash_table_lookup (UNTITLED_NO, doc); + + if (n) + { + UNTITLED = g_slist_remove (UNTITLED, n); + g_hash_table_remove (UNTITLED_NO, doc); + } +} + + +static int +add_untitled (MooEdit *edit) +{ + int n; + + if (!(n = GPOINTER_TO_INT (g_hash_table_lookup (UNTITLED_NO, edit)))) + { + for (n = 1; ; ++n) + { + if (!g_slist_find (UNTITLED, GINT_TO_POINTER (n))) + { + UNTITLED = g_slist_prepend (UNTITLED, GINT_TO_POINTER (n)); + break; + } + } + + g_hash_table_insert (UNTITLED_NO, edit, GINT_TO_POINTER (n)); + } + + return n; +} + + +static char * +moo_file_get_display_basename (GFile *file) +{ + char *name; + const char *slash; + + g_return_val_if_fail (G_IS_FILE (file), NULL); + + name = moo_file_get_display_name (file); + g_return_val_if_fail (name != NULL, NULL); + + slash = strrchr (name, '/'); + +#ifdef G_OS_WIN32 + { + const char *backslash = strrchr (name, '\\'); + if (backslash && (!slash || backslash > slash)) + slash = backslash; + } +#endif + + if (slash) + memmove (name, slash + 1, strlen (slash + 1) + 1); + + return name; +} + +char * +_moo_edit_normalize_filename_for_comparison (const char *filename) +{ +#ifdef __WIN32__ + /* XXX */ + char *tmp; + char *ret; + g_return_val_if_fail (filename != NULL, NULL); + tmp = g_utf8_normalize (filename, -1, G_NORMALIZE_ALL_COMPOSE); + ret = g_utf8_strdown (tmp, -1); + g_free (tmp); + return ret; +#else + g_return_val_if_fail (filename != NULL, NULL); + return g_strdup (filename); +#endif +} + +char *_moo_edit_normalize_uri_for_comparison (const char *uri) +{ + return _moo_edit_normalize_filename_for_comparison (uri); +} + +char * +_moo_file_get_normalized_name (GFile *file) +{ + char *ret; + char *tmp = NULL; + char *tmp2 = NULL; + + g_return_val_if_fail (G_IS_FILE (file), NULL); + + tmp = g_file_get_path (file); + + if (tmp) + { + tmp2 = _moo_normalize_file_path (tmp); + ret = _moo_edit_normalize_filename_for_comparison (tmp2); + } + else + { + tmp = g_file_get_uri (file); + g_return_val_if_fail (tmp != NULL, NULL); + ret = _moo_edit_normalize_uri_for_comparison (tmp); + } + + g_free (tmp2); + g_free (tmp); + return ret; +} + +void +_moo_edit_set_file (MooEdit *edit, + GFile *file, + const char *encoding) +{ + GFile *tmp; + GSList *free_list = NULL; + + tmp = edit->priv->file; + + free_list = g_slist_prepend (free_list, edit->priv->filename); + free_list = g_slist_prepend (free_list, edit->priv->norm_name); + free_list = g_slist_prepend (free_list, edit->priv->display_filename); + free_list = g_slist_prepend (free_list, edit->priv->display_basename); + + if (!UNTITLED_NO) + UNTITLED_NO = g_hash_table_new (g_direct_hash, g_direct_equal); + + if (!file) + { + int n = add_untitled (edit); + + edit->priv->file = NULL; + edit->priv->filename = NULL; + edit->priv->norm_name = NULL; + + if (n == 1) + edit->priv->display_filename = g_strdup (_("Untitled")); + else + edit->priv->display_filename = g_strdup_printf (_("Untitled %d"), n); + + edit->priv->display_basename = g_strdup (edit->priv->display_filename); + } + else + { + _moo_edit_remove_untitled (edit); + edit->priv->file = g_file_dup (file); + edit->priv->filename = g_file_get_path (file); + edit->priv->norm_name = _moo_file_get_normalized_name (file); + edit->priv->display_filename = moo_file_get_display_name (file); + edit->priv->display_basename = moo_file_get_display_basename (file); + } + + if (!encoding) + moo_edit_set_encoding (edit, _moo_edit_get_default_encoding ()); + else + moo_edit_set_encoding (edit, encoding); + + g_signal_emit_by_name (edit, "filename-changed", NULL); + _moo_edit_status_changed (edit); + _moo_edit_queue_recheck_config (edit); + + moo_file_free (tmp); + + g_slist_foreach (free_list, (GFunc) g_free, NULL); + g_slist_free (free_list); +} + + +GdkPixbuf * +_moo_edit_get_icon (MooEdit *doc, + GtkWidget *widget, + GtkIconSize size) +{ + if (doc->priv->filename) + return moo_get_icon_for_path (doc->priv->filename, widget, size); + else if (doc->priv->file) + return moo_get_icon_for_path (doc->priv->display_basename, widget, size); + else + return moo_get_icon_for_path (NULL, widget, size); +} + + +/*************************************************************************** + * + * Character encoding conversion + * + */ + +#define BOM_UTF8 "\xEF\xBB\xBF" +#define BOM_UTF8_LEN 3 +#define BOM_UTF16_LE "\xFF\xFE" +#define BOM_UTF16_BE "\xFE\xFF" +#define BOM_UTF16_LEN 2 +#define BOM_UTF32_LE "\xFF\xFE\x00\x00" +#define BOM_UTF32_BE "\x00\x00\xFE\xFF" +#define BOM_UTF32_LEN 4 + +#if G_BYTE_ORDER == G_LITTLE_ENDIAN +#define BOM_UTF16 BOM_UTF16_LE +#define BOM_UTF32 BOM_UTF32_LE +#else +#define BOM_UTF16 BOM_UTF16_BE +#define BOM_UTF32 BOM_UTF32_BE +#endif + +static char * +try_convert_to_utf8_from_utf8 (const char *data, + gsize len) +{ + const char *invalid; + gboolean valid_utf8; + +// g_print ("try_convert_to_utf8_from_utf8()\n"); + + if (len >= BOM_UTF8_LEN && memcmp (data, BOM_UTF8, BOM_UTF8_LEN) == 0) + { + data += BOM_UTF8_LEN; + len -= BOM_UTF8_LEN; + } + + valid_utf8 = g_utf8_validate (data, len, &invalid); + + // allow trailing zero byte + if (!valid_utf8 && invalid + 1 == data + len && *invalid == 0) + valid_utf8 = TRUE; + + return valid_utf8 ? g_strdup (data) : NULL; +} + +static gboolean +encoding_needs_bom_load (const char *enc, + gboolean *bom_optional, + const char **enc_no_bom, + const char **bom, + gsize *bom_len) +{ + guint i; + + static const struct { + const char *enc_bom; + const char *enc_no_bom; + const char *bom; + gsize bom_len; + gboolean optional; + } encs[] = { + { "UTF-8-BOM", "UTF-8", BOM_UTF8, BOM_UTF8_LEN, FALSE }, + { "UTF-16", "UTF-16", BOM_UTF16, BOM_UTF16_LEN, TRUE }, + { "UTF-16LE-BOM", "UTF-16LE", BOM_UTF16_LE, BOM_UTF16_LEN, FALSE }, + { "UTF-16BE-BOM", "UTF-16BE", BOM_UTF16_BE, BOM_UTF16_LEN, FALSE }, + { "UTF-32", "UTF-32", BOM_UTF32, BOM_UTF32_LEN, TRUE }, + { "UTF-32LE-BOM", "UTF-32LE", BOM_UTF32_LE, BOM_UTF32_LEN, FALSE }, + { "UTF-32BE-BOM", "UTF-32BE", BOM_UTF32_BE, BOM_UTF32_LEN, FALSE }, + }; + + for (i = 0; i < G_N_ELEMENTS (encs); ++i) + { + if (!g_ascii_strcasecmp (enc, encs[i].enc_bom)) + { + *enc_no_bom = encs[i].enc_no_bom; + *bom = encs[i].bom; + *bom_len = encs[i].bom_len; + *bom_optional = encs[i].optional; + return TRUE; + } + } + + return FALSE; +} + +static gboolean +encoding_needs_bom_save (const char *enc, + const char **enc_no_bom, + const char **bom, + gsize *bom_len) +{ + guint i; + + static const struct { + const char *enc_bom; + const char *enc_no_bom; + const char *bom; + gsize bom_len; + } encs[] = { + { "UTF-8-BOM", "UTF-8", BOM_UTF8, BOM_UTF8_LEN }, + { "UTF-16LE-BOM", "UTF-16LE", BOM_UTF16_LE, BOM_UTF16_LEN }, + { "UTF-16BE-BOM", "UTF-16BE", BOM_UTF16_BE, BOM_UTF16_LEN }, + { "UTF-32LE-BOM", "UTF-32LE", BOM_UTF32_LE, BOM_UTF32_LEN }, + { "UTF-32BE-BOM", "UTF-32BE", BOM_UTF32_BE, BOM_UTF32_LEN }, + }; + + for (i = 0; i < G_N_ELEMENTS (encs); ++i) + { + if (!g_ascii_strcasecmp (enc, encs[i].enc_bom)) + { + *enc_no_bom = encs[i].enc_no_bom; + *bom = encs[i].bom; + *bom_len = encs[i].bom_len; + return TRUE; + } + } + + return FALSE; +} + +static char * +try_convert_to_utf8_from_non_utf8_encoding (const char *data, + gsize len, + const char *enc) +{ + const char *enc_no_bom = NULL; + const char *bom = NULL; + gsize bom_len = 0; + gsize bytes_read = 0; + gsize bytes_written = 0; + char *result = NULL; + gsize result_len = 0; + gboolean bom_optional = FALSE; + +// g_print ("try_convert_to_utf8_from_non_utf8_encoding(%s)\n", +// enc ? enc : ""); + + if (encoding_needs_bom_load (enc, &bom_optional, &enc_no_bom, &bom, &bom_len)) + { + if (len < bom_len || memcmp (bom, data, bom_len) != 0) + { + if (!bom_optional) + return NULL; + } + else + { + data += bom_len; + len -= bom_len; + enc = enc_no_bom; + } + } + + if (encoding_is_utf8 (enc)) + return try_convert_to_utf8_from_utf8 (data, len); + + result = g_convert (data, len, "UTF-8", enc, &bytes_read, &bytes_written, NULL); + + if (!result) + return NULL; + + if (bytes_read < len) + { + g_free (result); + return NULL; + } + + result_len = strlen (result); + + // ignore trailing zero + if (bytes_written == result_len + 1) + bytes_written -= 1; + + if (result_len < bytes_written) + { + g_free (result); + return NULL; + } + + return result; +} + +static char * +try_convert_to_utf8_from_encoding (const char *data, + gsize len, + const char *enc) +{ + if (encoding_is_utf8 (enc)) + return try_convert_to_utf8_from_utf8 (data, len); + else + return try_convert_to_utf8_from_non_utf8_encoding (data, len, enc); +} + +static gboolean +data_has_bom (const char *data, + gsize len, + const char **bom_enc) +{ + guint i; + + static const struct { + const char *enc; + const char *bom; + gsize bom_len; + } encs[] = { + { "UTF-8-BOM", BOM_UTF8, BOM_UTF8_LEN }, + { "UTF-16-BOM", BOM_UTF16, BOM_UTF16_LEN }, + { "UTF-32-BOM", BOM_UTF32, BOM_UTF32_LEN }, +#if G_BYTE_ORDER == G_LITTLE_ENDIAN + { "UTF-16BE-BOM", BOM_UTF16_BE, BOM_UTF16_LEN }, + { "UTF-32BE-BOM", BOM_UTF32_BE, BOM_UTF32_LEN }, +#else + { "UTF-16LE-BOM", BOM_UTF16_LE, BOM_UTF16_LEN }, + { "UTF-32LE-BOM", BOM_UTF32_LE, BOM_UTF32_LEN }, +#endif + }; + + for (i = 0; i < G_N_ELEMENTS (encs); ++i) + { + const char *bom = encs[i].bom; + gsize bom_len = encs[i].bom_len; + + if (len >= bom_len && memcmp (data, bom, bom_len) == 0) + { + *bom_enc = encs[i].enc; + return TRUE; + } + } + + return FALSE; +} + +static char * +moo_convert_file_data_to_utf8 (const char *data, + gsize len, + const char *encoding, + const char *cached_encoding, + char **used_enc) +{ + char *freeme = NULL; + char *result = NULL; + const char *bom_enc = NULL; + +// g_print ("moo_convert_file_data_to_utf8(%s, %s)\n", +// encoding ? encoding : "", +// cached_encoding ? cached_encoding : ""); + + *used_enc = NULL; + + if (!encoding && data_has_bom (data, len, &bom_enc)) + { + encoding = bom_enc; + result = try_convert_to_utf8_from_encoding (data, len, encoding); + } + else if (!encoding) + { + GSList *encodings; + + encodings = get_encodings (); + if (cached_encoding) + encodings = g_slist_prepend (encodings, g_strdup (cached_encoding)); + + while (encodings) + { + char *enc; + + enc = (char*) encodings->data; + encodings = g_slist_delete_link (encodings, encodings); + + result = try_convert_to_utf8_from_encoding (data, len, enc); + + if (result != NULL) + { + encoding = freeme = enc; + break; + } + + g_free (enc); + } + + g_slist_foreach (encodings, (GFunc) g_free, NULL); + g_slist_free (encodings); + } + else + { + result = try_convert_to_utf8_from_encoding (data, len, encoding); + } + + if (result) + *used_enc = g_strdup (encoding); + g_free (freeme); + return result; +} + +static gboolean +encoding_is_utf8 (const char *encoding) +{ + return !g_ascii_strcasecmp (encoding, "UTF-8") || + !g_ascii_strcasecmp (encoding, "UTF8"); +} diff --git a/moo/mooedit/mooedit-fileops.cpp b/moo/mooedit/mooedit-fileops.cpp deleted file mode 100644 index d1ddcd31..00000000 --- a/moo/mooedit/mooedit-fileops.cpp +++ /dev/null @@ -1,1306 +0,0 @@ -/* - * mooedit-fileops.cpp - * - * Copyright (C) 2004-2016 by Yevgen Muntyan - * Copyright (C) 2014 by Ulrich Eckhardt - * - * This file is part of medit. medit 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. - * - * You should have received a copy of the GNU Lesser General Public - * License along with medit. If not, see . - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "mooedit/mooedit-private.h" -#include "mooedit/mooeditor-impl.h" -#include "mooedit/mooedit-fileops.h" -#include "mooedit/mooeditdialogs.h" -#include "mooedit/mootextbuffer.h" -#include "mooedit/mooeditprefs.h" -#include "mooutils/moofileicon.h" -#include "mooutils/moofilewatch.h" -#include "mooutils/mooencodings.h" -#include "mooutils/mooi18n.h" -#include "mooutils/mootype-macros.h" -#include "mooutils/mooutils.h" -#include "mooutils/mooutils-fs.h" -#include "mooutils/moocompat.h" -#include -#include -#include -#ifdef HAVE_UNISTD_H -#include -#endif -#include - -#include - -#include -#include -using namespace moo; - -#define ENCODING_LOCALE "LOCALE" - -MOO_DEFINE_QUARK (MooEditFileErrorQuark, _moo_edit_file_error_quark) - -static GSList *UNTITLED = NULL; -static GHashTable *UNTITLED_NO = NULL; - -static void block_buffer_signals (Edit edit); -static void unblock_buffer_signals (Edit edit); -static void check_file_status (Edit edit); -static void file_modified_on_disk (Edit edit); -static void file_deleted (Edit edit); -static void add_status (Edit edit, - MooEditStatus s); - -static void moo_edit_load_text (Edit edit, - g::File file, - const char* encoding, - const char* text); -static bool moo_edit_reload_local (Edit edit, - const char* encoding, - gerrp& error); -static bool moo_edit_save_local (Edit edit, - g::File file, - const char* encoding, - MooEditSaveFlags flags, - gerrp& error); -static bool moo_edit_save_copy_local (Edit edit, - g::File file, - const char* encoding, - MooEditSaveFlags flags, - gerrp& error); -static void _moo_edit_start_file_watch (Edit edit); - -static gstr moo_convert_file_data_to_utf8 (const char *data, - gsize len, - const char *encoding, - const char *cached_encoding, - gstr& /*out*/ used_enc); -static bool encoding_needs_bom_save (const char *enc, - const char **enc_no_bom, - const char **bom, - gsize *bom_len); -static bool encoding_is_utf8 (const char *encoding); - -static bool check_regular (g::File file, - gerrp& error); - - -bool _moo_is_file_error_cancelled(const gerrp& error) -{ - return error && error->domain == MOO_EDIT_FILE_ERROR && - error->code == MOO_EDIT_FILE_ERROR_CANCELLED; -} - - -static const char * -normalize_encoding (const char *encoding, - bool for_save) -{ - if (!encoding || !encoding[0] || !strcmp (encoding, MOO_ENCODING_AUTO)) - encoding = for_save ? MOO_ENCODING_UTF8 : NULL; - return encoding; -} - -static gstr -normalize_encoding (const gstr& encoding, - bool for_save) -{ - if (encoding.empty() || encoding == MOO_ENCODING_AUTO) - return for_save ? gstr::wrap_const(MOO_ENCODING_UTF8) : gstr(); - else - return encoding; -} - - -bool _moo_edit_file_is_new(g::File file) -{ - gstr filename = file.get_path(); - g_return_val_if_fail(!filename.empty(), FALSE); - return !g_file_test (filename, G_FILE_TEST_EXISTS); -} - - -static gboolean -load_file_contents (g::File file, - gstr& data, - gsize& data_len, - gerrp& error) -{ - if (!check_regular (file, error)) - return FALSE; - - auto path = file.get_path(); - - if (path.empty()) - { - g_set_error (&error, MOO_EDIT_FILE_ERROR, - MOO_EDIT_FILE_ERROR_NOT_IMPLEMENTED, - "Loading remote files is not implemented"); - return FALSE; - } - - return g::file_get_contents (path, data, data_len, error); -} - -static gstr -convert_file_data_to_utf8_with_prompt (const char* data, - gsize data_len, - g::File file, - gstr encoding, - gstr cached_encoding, - /*out*/ gstr& used_encoding) -{ - gstr text_utf8; - - used_encoding.reset(); - - while (TRUE) - { - MooEditTryEncodingResponse response; - - text_utf8 = moo_convert_file_data_to_utf8 (data, data_len, encoding, cached_encoding, /*out*/ used_encoding); - - if (!text_utf8.is_null()) - break; - - used_encoding.reset(); - response = _moo_edit_try_encoding_dialog (file, encoding, /*out*/ used_encoding); - - switch (response) - { - case MOO_EDIT_TRY_ENCODING_RESPONSE_CANCEL: - used_encoding.reset(); - break; - - case MOO_EDIT_TRY_ENCODING_RESPONSE_TRY_ANOTHER: - g_assert(!used_encoding.empty()); - break; - } - - if (used_encoding.empty()) - break; - - encoding = normalize_encoding (used_encoding, false); - cached_encoding = NULL; - } - - return text_utf8; -} - -bool -_moo_edit_load_file (Edit edit, - g::File file, - const gstr& init_encoding, - const gstr& init_cached_encoding, - gerrp& error) -{ - bool result = false; - gstr used_encoding; - gstr data_utf8; - - moo_return_error_if_fail(!edit._is_busy()); - - gstr encoding = normalize_encoding(init_encoding, false); - gstr cached_encoding; - if (!init_cached_encoding.empty()) - cached_encoding = normalize_encoding(init_cached_encoding, false); - - gstr data; - gsize data_len = 0; - - if (!load_file_contents(file, /*out*/ data, /*out*/ data_len, error)) - goto done; - - data_utf8 = convert_file_data_to_utf8_with_prompt (data, data_len, file, encoding, cached_encoding, /*out*/ used_encoding); - - if (data_utf8.is_null()) - { - g_set_error (&error, MOO_EDIT_FILE_ERROR, MOO_EDIT_FILE_ERROR_CANCELLED, "Cancelled"); - goto done; - } - - moo_edit_load_text(edit, file, used_encoding, data_utf8); - result = TRUE; - -done: - if (!result) - edit._stop_file_watch(); - - return result; -} - - -bool -_moo_edit_reload_file(Edit edit, - const char* encoding, - gerrp& error) -{ - return moo_edit_reload_local(edit, encoding, error); -} - - -bool _moo_edit_save_file(Edit edit, - g::File file, - const char* encoding, - MooEditSaveFlags flags, - gerrp& error) -{ - gstr encoding_copy = gstr::wrap(normalize_encoding(encoding, true)); - return moo_edit_save_local(edit, file, encoding_copy, flags, error); -} - - -bool _moo_edit_save_file_copy(Edit edit, - g::File file, - const char* encoding, - MooEditSaveFlags flags, - gerrp& error) -{ - gstr encoding_copy = gstr::wrap(normalize_encoding(encoding, true)); - return moo_edit_save_copy_local(edit, file, encoding_copy, flags, error); -} - - -static void -set_encoding_error (gerrp& error) -{ - gerrp tmp_error; - g_set_error (&tmp_error, MOO_EDIT_FILE_ERROR, - MOO_EDIT_FILE_ERROR_ENCODING, - "%s", error ? error->message : "ERROR"); - error = std::move(tmp_error); -} - - -/** - * moo_edit_get_line_end_type: - **/ -MooLineEndType -moo_edit_get_line_end_type (MooEdit *edit) -{ - g_return_val_if_fail (MOO_IS_EDIT (edit), MOO_LE_NATIVE); - if (edit->priv->line_end_type == MOO_LE_NONE) - return MOO_LE_NATIVE; - else - return edit->priv->line_end_type; -} - -static void -moo_edit_set_line_end_type_full (Edit edit, - MooLineEndType le, - bool quiet) -{ - g_return_if_fail (le > 0); - - if (edit.get_priv().line_end_type != le) - { - edit.get_priv().line_end_type = le; - if (!quiet) - edit.notify("line-end-type"); - } -} - -/** - * moo_edit_set_line_end_type: - **/ -void -moo_edit_set_line_end_type (MooEdit *edit, - MooLineEndType le) -{ - g_return_if_fail(MOO_IS_EDIT(edit)); - moo_edit_set_line_end_type_full(*edit, le, false); -} - - -/***************************************************************************/ -/* File loading - */ - -static void do_load_text(Edit edit, - const char* text); - -static std::list -get_encodings (void) -{ - const char *encodings; - char **raw, **p; - - encodings = moo_prefs_get_string (moo_edit_setting (MOO_EDIT_PREFS_ENCODINGS)); - - if (!encodings || !encodings[0]) - encodings = _moo_get_default_encodings (); - - std::list result; - raw = g_strsplit (encodings, ",", 0); - - for (p = raw; p && *p; ++p) - { - const char *enc; - - if (!g_ascii_strcasecmp (*p, ENCODING_LOCALE)) - { - if (g_get_charset (&enc)) - enc = "UTF-8"; - } - else - { - enc = *p; - } - - if (!any_of(result, [enc](const char* s) { return g_ascii_strcasecmp(s, enc) == 0; })) - result.emplace_back(gstr::wrap(enc)); - } - - if (result.empty()) - { - g_critical ("oops"); - result.emplace_back(gstr::wrap_const("UTF-8")); - } - - g_strfreev (raw); - return result; -} - - -static bool check_regular (g::File file, gerrp& error) -{ - if (!file.is_native()) - return true; - - gerrp ignored; - g::FileInfoPtr info; - if (!(info = file.query_info(G_FILE_ATTRIBUTE_STANDARD_TYPE, G_FILE_QUERY_INFO_NONE, nullptr, ignored))) - return true; - - GFileType type = g_file_info_get_file_type (info.gobj()); - if (type != G_FILE_TYPE_REGULAR && type != G_FILE_TYPE_UNKNOWN) - { - g_set_error (&error, MOO_EDIT_FILE_ERROR, - MOO_EDIT_FILE_ERROR_FAILED, - "%s", D_("Not a regular file", "glib20")); - return false; - } - - return true; -} - -static void -moo_edit_load_text (Edit edit, - g::File file, - const char* encoding, - const char* text) -{ - MooEditPrivate& priv = edit.get_priv(); - - bool undo = !moo_edit_is_empty(&edit); - - GtkTextBuffer *buffer = moo_edit_get_buffer(&edit); - - block_buffer_signals(edit); - - if (undo) - gtk_text_buffer_begin_user_action(buffer); - else - moo_text_buffer_begin_non_undoable_action(MOO_TEXT_BUFFER(buffer)); - - moo_text_buffer_begin_non_interactive_action(MOO_TEXT_BUFFER(buffer)); - - MooLineEndType saved_le = priv.line_end_type; - - gboolean enable_highlight; - buffer = moo_edit_get_buffer(&edit); - gtk_text_buffer_set_text(buffer, "", 0); - g_object_get(buffer, "highlight-syntax", &enable_highlight, (char*) 0); - g_object_set(buffer, "highlight-syntax", FALSE, (char*) 0); - do_load_text(edit, text); - g_object_set(buffer, "highlight-syntax", enable_highlight, (char*) 0); - - unblock_buffer_signals(edit); - - if (undo) - gtk_text_buffer_end_user_action(buffer); - else - moo_text_buffer_end_non_undoable_action(MOO_TEXT_BUFFER(buffer)); - - moo_text_buffer_end_non_interactive_action(MOO_TEXT_BUFFER(buffer)); - - GtkTextIter start; - gtk_text_buffer_get_start_iter(buffer, &start); - gtk_text_buffer_place_cursor(buffer, &start); - priv.status = (MooEditStatus) 0; - moo_edit_set_modified(&edit, false); - edit._set_file(&file, encoding); - if (priv.line_end_type != saved_le) - edit.notify("line-end-type"); - _moo_edit_start_file_watch(edit); -} - - -static void do_load_text(Edit edit, const char* text) -{ - MooLineEndType le = MOO_LE_NONE; - - GString *strbuf = g_string_new(NULL); - GtkTextBuffer *buffer = moo_edit_get_buffer(&edit); - - MooLineReader lr; - moo_line_reader_init(&lr, text, -1); - - bool mixed_le = false; - const char *line; - gsize line_len; - gsize line_term_len; - while ((line = moo_line_reader_get_line(&lr, &line_len, &line_term_len)) != NULL) - { - gboolean insert_line_term = FALSE; - MooLineEndType le_here = MOO_LE_NONE; - gsize copy_len = line_len; - - if (line_term_len != 0) - { - const char *line_term = line + line_len; - - insert_line_term = TRUE; - - if (line_term_len == 1 && !strncmp(line_term, "\r", line_term_len)) - { - le_here = MOO_LE_MAC; - } - else if (line_term_len == 1 && !strncmp(line_term, "\n", line_term_len)) - { - le_here = MOO_LE_UNIX; - } - else if (line_term_len == 2 && !strncmp(line_term, "\r\n", line_term_len)) - { - le_here = MOO_LE_WIN32; - } - else if (line_term_len == 3 && !strncmp("\xe2\x80\xa9", line_term, line_term_len)) - { - insert_line_term = FALSE; - copy_len += line_term_len; - } - else - { - g_critical("oops"); - copy_len += line_term_len; - } - - if (le_here) - { - if (mixed_le || (le && le != le_here)) - mixed_le = TRUE; - else - le = le_here; - } - } - - g_string_append_len(strbuf, line, copy_len); - - if (insert_line_term) - g_string_append_c(strbuf, '\n'); - } - - gtk_text_buffer_insert_at_cursor(buffer, strbuf->str, (int) strbuf->len); - - if (mixed_le) - le = MOO_LE_NATIVE; - - if (le != MOO_LE_NONE) - moo_edit_set_line_end_type_full(edit, le, TRUE); - - g_string_free(strbuf, TRUE); -} - - -/* XXX */ -static bool moo_edit_reload_local(Edit edit, - const char* encoding, - gerrp& error) -{ - g::FilePtr file = wrap_new(moo_edit_get_file(&edit)); - moo_return_error_if_fail(file != nullptr); - - auto& priv = edit.get_priv(); - gboolean result = _moo_edit_load_file(edit, *file, - encoding ? gstr::wrap(encoding) : priv.encoding, - nullptr, - error); - - if (result) - { - priv.status = (MooEditStatus) 0; - moo_edit_set_modified(&edit, false); - _moo_edit_start_file_watch(edit); - g_clear_error (&error); - } - - return result; -} - - -/***************************************************************************/ -/* File saving - */ - -static gstr -get_contents_with_fixed_line_end (GtkTextBuffer *buffer, const char *le, gsize le_len) -{ - GtkTextIter line_start; - strbuilder contents; - - gtk_text_buffer_get_start_iter (buffer, &line_start); - - do - { - GtkTextIter line_end = line_start; - - if (!gtk_text_iter_ends_line (&line_start)) - { - gtk_text_iter_forward_to_line_end (&line_end); - gstrp line (gtk_text_buffer_get_text (buffer, &line_start, &line_end, TRUE)); - contents.append (line); - } - - if (!gtk_text_iter_is_end (&line_end)) - contents.append(le, le_len); - } - while (gtk_text_iter_forward_line (&line_start)); - - return contents.release(); -} - -static gstr get_contents(MooEdit edit) -{ - const char *le = "\n"; - gsize le_len = 1; - GtkTextBuffer *buffer; - - switch (moo_edit_get_line_end_type(&edit)) - { - case MOO_LE_UNIX: - le = "\n"; - le_len = 1; - break; - case MOO_LE_WIN32: - le = "\r\n"; - le_len = 2; - break; - case MOO_LE_MAC: - le = "\r"; - le_len = 1; - break; - default: - moo_assert_not_reached(); - } - - buffer = moo_edit_get_buffer(&edit); - return get_contents_with_fixed_line_end(buffer, le, le_len); -} - -static bool do_write(g::File file, - const char* data1, - gsize len1, - const char* data2, - gsize len2, - MooEditSaveFlags flags, - gerrp& error) -{ - MooFileWriter *writer; - MooFileWriterFlags writer_flags; - gboolean success = FALSE; - - writer_flags = (flags & MOO_EDIT_SAVE_BACKUP) ? MOO_FILE_WRITER_SAVE_BACKUP : (MooFileWriterFlags) 0; - - if ((writer = moo_file_writer_new_for_file (file, writer_flags, error))) - { - success = TRUE; - if (success && len1 > 0) - success = moo_file_writer_write (writer, data1, len1); - if (success && len2 > 0) - success = moo_file_writer_write (writer, data2, len2); - if (success) - success = moo_file_writer_close (writer, error); - } - - return success; -} - -static bool -do_save_local(Edit edit, - g::File file, - const char* encoding, - MooEditSaveFlags flags, - gerrp& error) -{ - const char *to_save; - gsize to_save_size; - const char *enc_no_bom = NULL; - const char *bom = NULL; - gsize bom_len = 0; - - gstr utf8_contents = get_contents(edit); - moo_release_assert(!utf8_contents.is_null()); - - if (encoding_needs_bom_save(encoding, &enc_no_bom, &bom, &bom_len)) - encoding = enc_no_bom; - - if (encoding && encoding_is_utf8(encoding)) - encoding = NULL; - - if (encoding) - { - gsize bytes_read; - gsize bytes_written; - gerrp encoding_error; - gstr encoded = g::convert(utf8_contents, -1, encoding, "UTF-8", - /*out*/ bytes_read, /*out*/ bytes_written, - encoding_error); - - if (!encoded.is_null()) - { - to_save = encoded; - to_save_size = bytes_written; - } - else - { - error = std::move (encoding_error); - set_encoding_error (error); - return false; - } - } - else - { - to_save = utf8_contents; - to_save_size = strlen(utf8_contents); - } - - if (!do_write(file, bom, bom_len, to_save, to_save_size, flags, error)) - return false; - - return true; -} - - -static bool -moo_edit_save_local(Edit edit, - g::File file, - const char* encoding, - MooEditSaveFlags flags, - gerrp& error) -{ - if (!do_save_local(edit, file, encoding, flags, error)) - return FALSE; - - edit.get_priv().status = (MooEditStatus) 0; - edit._set_file(&file, encoding); - moo_edit_set_modified(&edit, false); - _moo_edit_start_file_watch (edit); - return TRUE; -} - - -static bool moo_edit_save_copy_local(Edit edit, - g::File file, - const char* encoding, - MooEditSaveFlags flags, - gerrp& error) -{ - return do_save_local(edit, file, encoding, flags, error); -} - - -/***************************************************************************/ -/* Aux stuff - */ - -static void -block_buffer_signals(Edit edit) -{ - g_signal_handler_block (moo_edit_get_buffer (&edit), edit.get_priv().modified_changed_handler_id); -} - - -static void -unblock_buffer_signals(Edit edit) -{ - g_signal_handler_unblock(moo_edit_get_buffer(&edit), edit.get_priv().modified_changed_handler_id); -} - - -static void -file_watch_callback(G_GNUC_UNUSED MooFileWatch& watch, - MooFileEvent* event, - gpointer data) -{ - g_return_if_fail(MOO_IS_EDIT(data)); - - Edit edit = *MOO_EDIT(data); - auto& priv = edit.get_priv(); - - g_return_if_fail(event->monitor_id == priv.file_monitor_id); - g_return_if_fail(!priv.filename.empty()); - g_return_if_fail(!(priv.status & MOO_EDIT_STATUS_CHANGED_ON_DISK)); - - switch (event->code) - { - case MOO_FILE_EVENT_CHANGED: - priv.modified_on_disk = TRUE; - break; - - case MOO_FILE_EVENT_DELETED: - priv.deleted_from_disk = TRUE; - priv.file_monitor_id = 0; - break; - - case MOO_FILE_EVENT_ERROR: - /* XXX and what to do now? */ - break; - - case MOO_FILE_EVENT_CREATED: - g_critical ("oops"); - break; - } - - check_file_status (edit); -} - - -static void _moo_edit_start_file_watch(Edit edit) -{ - auto& priv = edit.get_priv(); - - MooFileWatch *watch = _moo_editor_get_file_watch(priv.editor); - g_return_if_fail(watch != NULL); - - if (priv.file_monitor_id) - watch->cancel_monitor(priv.file_monitor_id); - priv.file_monitor_id = 0; - - g_return_if_fail((priv.status & MOO_EDIT_STATUS_CHANGED_ON_DISK) == 0); - g_return_if_fail(!priv.filename.empty()); - - GError *error = nullptr; - priv.file_monitor_id = - watch->create_monitor(priv.filename, - file_watch_callback, - &edit, NULL, &error); - - if (!priv.file_monitor_id) - { - g_warning("could not start watch for '%s': %s", - priv.filename, moo_error_message(error)); - g_error_free(error); - return; - } -} - - -void Edit::_stop_file_watch() -{ - auto& priv = get_priv(); - MooFileWatch *watch = _moo_editor_get_file_watch (priv.editor); - g_return_if_fail (watch != NULL); - - if (priv.file_monitor_id) - watch->cancel_monitor (priv.file_monitor_id); - priv.file_monitor_id = 0; -} - - -static void check_file_status(Edit edit) -{ - auto& priv = edit.get_priv(); - - g_return_if_fail(!priv.filename.empty()); - g_return_if_fail(!(priv.status & MOO_EDIT_STATUS_CHANGED_ON_DISK)); - - if (priv.deleted_from_disk) - file_deleted(edit); - else if (priv.modified_on_disk) - file_modified_on_disk(edit); -} - - -static void file_modified_on_disk(Edit edit) -{ - auto& priv = edit.get_priv(); - - g_return_if_fail (!priv.filename.empty()); - - if (moo_prefs_get_bool (moo_edit_setting (MOO_EDIT_PREFS_AUTO_SYNC))) - { - moo_edit_reload(&edit, NULL, NULL); - } - else - { - priv.modified_on_disk = FALSE; - priv.deleted_from_disk = FALSE; - edit._stop_file_watch (); - add_status(edit, MOO_EDIT_STATUS_MODIFIED_ON_DISK); - } -} - - -static void file_deleted (Edit edit) -{ - auto& priv = edit.get_priv(); - - g_return_if_fail(!priv.filename.empty()); - - if (moo_prefs_get_bool(moo_edit_setting(MOO_EDIT_PREFS_AUTO_SYNC))) - { - moo_edit_close(&edit); - } - else - { - priv.modified_on_disk = FALSE; - priv.deleted_from_disk = FALSE; - edit._stop_file_watch(); - add_status(edit, MOO_EDIT_STATUS_DELETED); - } -} - - -static void add_status(Edit edit, MooEditStatus s) -{ - edit.get_priv().status |= s; - edit.signal_emit_by_name("doc-status-changed", NULL); -} - - -void Edit::_remove_untitled(Edit doc) -{ - gpointer n = g_hash_table_lookup (UNTITLED_NO, &doc); - - if (n) - { - UNTITLED = g_slist_remove (UNTITLED, n); - g_hash_table_remove (UNTITLED_NO, &doc); - } -} - - -static int add_untitled(Edit edit) -{ - int n; - - if (!(n = GPOINTER_TO_INT(g_hash_table_lookup(UNTITLED_NO, &edit)))) - { - for (n = 1; ; ++n) - { - if (!g_slist_find(UNTITLED, GINT_TO_POINTER(n))) - { - UNTITLED = g_slist_prepend(UNTITLED, GINT_TO_POINTER(n)); - break; - } - } - - g_hash_table_insert(UNTITLED_NO, &edit, GINT_TO_POINTER(n)); - } - - return n; -} - - -static gstr moo_file_get_display_basename(g::File file) -{ - const char *slash; - - gstr name = moo_file_get_display_name(file); - g_return_val_if_fail(!name.empty(), NULL); - - slash = strrchr(name, '/'); - -#ifdef G_OS_WIN32 - { - const char *backslash = strrchr(name, '\\'); - if (backslash && (!slash || backslash > slash)) - slash = backslash; - } -#endif - - if (slash) - memmove(name.get_mutable(), slash + 1, strlen(slash + 1) + 1); - - return name; -} - -static gstr normalize_filename_for_comparison(const char *filename) -{ - g_return_val_if_fail(filename != NULL, gstr::null); - -#ifdef __WIN32__ - /* XXX */ - gstr tmp = g::utf8_normalize (filename, G_NORMALIZE_ALL_COMPOSE); - return g::utf8_strdown (tmp); -#else - return gstr::wrap (filename); -#endif -} - -gstr Edit::_get_normalized_name(g::File file) -{ - gstr tmp = file.get_path(); - - if (!tmp.empty()) - { - gstr tmp2 = _moo_normalize_file_path(tmp); - return normalize_filename_for_comparison(tmp2); - } - else - { - tmp = file.get_uri(); - g_return_val_if_fail(!tmp.empty(), nullptr); - return normalize_filename_for_comparison(tmp); - } -} - -void Edit::_set_file(g::FileRawPtr file, - const char* encoding) -{ - if (!UNTITLED_NO) - UNTITLED_NO = g_hash_table_new(g_direct_hash, g_direct_equal); - - auto& priv = get_priv(); - - if (!file) - { - int n = add_untitled(*this); - - priv.file = nullptr; - priv.filename = nullptr; - priv.norm_name = nullptr; - - if (n == 1) - priv.display_filename.set(_("Untitled")); - else - priv.display_filename.set_new(g_strdup_printf(_("Untitled %d"), n)); - - priv.display_basename = priv.display_filename; - } - else - { - _remove_untitled(*this); - priv.file = file->dup(); - priv.filename = file->get_path(); - priv.norm_name = _get_normalized_name(*file); - priv.display_filename = moo_file_get_display_name(*file); - priv.display_basename = moo_file_get_display_basename(*file); - } - - if (!encoding) - moo_edit_set_encoding(gobj(), _moo_edit_get_default_encoding()); - else - moo_edit_set_encoding(gobj(), encoding); - - signal_emit_by_name("filename-changed", nullptr); - _status_changed(); - _queue_recheck_config(); -} - - -GdkPixbuf * -_moo_edit_get_icon (MooEdit *doc, - GtkWidget *widget, - GtkIconSize size) -{ - if (!doc->priv->filename.empty()) - return moo_get_icon_for_path (doc->priv->filename, widget, size); - else if (doc->priv->file) - return moo_get_icon_for_path (doc->priv->display_basename, widget, size); - else - return moo_get_icon_for_path (NULL, widget, size); -} - - -/*************************************************************************** - * - * Character encoding conversion - * - */ - -#define BOM_UTF8 "\xEF\xBB\xBF" -#define BOM_UTF8_LEN 3 -#define BOM_UTF16_LE "\xFF\xFE" -#define BOM_UTF16_BE "\xFE\xFF" -#define BOM_UTF16_LEN 2 -#define BOM_UTF32_LE "\xFF\xFE\x00\x00" -#define BOM_UTF32_BE "\x00\x00\xFE\xFF" -#define BOM_UTF32_LEN 4 - -#if G_BYTE_ORDER == G_LITTLE_ENDIAN -#define BOM_UTF16 BOM_UTF16_LE -#define BOM_UTF32 BOM_UTF32_LE -#else -#define BOM_UTF16 BOM_UTF16_BE -#define BOM_UTF32 BOM_UTF32_BE -#endif - -static gstr -try_convert_to_utf8_from_utf8 (const char *data, - gsize len) -{ - const char *invalid; - gboolean valid_utf8; - -// g_print ("try_convert_to_utf8_from_utf8()\n"); - - if (len >= BOM_UTF8_LEN && memcmp (data, BOM_UTF8, BOM_UTF8_LEN) == 0) - { - data += BOM_UTF8_LEN; - len -= BOM_UTF8_LEN; - } - - valid_utf8 = g_utf8_validate (data, len, &invalid); - - // allow trailing zero byte - if (!valid_utf8 && invalid + 1 == data + len && *invalid == 0) - valid_utf8 = TRUE; - - return valid_utf8 ? gstr::wrap_const (data) : gstr::null; -} - -static gboolean -encoding_needs_bom_load (const char *enc, - gboolean *bom_optional, - const char **enc_no_bom, - const char **bom, - gsize *bom_len) -{ - guint i; - - static const struct { - const char *enc_bom; - const char *enc_no_bom; - const char *bom; - gsize bom_len; - gboolean optional; - } encs[] = { - { "UTF-8-BOM", "UTF-8", BOM_UTF8, BOM_UTF8_LEN, FALSE }, - { "UTF-16", "UTF-16", BOM_UTF16, BOM_UTF16_LEN, TRUE }, - { "UTF-16-BOM", "UTF-16", BOM_UTF16, BOM_UTF16_LEN, FALSE }, - { "UTF-16LE-BOM", "UTF-16LE", BOM_UTF16_LE, BOM_UTF16_LEN, FALSE }, - { "UTF-16BE-BOM", "UTF-16BE", BOM_UTF16_BE, BOM_UTF16_LEN, FALSE }, - { "UTF-32", "UTF-32", BOM_UTF32, BOM_UTF32_LEN, TRUE }, - { "UTF-32-BOM", "UTF-32", BOM_UTF32, BOM_UTF32_LEN, FALSE }, - { "UTF-32LE-BOM", "UTF-32LE", BOM_UTF32_LE, BOM_UTF32_LEN, FALSE }, - { "UTF-32BE-BOM", "UTF-32BE", BOM_UTF32_BE, BOM_UTF32_LEN, FALSE }, - }; - - for (i = 0; i < G_N_ELEMENTS (encs); ++i) - { - if (!g_ascii_strcasecmp (enc, encs[i].enc_bom)) - { - *enc_no_bom = encs[i].enc_no_bom; - *bom = encs[i].bom; - *bom_len = encs[i].bom_len; - *bom_optional = encs[i].optional; - return TRUE; - } - } - - return FALSE; -} - -static bool -encoding_needs_bom_save (const char *enc, - const char **enc_no_bom, - const char **bom, - gsize *bom_len) -{ - guint i; - - static const struct { - const char *enc_bom; - const char *enc_no_bom; - const char *bom; - gsize bom_len; - } encs[] = { - { "UTF-8-BOM", "UTF-8", BOM_UTF8, BOM_UTF8_LEN }, - { "UTF-16LE-BOM", "UTF-16LE", BOM_UTF16_LE, BOM_UTF16_LEN }, - { "UTF-16BE-BOM", "UTF-16BE", BOM_UTF16_BE, BOM_UTF16_LEN }, - { "UTF-32LE-BOM", "UTF-32LE", BOM_UTF32_LE, BOM_UTF32_LEN }, - { "UTF-32BE-BOM", "UTF-32BE", BOM_UTF32_BE, BOM_UTF32_LEN }, - }; - - for (i = 0; i < G_N_ELEMENTS (encs); ++i) - { - if (!g_ascii_strcasecmp (enc, encs[i].enc_bom)) - { - *enc_no_bom = encs[i].enc_no_bom; - *bom = encs[i].bom; - *bom_len = encs[i].bom_len; - return TRUE; - } - } - - return FALSE; -} - -static gstr -try_convert_to_utf8_from_non_utf8_encoding (const char *data, - gsize len, - const char *enc) -{ - const char *enc_no_bom = NULL; - const char *bom = NULL; - gsize bom_len = 0; - gsize bytes_read = 0; - gsize bytes_written = 0; - gsize result_len = 0; - gboolean bom_optional = FALSE; - -// g_print ("try_convert_to_utf8_from_non_utf8_encoding(%s)\n", -// enc ? enc : ""); - - if (encoding_needs_bom_load (enc, &bom_optional, &enc_no_bom, &bom, &bom_len)) - { - if (len < bom_len || memcmp (bom, data, bom_len) != 0) - { - if (!bom_optional) - return NULL; - } - else - { - data += bom_len; - len -= bom_len; - enc = enc_no_bom; - } - } - - if (encoding_is_utf8 (enc)) - return try_convert_to_utf8_from_utf8 (data, len); - - gstr result = gstr::wrap_new (g_convert (data, len, "UTF-8", enc, &bytes_read, &bytes_written, NULL)); - - if (result.is_null ()) - return gstr::null; - - if (bytes_read < len) - return gstr::null; - - result_len = strlen (result); - - // ignore trailing zero - if (bytes_written == result_len + 1) - bytes_written -= 1; - - if (result_len < bytes_written) - return gstr::null; - - return result; -} - -static gstr -try_convert_to_utf8_from_encoding (const char *data, - gsize len, - const char *enc) -{ - if (encoding_is_utf8 (enc)) - return try_convert_to_utf8_from_utf8 (data, len); - else - return try_convert_to_utf8_from_non_utf8_encoding (data, len, enc); -} - -static gboolean -data_has_bom (const char *data, - gsize len, - const char **bom_enc) -{ - guint i; - - static const struct { - const char *enc; - const char *bom; - gsize bom_len; - } encs[] = { - { "UTF-8-BOM", BOM_UTF8, BOM_UTF8_LEN }, - { "UTF-16-BOM", BOM_UTF16, BOM_UTF16_LEN }, - { "UTF-32-BOM", BOM_UTF32, BOM_UTF32_LEN }, -#if G_BYTE_ORDER == G_LITTLE_ENDIAN - { "UTF-16BE-BOM", BOM_UTF16_BE, BOM_UTF16_LEN }, - { "UTF-32BE-BOM", BOM_UTF32_BE, BOM_UTF32_LEN }, -#else - { "UTF-16LE-BOM", BOM_UTF16_LE, BOM_UTF16_LEN }, - { "UTF-32LE-BOM", BOM_UTF32_LE, BOM_UTF32_LEN }, -#endif - }; - - for (i = 0; i < G_N_ELEMENTS (encs); ++i) - { - const char *bom = encs[i].bom; - gsize bom_len = encs[i].bom_len; - - if (len >= bom_len && memcmp (data, bom, bom_len) == 0) - { - *bom_enc = encs[i].enc; - return TRUE; - } - } - - return FALSE; -} - -static gstr -moo_convert_file_data_to_utf8 (const char *data, - gsize len, - const char *encoding, - const char *cached_encoding, - gstr& used_enc) -{ - gstr result; - const char *bom_enc = NULL; - -// g_print ("moo_convert_file_data_to_utf8(%s, %s)\n", -// encoding ? encoding : "", -// cached_encoding ? cached_encoding : ""); - - if (!encoding && data_has_bom (data, len, &bom_enc)) - { - encoding = bom_enc; - result = try_convert_to_utf8_from_encoding (data, len, encoding); - used_enc.set(bom_enc); - } - else if (!encoding) - { - std::list encodings = get_encodings (); - - if (cached_encoding) - encodings.push_front(gstr::wrap(cached_encoding)); - - for (auto& enc: encodings) - { - result = try_convert_to_utf8_from_encoding (data, len, enc); - - if (!result.is_null ()) - { - used_enc = std::move(enc); - break; - } - } - } - else - { - result = try_convert_to_utf8_from_encoding (data, len, encoding); - used_enc.set(encoding); - } - - return result; -} - -static bool -encoding_is_utf8 (const char *encoding) -{ - return !g_ascii_strcasecmp (encoding, "UTF-8") || - !g_ascii_strcasecmp (encoding, "UTF8"); -} diff --git a/moo/mooedit/mooedit-fileops.h b/moo/mooedit/mooedit-fileops.h index 647449b2..00461e1e 100644 --- a/moo/mooedit/mooedit-fileops.h +++ b/moo/mooedit/mooedit-fileops.h @@ -1,7 +1,7 @@ /* * mooedit-fileops.h * - * Copyright (C) 2004-2016 by Yevgen Muntyan + * Copyright (C) 2004-2010 by Yevgen Muntyan * * This file is part of medit. medit is free software; you can * redistribute it and/or modify it under the terms of the @@ -13,21 +13,16 @@ * License along with medit. If not, see . */ -#pragma once - -#ifndef __cplusplus -#error "This is a C++ header" -#endif +#ifndef MOO_EDIT_FILE_OPS_H +#define MOO_EDIT_FILE_OPS_H #include "mooedit/mooedit.h" #include -#include "moocpp/utils.h" -#include "moogpp/strutils.h" -#include "mooutils/mooutils-misc.h" G_BEGIN_DECLS + + const char *_moo_get_default_encodings (void); -G_END_DECLS typedef enum { MOO_EDIT_SAVE_FLAGS_NONE = 0, @@ -43,28 +38,40 @@ enum { MOO_EDIT_FILE_ERROR_NOENT, MOO_EDIT_FILE_ERROR_CANCELLED }; -MOO_DEFINE_FLAGS(MooEditSaveFlags) GQuark _moo_edit_file_error_quark (void) G_GNUC_CONST; -bool _moo_is_file_error_cancelled (const g::gerrp& error); +gboolean _moo_is_file_error_cancelled (GError *error); -bool _moo_edit_file_is_new (g::File& file); -bool _moo_edit_load_file (Edit edit, - g::File& file, - const g::gstr& init_encoding, - const g::gstr& init_cached_encoding, - g::gerrp& error); -bool _moo_edit_reload_file (Edit edit, - const char* encoding, - g::gerrp& error); -bool _moo_edit_save_file (Edit edit, - g::File& floc, - const char* encoding, - MooEditSaveFlags flags, - g::gerrp& error); -bool _moo_edit_save_file_copy (Edit edit, - g::File& file, - const char* encoding, - MooEditSaveFlags flags, - g::gerrp& error); +gboolean _moo_edit_file_is_new (GFile *file); +gboolean _moo_edit_load_file (MooEdit *edit, + GFile *file, + const char *encoding, + const char *cached_encoding, + GError **error); +gboolean _moo_edit_reload_file (MooEdit *edit, + const char *encoding, + GError **error); +gboolean _moo_edit_save_file (MooEdit *edit, + GFile *floc, + const char *encoding, + MooEditSaveFlags flags, + GError **error); +gboolean _moo_edit_save_file_copy (MooEdit *edit, + GFile *file, + const char *encoding, + MooEditSaveFlags flags, + GError **error); + + +G_END_DECLS + +#ifdef __cplusplus + +#include "mooutils/mooutils-cpp.h" + +MOO_DEFINE_FLAGS(MooEditSaveFlags) + +#endif // __cplusplus + +#endif /* MOO_EDIT_FILE_OPS_H */ diff --git a/moo/mooedit/mooedit-impl.h b/moo/mooedit/mooedit-impl.h index 7d0b9f15..d52d10c9 100644 --- a/moo/mooedit/mooedit-impl.h +++ b/moo/mooedit/mooedit-impl.h @@ -1,7 +1,7 @@ /* * mooedit-impl.h * - * Copyright (C) 2004-2016 by Yevgen Muntyan + * Copyright (C) 2004-2010 by Yevgen Muntyan * * This file is part of medit. medit is free software; you can * redistribute it and/or modify it under the terms of the @@ -13,77 +13,68 @@ * License along with medit. If not, see . */ -#pragma once +#ifndef MOO_EDIT_IMPL_H +#define MOO_EDIT_IMPL_H #include "mooedit/moolinemark.h" #include "mooedit/mooeditor.h" #include "mooedit/mootextview.h" -#include "mooedit/mooedittypes.h" #include "mooutils/moohistorymgr.h" - -#ifdef __cplusplus -#include -#include - -template<> -class moo::gobj_ref : public virtual moo::gobj_ref_parent -{ -public: - MOO_DEFINE_GOBJREF_METHODS(MooEdit) - - static std::vector> _moo_edit_instances; - - void _add_view (EditView view); - void _remove_view (EditView view); - void _set_active_view (EditView view); - - bool _is_busy () const; - - void _add_class_actions (); - static void _class_init_actions (MooEditClass* klass); - - void _status_changed (); - - void _delete_bookmarks (bool in_destroy); - static void _line_mark_moved (MooEdit* doc, - MooLineMark* mark); - static void _line_mark_deleted (MooEdit* doc, - MooLineMark* mark); - void _update_bookmarks_style (); - - void _queue_recheck_config (); - - void _closed (); - - void _set_file (g::FileRawPtr file, - const char* encoding); - void _remove_untitled (Edit doc); - - void _ensure_newline (); - - void _stop_file_watch (); - - void _set_status (MooEditStatus status); - - void _strip_whitespace (); - - MooActionCollection& _get_actions (); - - static g::gstr _get_normalized_name (g::File file); - const g::gstr& _get_normalized_name () const; - - MooEditPrivate& get_priv () { return *gobj()->priv; } - const MooEditPrivate& get_priv () const { return *gobj()->priv; } - MooEditConfig* get_config () const { return gobj()->config; } - void set_config (MooEditConfig* cfg) { gobj()->config = cfg; } -}; - -#endif // __cplusplus +#include G_BEGIN_DECLS -#define MOO_EDIT_GOTO_BOOKMARK_ACTION "GoToBookmark" +#define MOO_EDIT_IS_BUSY(doc) (_moo_edit_is_busy (doc)) +extern MooEditList *_moo_edit_instances; + +void _moo_edit_add_view (MooEdit *doc, + MooEditView *view); +void _moo_edit_remove_view (MooEdit *doc, + MooEditView *view); +void _moo_edit_set_active_view (MooEdit *doc, + MooEditView *view); + +gboolean _moo_edit_is_busy (MooEdit *doc); +MooEditState _moo_edit_get_state (MooEdit *doc); +void _moo_edit_set_progress_text (MooEdit *doc, + const char *text); +void _moo_edit_set_state (MooEdit *doc, + MooEditState state, + const char *text, + GDestroyNotify cancel, + gpointer data); + +char *_moo_file_get_normalized_name (GFile *file); +char *_moo_edit_get_normalized_name (MooEdit *edit); + +char *_moo_edit_get_utf8_filename (MooEdit *edit); + +void _moo_edit_add_class_actions (MooEdit *edit); +void _moo_edit_check_actions (MooEdit *edit, + MooEditView *view); +void _moo_edit_class_init_actions (MooEditClass *klass); + +void _moo_edit_status_changed (MooEdit *edit); + +gboolean _moo_edit_has_comments (MooEdit *edit, + gboolean *single_line, + gboolean *multi_line); + +#define MOO_EDIT_GOTO_BOOKMARK_ACTION "GoToBookmark" +void _moo_edit_delete_bookmarks (MooEdit *edit, + gboolean in_destroy); +void _moo_edit_line_mark_moved (MooEdit *edit, + MooLineMark *mark); +void _moo_edit_line_mark_deleted (MooEdit *edit, + MooLineMark *mark); +gboolean _moo_edit_line_mark_clicked (MooTextView *view, + int line); +void _moo_edit_update_bookmarks_style (MooEdit *edit); + +/***********************************************************************/ +/* Preferences + */ enum { MOO_EDIT_SETTING_LANG, MOO_EDIT_SETTING_INDENT, @@ -96,30 +87,42 @@ enum { MOO_EDIT_LAST_SETTING }; -void _moo_edit_init_config (void); -gboolean _moo_edit_has_comments (MooEdit *edit, - gboolean *single_line, - gboolean *multi_line); +extern guint *_moo_edit_settings; -void _moo_edit_queue_recheck_config_all (void); -void _moo_edit_update_global_config (void); +void _moo_edit_update_global_config (void); +void _moo_edit_init_config (void); -void _moo_edit_check_actions (MooEdit* edit, - MooEditView* view); +void _moo_edit_queue_recheck_config_all (void); +void _moo_edit_queue_recheck_config (MooEdit *edit); -MooEditState _moo_edit_get_state (MooEdit *doc); -void _moo_edit_set_progress_text (MooEdit *doc, - const char *text); -void _moo_edit_set_state (MooEdit *doc, - MooEditState state, - const char *text, - GDestroyNotify cancel, - gpointer data); +void _moo_edit_closed (MooEdit *edit); -GdkPixbuf* _moo_edit_get_icon (MooEdit *edit, - GtkWidget *widget, - GtkIconSize size); +/***********************************************************************/ +/* File operations + */ -const char* _moo_edit_get_default_encoding (void); +void _moo_edit_set_file (MooEdit *edit, + GFile *file, + const char *encoding); +const char *_moo_edit_get_default_encoding (void); +void _moo_edit_ensure_newline (MooEdit *edit); + +void _moo_edit_stop_file_watch (MooEdit *edit); + +void _moo_edit_set_status (MooEdit *edit, + MooEditStatus status); + +GdkPixbuf *_moo_edit_get_icon (MooEdit *edit, + GtkWidget *widget, + GtkIconSize size); + +MooActionCollection *_moo_edit_get_actions (MooEdit *edit); + +char *_moo_edit_normalize_filename_for_comparison (const char *filename); +char *_moo_edit_normalize_uri_for_comparison (const char *uri); + +void _moo_edit_strip_whitespace (MooEdit *edit); G_END_DECLS + +#endif /* MOO_EDIT_IMPL_H */ diff --git a/moo/mooedit/mooedit-private.h b/moo/mooedit/mooedit-private.h index 6bcbd80b..6e0de077 100644 --- a/moo/mooedit/mooedit-private.h +++ b/moo/mooedit/mooedit-private.h @@ -13,62 +13,67 @@ * License along with medit. If not, see . */ -#pragma once +#ifndef MOO_EDIT_PRIVATE_H +#define MOO_EDIT_PRIVATE_H #include "mooedit/mooedit-impl.h" #include "mooedit/mooeditprogress.h" -#include "mooedit/mooeditbookmark.h" -#include "mooedit/mooeditview-impl.h" -#include "moocpp/moocpp.h" + +G_BEGIN_DECLS + +#define MOO_EDIT_IS_UNTITLED(edit) (!(edit)->priv->file) struct MooEditPrivate { - MooEditPrivate(); - ~MooEditPrivate(); + MooEditor *editor; - MooEditor* editor; + GtkTextBuffer *buffer; + MooEditViewArray *views; + MooEditView *active_view; + gboolean dead_active_view; - moo::gobj_ptr buffer; - std::vector views; - EditViewRawPtr active_view; - bool dead_active_view; - - gulong changed_handler_id; - gulong modified_changed_handler_id; - guint apply_config_idle; - bool in_recheck_config; + gulong changed_handler_id; + gulong modified_changed_handler_id; + guint apply_config_idle; + gboolean in_recheck_config; /***********************************************************************/ /* Document */ - moo::gobj_ptr file; - g::gstr filename; - g::gstr norm_name; - g::gstr display_filename; - g::gstr display_basename; + GFile *file; + char *filename; + char *norm_name; + char *display_filename; + char *display_basename; - g::gstr encoding; - MooLineEndType line_end_type; - MooEditStatus status; + char *encoding; + MooLineEndType line_end_type; + MooEditStatus status; - guint file_monitor_id; - bool modified_on_disk; - bool deleted_from_disk; + guint file_monitor_id; + gboolean modified_on_disk; + gboolean deleted_from_disk; // file sync event source ID - guint sync_timeout_id; + guint sync_timeout_id; - MooEditState state; - moo::gobj_ptr progress; + MooEditState state; + MooEditProgress *progress; /***********************************************************************/ /* Bookmarks */ - GSList* bookmarks; /* sorted by line number */ - guint update_bookmarks_idle; - bool enable_bookmarks; + gboolean enable_bookmarks; + GSList *bookmarks; /* sorted by line number */ + guint update_bookmarks_idle; /***********************************************************************/ /* Actions */ - moo::gobj_ptr actions; + MooActionCollection *actions; }; + +void _moo_edit_remove_untitled (MooEdit *doc); + +G_END_DECLS + +#endif /* MOO_EDIT_PRIVATE_H */ diff --git a/moo/mooedit/mooedit.cpp b/moo/mooedit/mooedit.c similarity index 81% rename from moo/mooedit/mooedit.cpp rename to moo/mooedit/mooedit.c index b92f7411..924dacae 100644 --- a/moo/mooedit/mooedit.cpp +++ b/moo/mooedit/mooedit.c @@ -1,7 +1,7 @@ /* - * mooedit.cpp + * mooedit.c * - * Copyright (C) 2004-2015 by Yevgen Muntyan + * Copyright (C) 2004-2010 by Yevgen Muntyan * Copyright (C) 2014 by Ulrich Eckhardt * * This file is part of medit. medit is free software; you can @@ -55,18 +55,15 @@ #include "mooutils/mooatom.h" #include "mooutils/moocompat.h" #include "mooedit/mooeditprogress-gxml.h" -#include "moocpp/moocpp.h" #include #include -using namespace moo; - #define KEY_ENCODING "encoding" #define KEY_LINE "line" MOO_DEFINE_OBJECT_ARRAY (MooEdit, moo_edit) -std::vector Edit::_moo_edit_instances; +MooEditList *_moo_edit_instances = NULL; static guint moo_edit_apply_config_all_idle; static GObject *moo_edit_constructor (GType type, @@ -270,31 +267,26 @@ moo_edit_class_init (MooEditClass *klass) G_TYPE_NONE, 0); _moo_edit_init_config (); - Edit::_class_init_actions (klass); -} - - -MooEditPrivate::MooEditPrivate() - : line_end_type(MOO_LE_NONE) -{ - buffer.set_new(GTK_TEXT_BUFFER(g_object_new(MOO_TYPE_TEXT_BUFFER, NULL))); - actions = wrap_new (moo_action_collection_new ("MooEdit", "MooEdit")); -} - -MooEditPrivate::~MooEditPrivate() -{ + _moo_edit_class_init_actions (klass); } static void moo_edit_init (MooEdit *edit) { - init_cpp_private(edit, edit->priv, MOO_TYPE_EDIT); + edit->priv = G_TYPE_INSTANCE_GET_PRIVATE (edit, MOO_TYPE_EDIT, MooEditPrivate); + + edit->priv->views = moo_edit_view_array_new (); + edit->priv->buffer = g_object_new (MOO_TYPE_TEXT_BUFFER, NULL); edit->config = moo_edit_config_new (); g_signal_connect_swapped (edit->config, "notify", G_CALLBACK (config_changed), edit); + + edit->priv->actions = moo_action_collection_new ("MooEdit", "MooEdit"); + + edit->priv->line_end_type = MOO_LE_NONE; } @@ -303,35 +295,40 @@ moo_edit_constructor (GType type, guint n_construct_properties, GObjectConstructParam *construct_param) { - GObject *object = G_OBJECT_CLASS (moo_edit_parent_class)->constructor ( + GObject *object; + MooEdit *doc; + MooEditView *view; + + object = G_OBJECT_CLASS (moo_edit_parent_class)->constructor ( type, n_construct_properties, construct_param); - Edit doc = *MOO_EDIT (object); - MooEditPrivate& priv = doc.get_priv(); + doc = MOO_EDIT (object); - auto view = EditView::_create(doc); - g_assert(priv.views.size() == 1 && priv.views[0] == view); + view = _moo_edit_view_new (doc); + (void) view; g_assert (doc->priv->views->n_elms == 1 && doc->priv->views->elms[0] == view); - doc._add_class_actions(); - Edit::_moo_edit_instances.push_back(&doc); + _moo_edit_add_class_actions (doc); + _moo_edit_instances = moo_edit_list_prepend (_moo_edit_instances, doc); - priv.changed_handler_id = - priv.buffer->connect ("changed", + doc->priv->changed_handler_id = + g_signal_connect (doc->priv->buffer, + "changed", G_CALLBACK (changed_cb), - &doc); - priv.modified_changed_handler_id = - priv.buffer->connect ("modified-changed", + doc); + doc->priv->modified_changed_handler_id = + g_signal_connect (doc->priv->buffer, + "modified-changed", G_CALLBACK (modified_changed_cb), - &doc); + doc); - doc._set_file(nullptr, nullptr); + _moo_edit_set_file (doc, NULL, NULL); - priv.buffer->connect_swapped ("line-mark-moved", - G_CALLBACK (Edit::_line_mark_moved), - &doc); - priv.buffer->connect_swapped ("line-mark-deleted", - G_CALLBACK (Edit::_line_mark_deleted), - &doc); + g_signal_connect_swapped (doc->priv->buffer, "line-mark-moved", + G_CALLBACK (_moo_edit_line_mark_moved), + doc); + g_signal_connect_swapped (doc->priv->buffer, "line-mark-deleted", + G_CALLBACK (_moo_edit_line_mark_deleted), + doc); return object; } @@ -342,137 +339,162 @@ moo_edit_finalize (GObject *object) { MooEdit *edit = MOO_EDIT (object); - finalize_cpp_private(edit, edit->priv); + moo_edit_view_array_free (edit->priv->views); + g_object_unref (edit->priv->buffer); + moo_file_free (edit->priv->file); + g_free (edit->priv->filename); + g_free (edit->priv->norm_name); + g_free (edit->priv->display_filename); + g_free (edit->priv->display_basename); + g_free (edit->priv->encoding); G_OBJECT_CLASS (moo_edit_parent_class)->finalize (object); } -void Edit::_closed() +void +_moo_edit_closed (MooEdit *doc) { - // this can be called several times - if (!contains(_moo_edit_instances, gobj())) - return; + g_return_if_fail (MOO_IS_EDIT (doc)); - MooEditPrivate& priv = get_priv(); - moo_assert(priv.state == MOO_EDIT_STATE_NORMAL); + moo_assert (doc->priv->state == MOO_EDIT_STATE_NORMAL); - _remove_untitled(*this); - remove(_moo_edit_instances, gobj()); + _moo_edit_remove_untitled (doc); + _moo_edit_instances = moo_edit_list_remove (_moo_edit_instances, doc); - while (!priv.views.empty()) - gtk_widget_destroy (priv.views[0].gobj()); + while (!moo_edit_view_array_is_empty (doc->priv->views)) + gtk_widget_destroy (GTK_WIDGET (doc->priv->views->elms[0])); - if (get_config()) + if (doc->config) { - g_signal_handlers_disconnect_by_func (get_config(), + g_signal_handlers_disconnect_by_func (doc->config, (gpointer) config_changed, - gobj()); - g_object_unref(get_config()); - set_config(nullptr); + doc); + g_object_unref (doc->config); + doc->config = NULL; } - if (priv.apply_config_idle) + if (doc->priv->apply_config_idle) { - g_source_remove (priv.apply_config_idle); - priv.apply_config_idle = 0; + g_source_remove (doc->priv->apply_config_idle); + doc->priv->apply_config_idle = 0; } - if (priv.file_monitor_id) + if (doc->priv->file_monitor_id) { - _stop_file_watch(); - priv.file_monitor_id = 0; + _moo_edit_stop_file_watch (doc); + doc->priv->file_monitor_id = 0; } - if (priv.sync_timeout_id) + if (doc->priv->sync_timeout_id) { - g_source_remove (priv.sync_timeout_id); - priv.sync_timeout_id = 0; + g_source_remove (doc->priv->sync_timeout_id); + doc->priv->sync_timeout_id = 0; } - if (priv.update_bookmarks_idle) + if (doc->priv->update_bookmarks_idle) { - g_source_remove (priv.update_bookmarks_idle); - priv.update_bookmarks_idle = 0; + g_source_remove (doc->priv->update_bookmarks_idle); + doc->priv->update_bookmarks_idle = 0; } - _delete_bookmarks(true); + _moo_edit_delete_bookmarks (doc, TRUE); - priv.actions.reset(); + if (doc->priv->actions) + { + g_object_unref (doc->priv->actions); + doc->priv->actions = NULL; + } } static void moo_edit_dispose (GObject *object) { - Edit(*MOO_EDIT(object))._closed(); - G_OBJECT_CLASS(moo_edit_parent_class)->dispose(object); + _moo_edit_closed (MOO_EDIT (object)); + G_OBJECT_CLASS (moo_edit_parent_class)->dispose (object); } -void Edit::_set_active_view(EditView view) +void +_moo_edit_set_active_view (MooEdit *doc, + MooEditView *view) { - MooEditPrivate& priv = get_priv(); + GtkTextBuffer *buffer; - g_return_if_fail(contains(priv.views, &view)); + g_return_if_fail (MOO_IS_EDIT (doc)); + g_return_if_fail (MOO_IS_EDIT_VIEW (view)); - GtkTextBuffer* buffer = moo_edit_get_buffer(gobj()); + g_return_if_fail (moo_edit_view_array_find (doc->priv->views, view) >= 0); - if (priv.active_view != nullptr && priv.active_view != &view) + buffer = moo_edit_get_buffer (doc); + + if (doc->priv->active_view != NULL && doc->priv->active_view != view) { GtkTextIter iter; - GtkTextMark *mark = priv.active_view->_get_fake_cursor_mark(); - gtk_text_buffer_get_iter_at_mark(buffer, &iter, gtk_text_buffer_get_insert(buffer)); - gtk_text_buffer_move_mark(buffer, mark, &iter); + GtkTextMark *mark = _moo_edit_view_get_fake_cursor_mark (doc->priv->active_view); + gtk_text_buffer_get_iter_at_mark (buffer, &iter, gtk_text_buffer_get_insert (buffer)); + gtk_text_buffer_move_mark (buffer, mark, &iter); } - if (priv.dead_active_view || - (priv.active_view != nullptr && priv.active_view != &view)) + if (doc->priv->dead_active_view || + (doc->priv->active_view != NULL && doc->priv->active_view != view)) { GtkTextIter iter; - GtkTextMark *mark = view._get_fake_cursor_mark(); - gtk_text_buffer_get_iter_at_mark(buffer, &iter, mark); - gtk_text_buffer_place_cursor(buffer, &iter); + GtkTextBuffer *buffer = moo_edit_get_buffer (doc); + GtkTextMark *mark = _moo_edit_view_get_fake_cursor_mark (view); + gtk_text_buffer_get_iter_at_mark (buffer, &iter, mark); + gtk_text_buffer_place_cursor (buffer, &iter); } - priv.active_view = &view; - priv.dead_active_view = false; + doc->priv->active_view = view; + doc->priv->dead_active_view = FALSE; } -void Edit::_add_view(EditView view) +void +_moo_edit_add_view (MooEdit *doc, + MooEditView *view) { - auto& priv = get_priv(); + g_return_if_fail (MOO_IS_EDIT (doc)); + g_return_if_fail (MOO_IS_EDIT_VIEW (view)); - g_return_if_fail(!contains(priv.views, &view)); + g_assert (moo_edit_view_array_find (doc->priv->views, view) < 0); - priv.views.emplace_back(wrap(&view)); + g_object_ref_sink (view); + moo_edit_view_array_append (doc->priv->views, view); + g_object_unref (view); - _moo_edit_view_apply_prefs(view.gobj()); - view._apply_config(); + _moo_edit_view_apply_prefs (view); + _moo_edit_view_apply_config (view); } -void Edit::_remove_view(EditView view) +void +_moo_edit_remove_view (MooEdit *doc, + MooEditView *view) { - auto& priv = get_priv(); + g_return_if_fail (MOO_IS_EDIT (doc)); + g_return_if_fail (MOO_IS_EDIT_VIEW (view)); - g_return_if_fail(contains(priv.views, &view)); + g_return_if_fail (moo_edit_view_array_find (doc->priv->views, view) >= 0); - if (priv.active_view == &view) + if (view == doc->priv->active_view) { - priv.active_view = NULL; - priv.dead_active_view = TRUE; + doc->priv->active_view = NULL; + doc->priv->dead_active_view = TRUE; } - g_object_ref (&view); + g_object_ref (view); - remove(priv.views, &view); - view._unset_doc(); + moo_edit_view_array_remove (doc->priv->views, view); + _moo_edit_view_unset_doc (view); - g_object_unref(&view); + g_object_unref (view); } -MooActionCollection& Edit::_get_actions() +MooActionCollection * +_moo_edit_get_actions (MooEdit *doc) { - return *get_priv().actions; + g_return_val_if_fail (MOO_IS_EDIT (doc), NULL); + return doc->priv->actions; } @@ -519,7 +541,7 @@ changed_cb (G_GNUC_UNUSED GtkTextBuffer *buffer, g_source_remove(edit->priv->sync_timeout_id); // start timer - edit->priv->sync_timeout_id = g_timeout_add (500, autosync_callback, edit); + edit->priv->sync_timeout_id = gdk_threads_add_timeout (500, autosync_callback, edit); } static void @@ -573,7 +595,7 @@ moo_edit_set_modified (MooEdit *edit, modify_status (edit, MOO_EDIT_STATUS_MODIFIED, modified); - Edit(*edit)._status_changed (); + _moo_edit_status_changed (edit); } @@ -586,7 +608,7 @@ moo_edit_set_clean (MooEdit *edit, { g_return_if_fail (MOO_IS_EDIT (edit)); modify_status (edit, MOO_EDIT_STATUS_CLEAN, clean); - Edit(*edit)._status_changed(); + _moo_edit_status_changed (edit); } /** @@ -600,18 +622,24 @@ moo_edit_get_clean (MooEdit *edit) } -void Edit::_status_changed() +void +_moo_edit_status_changed (MooEdit *edit) { - signal_emit(signals[DOC_STATUS_CHANGED], 0, NULL); + g_return_if_fail (MOO_IS_EDIT (edit)); + g_signal_emit (edit, signals[DOC_STATUS_CHANGED], 0, NULL); } -void Edit::_set_status(MooEditStatus status) +void +_moo_edit_set_status (MooEdit *edit, + MooEditStatus status) { - if (get_priv().status != status) + g_return_if_fail (MOO_IS_EDIT (edit)); + + if (edit->priv->status != status) { - get_priv().status = status; - _status_changed(); + edit->priv->status = status; + _moo_edit_status_changed (edit); } } @@ -629,9 +657,7 @@ moo_edit_is_empty (MooEdit *edit) g_return_val_if_fail (MOO_IS_EDIT (edit), FALSE); - Edit r = *edit; - - if (r._is_busy () || moo_edit_is_modified (edit) || !moo_edit_is_untitled (edit)) + if (MOO_EDIT_IS_BUSY (edit) || moo_edit_is_modified (edit) || !MOO_EDIT_IS_UNTITLED (edit)) return FALSE; gtk_text_buffer_get_bounds (moo_edit_get_buffer (edit), &start, &end); @@ -646,7 +672,7 @@ gboolean moo_edit_is_untitled (MooEdit *edit) { g_return_val_if_fail (MOO_IS_EDIT (edit), FALSE); - return !edit->priv->file; + return MOO_EDIT_IS_UNTITLED (edit); } /** @@ -656,7 +682,7 @@ gboolean moo_edit_is_modified (MooEdit *edit) { g_return_val_if_fail (MOO_IS_EDIT (edit), FALSE); - return (moo_edit_get_status (edit) & MOO_EDIT_STATUS_MODIFIED) != MOO_EDIT_STATUS_NORMAL; + return (moo_edit_get_status (edit) & MOO_EDIT_STATUS_MODIFIED) != 0; } /** @@ -685,7 +711,7 @@ moo_edit_set_property (GObject *object, break; case PROP_ENABLE_BOOKMARKS: - MooEditBookmark::set_enable_bookmarks(*edit, g_value_get_boolean (value)); + moo_edit_set_enable_bookmarks (edit, g_value_get_boolean (value)); break; case PROP_ENCODING: @@ -753,7 +779,7 @@ GFile * moo_edit_get_file (MooEdit *edit) { g_return_val_if_fail (MOO_IS_EDIT (edit), NULL); - return edit->priv->file ? edit->priv->file->dup().release() : NULL; + return edit->priv->file ? g_file_dup (edit->priv->file) : NULL; } /** @@ -765,12 +791,21 @@ char * moo_edit_get_filename (MooEdit *edit) { g_return_val_if_fail (MOO_IS_EDIT (edit), NULL); - return edit->priv->filename.strdup(); + return g_strdup (edit->priv->filename); } -const gstr& Edit::_get_normalized_name() const +char * +_moo_edit_get_normalized_name (MooEdit *edit) { - return get_priv().norm_name; + g_return_val_if_fail (MOO_IS_EDIT (edit), NULL); + return g_strdup (edit->priv->norm_name); +} + +char * +_moo_edit_get_utf8_filename (MooEdit *edit) +{ + g_return_val_if_fail (MOO_IS_EDIT (edit), NULL); + return edit->priv->filename ? g_strdup (edit->priv->display_filename) : NULL; } /** @@ -806,7 +841,7 @@ char * moo_edit_get_uri (MooEdit *edit) { g_return_val_if_fail (MOO_IS_EDIT (edit), NULL); - return edit->priv->file ? edit->priv->file->get_uri().release_owned() : NULL; + return edit->priv->file ? g_file_get_uri (edit->priv->file) : NULL; } /** @@ -834,9 +869,9 @@ moo_edit_set_encoding (MooEdit *edit, g_return_if_fail (MOO_IS_EDIT (edit)); g_return_if_fail (encoding != NULL); - if (edit->priv->encoding != encoding) + if (!moo_str_equal (encoding, edit->priv->encoding)) { - edit->priv->encoding.set(encoding); + MOO_ASSIGN_STRING (edit->priv->encoding, encoding); g_object_notify (G_OBJECT (edit), "encoding"); } } @@ -873,8 +908,8 @@ moo_edit_get_view (MooEdit *doc) g_return_val_if_fail (MOO_IS_EDIT (doc), NULL); if (!doc->priv->active_view) - if (!doc->priv->views.empty()) - doc->priv->active_view = doc->priv->views.back().gobj(); + if (!moo_edit_view_array_is_empty (doc->priv->views)) + doc->priv->active_view = doc->priv->views->elms[doc->priv->views->n_elms - 1]; return doc->priv->active_view; } @@ -888,13 +923,7 @@ MooEditViewArray * moo_edit_get_views (MooEdit *doc) { g_return_val_if_fail (MOO_IS_EDIT (doc), NULL); - - MooEditViewArray *ret = moo_edit_view_array_new (); - moo_edit_view_array_reserve (ret, doc->priv->views.size ()); - for (const auto& view: doc->priv->views) - moo_edit_view_array_append (ret, view.gobj()); - - return ret; + return moo_edit_view_array_copy (doc->priv->views); } /** @@ -906,7 +935,7 @@ int moo_edit_get_n_views (MooEdit *doc) { g_return_val_if_fail (MOO_IS_EDIT (doc), 0); - return (int) doc->priv->views.size(); + return (int) moo_edit_view_array_get_size (doc->priv->views); } /** @@ -926,7 +955,7 @@ GtkTextBuffer * moo_edit_get_buffer (MooEdit *doc) { g_return_val_if_fail (MOO_IS_EDIT (doc), NULL); - return doc->priv->buffer.gobj(); + return doc->priv->buffer; } @@ -1178,7 +1207,7 @@ moo_edit_get_lang (MooEdit *doc) { g_return_val_if_fail (MOO_IS_EDIT (doc), NULL); moo_assert (!doc->priv->in_recheck_config); - return moo_text_buffer_get_lang (MOO_TEXT_BUFFER (doc->priv->buffer.gobj())); + return moo_text_buffer_get_lang (MOO_TEXT_BUFFER (doc->priv->buffer)); } /** @@ -1210,10 +1239,12 @@ moo_edit_get_lang_id (MooEdit *doc) static gboolean moo_edit_apply_config_all_in_idle (void) { + MooEditList *l; + moo_edit_apply_config_all_idle = 0; - for (const auto& doc: Edit::_moo_edit_instances) - moo_edit_recheck_config (doc); + for (l = _moo_edit_instances; l != NULL; l = l->next) + moo_edit_recheck_config (l->data); return FALSE; } @@ -1223,7 +1254,7 @@ _moo_edit_queue_recheck_config_all (void) { if (!moo_edit_apply_config_all_idle) moo_edit_apply_config_all_idle = - g_idle_add ((GSourceFunc) moo_edit_apply_config_all_in_idle, NULL); + gdk_threads_add_idle ((GSourceFunc) moo_edit_apply_config_all_in_idle, NULL); } @@ -1235,7 +1266,7 @@ update_lang_config_from_lang_globs (MooEdit *doc) if (doc->priv->file) { MooLangMgr *mgr = moo_lang_mgr_default (); - MooLang *lang = moo_lang_mgr_get_lang_for_file (mgr, *doc->priv->file); + MooLang *lang = moo_lang_mgr_get_lang_for_file (mgr, doc->priv->file); lang_id = lang ? _moo_lang_id (lang) : NULL; } @@ -1268,17 +1299,18 @@ update_config_from_lang (MooEdit *doc) static void moo_edit_apply_config (MooEdit *doc) { + guint i; const char *lang_id = moo_edit_config_get_string (doc->config, "lang"); MooLangMgr *mgr = moo_lang_mgr_default (); MooLang *lang = lang_id ? _moo_lang_mgr_find_lang (mgr, lang_id) : NULL; - moo_text_buffer_set_lang (MOO_TEXT_BUFFER (doc->priv->buffer.gobj()), lang); + moo_text_buffer_set_lang (MOO_TEXT_BUFFER (doc->priv->buffer), lang); g_object_notify (G_OBJECT (doc), "has-comments"); g_object_notify (G_OBJECT (doc), "lang"); - for (const auto& view: doc->priv->views) - view->_apply_config(); + for (i = 0; i < doc->priv->views->n_elms; ++i) + _moo_edit_view_apply_config (doc->priv->views->elms[i]); } static void @@ -1328,34 +1360,36 @@ moo_edit_recheck_config_in_idle (MooEdit *edit) return FALSE; } -void Edit::_queue_recheck_config() +void +_moo_edit_queue_recheck_config (MooEdit *doc) { - auto& priv = get_priv(); - g_return_if_fail(!priv.in_recheck_config); - if (!priv.apply_config_idle) - priv.apply_config_idle = - g_idle_add_full (G_PRIORITY_HIGH, - (GSourceFunc) moo_edit_recheck_config_in_idle, - gobj(), NULL); + g_return_if_fail (!doc->priv->in_recheck_config); + if (!doc->priv->apply_config_idle) + doc->priv->apply_config_idle = + gdk_threads_add_idle_full (G_PRIORITY_HIGH, + (GSourceFunc) moo_edit_recheck_config_in_idle, + doc, NULL); } static void config_changed (MooEdit *doc) { if (!doc->priv->in_recheck_config) - Edit(*doc)._queue_recheck_config(); + _moo_edit_queue_recheck_config (doc); } static void moo_edit_apply_prefs (MooEdit *edit) { + guint i; + g_return_if_fail (MOO_IS_EDIT (edit)); moo_edit_freeze_notify (edit); - for (const auto& view: edit->priv->views) - _moo_edit_view_apply_prefs (view.gobj()); + for (i = 0; i < edit->priv->views->n_elms; ++i) + _moo_edit_view_apply_prefs (edit->priv->views->elms[i]); moo_edit_thaw_notify (edit); } @@ -1363,21 +1397,25 @@ moo_edit_apply_prefs (MooEdit *edit) static void moo_edit_freeze_notify (MooEdit *doc) { + guint i; + g_return_if_fail (MOO_IS_EDIT (doc)); g_object_freeze_notify (G_OBJECT (doc)); - for (const auto& view: doc->priv->views) - view->freeze_notify(); + for (i = 0; i < doc->priv->views->n_elms; ++i) + g_object_freeze_notify (G_OBJECT (doc->priv->views->elms[i])); } static void moo_edit_thaw_notify (MooEdit *doc) { + guint i; + g_return_if_fail (MOO_IS_EDIT (doc)); - for (const auto& view: doc->priv->views) - view->thaw_notify(); + for (i = 0; i < doc->priv->views->n_elms; ++i) + g_object_thaw_notify (G_OBJECT (doc->priv->views->elms[i])); g_object_thaw_notify (G_OBJECT (doc)); } @@ -1465,9 +1503,11 @@ moo_edit_save_copy (MooEdit *doc, } -bool Edit::_is_busy() const +gboolean +_moo_edit_is_busy (MooEdit *doc) { - return _moo_edit_get_state(nc_gobj()) != MOO_EDIT_STATE_NORMAL; + g_return_val_if_fail (MOO_IS_EDIT (doc), FALSE); + return _moo_edit_get_state (doc) != MOO_EDIT_STATE_NORMAL; } MooEditState @@ -1483,8 +1523,8 @@ _moo_edit_set_progress_text (MooEdit *doc, { g_return_if_fail (MOO_IS_EDIT (doc)); g_return_if_fail (doc->priv->state != MOO_EDIT_STATE_NORMAL); - g_return_if_fail (doc->priv->progress != nullptr); - _moo_edit_progress_set_text (*doc->priv->progress, text); + g_return_if_fail (doc->priv->progress != NULL); + _moo_edit_progress_set_text (doc->priv->progress, text); } void @@ -1494,6 +1534,7 @@ _moo_edit_set_state (MooEdit *doc, GDestroyNotify cancel, gpointer data) { + guint i; MooEditTab *tab; g_return_if_fail (MOO_IS_EDIT (doc)); @@ -1501,15 +1542,15 @@ _moo_edit_set_state (MooEdit *doc, doc->priv->state == MOO_EDIT_STATE_NORMAL); if (doc->priv->progress) - _moo_edit_progress_set_cancel_func (*doc->priv->progress, cancel, data); + _moo_edit_progress_set_cancel_func (doc->priv->progress, cancel, data); if (state == doc->priv->state) return; doc->priv->state = state; - for (const auto& view: doc->priv->views) - gtk_text_view_set_editable (view.gobj(), !state); + for (i = 0; i < moo_edit_view_array_get_size (doc->priv->views); ++i) + gtk_text_view_set_editable (GTK_TEXT_VIEW (doc->priv->views->elms[i]), !state); tab = moo_edit_get_tab (doc); @@ -1519,12 +1560,14 @@ _moo_edit_set_state (MooEdit *doc, if (!state) { _moo_edit_tab_destroy_progress (tab); - doc->priv->progress = nullptr; + g_object_unref (doc->priv->progress); + doc->priv->progress = NULL; } else { - doc->priv->progress = wrap_new (_moo_edit_tab_create_progress (tab)); - _moo_edit_progress_start (*doc->priv->progress, text, cancel, data); + doc->priv->progress = _moo_edit_tab_create_progress (tab); + _moo_edit_progress_start (doc->priv->progress, text, cancel, data); + g_object_ref (doc->priv->progress); } } @@ -1835,24 +1878,30 @@ moo_edit_uncomment_selection (MooEdit *edit) } -void Edit::_ensure_newline() +void +_moo_edit_ensure_newline (MooEdit *edit) { GtkTextBuffer *buffer; GtkTextIter iter; - buffer = moo_edit_get_buffer (gobj()); + g_return_if_fail (MOO_IS_EDIT (edit)); + + buffer = moo_edit_get_buffer (edit); gtk_text_buffer_get_end_iter (buffer, &iter); if (!gtk_text_iter_starts_line (&iter)) gtk_text_buffer_insert (buffer, &iter, "\n", -1); } -void Edit::_strip_whitespace() +void +_moo_edit_strip_whitespace (MooEdit *doc) { GtkTextBuffer *buffer; GtkTextIter iter; - buffer = moo_edit_get_buffer (gobj()); + g_return_if_fail (MOO_IS_EDIT (doc)); + + buffer = moo_edit_get_buffer (doc); gtk_text_buffer_begin_user_action (buffer); for (gtk_text_buffer_get_start_iter (buffer, &iter); @@ -1860,6 +1909,7 @@ void Edit::_strip_whitespace() gtk_text_iter_forward_line (&iter)) { GtkTextIter end; + char *slice, *p; gssize len; if (gtk_text_iter_ends_line (&iter)) @@ -1868,18 +1918,19 @@ void Edit::_strip_whitespace() end = iter; gtk_text_iter_forward_to_line_end (&end); - gstr slice = gstr::wrap_new (gtk_text_buffer_get_slice (buffer, &iter, &end, TRUE)); + slice = gtk_text_buffer_get_slice (buffer, &iter, &end, TRUE); len = strlen (slice); g_assert (len > 0); - const char *p; - for (p = slice.get() + len; p > slice && (p[-1] == ' ' || p[-1] == '\t'); --p) ; + for (p = slice + len; p > slice && (p[-1] == ' ' || p[-1] == '\t'); --p) ; if (*p) { gtk_text_iter_forward_chars (&iter, g_utf8_pointer_to_offset (slice, p)); gtk_text_buffer_delete (buffer, &iter, &end); } + + g_free (slice); } gtk_text_buffer_end_user_action (buffer); diff --git a/moo/mooedit/mooedit.cmake b/moo/mooedit/mooedit.cmake index aa3fc4ae..10c2d86f 100644 --- a/moo/mooedit/mooedit.cmake +++ b/moo/mooedit/mooedit.cmake @@ -24,48 +24,48 @@ SET(mooedit_sources mooedit/mootextiter.h mooedit/mootextsearch.h mooedit/mootextstylescheme.h - mooedit/mooeditview.cpp + mooedit/mooeditview.c mooedit/mooeditview-priv.h mooedit/mooeditview-impl.h mooedit/mooeditview-script.c mooedit/mooeditview-script.h mooedit/mooedit-accels.h mooedit/mooeditaction.c - mooedit/mooeditaction-factory.cpp + mooedit/mooeditaction-factory.c mooedit/mooeditaction-factory.h - mooedit/mooeditbookmark.cpp - mooedit/mooedit.cpp + mooedit/mooeditbookmark.c + mooedit/mooedit.c mooedit/mooeditconfig.c - mooedit/mooeditdialogs.cpp + mooedit/mooeditdialogs.c mooedit/mooedit-enum-types.c mooedit/mooedit-enum-types.h mooedit/mooedit-enums.h - mooedit/mooedit-fileops.cpp + mooedit/mooedit-fileops.c mooedit/mooedit-fileops.h mooedit/mooeditfiltersettings.c mooedit/mooedithistoryitem.c mooedit/mooedit-impl.h mooedit/mooedit-script.c mooedit/mooedit-script.h - mooedit/mooeditprefs.cpp + mooedit/mooeditprefs.c mooedit/mooeditprefspage.c mooedit/mooedit-private.h mooedit/mooeditprogress.h - mooedit/mooeditprogress.cpp - mooedit/mooedittab.cpp + mooedit/mooeditprogress.c + mooedit/mooedittab.c mooedit/mooedittab.h mooedit/mooedittab-impl.h mooedit/mooeditwindow.c mooedit/mooeditwindow-impl.h mooedit/mooeditfileinfo-impl.h - mooedit/mooeditfileinfo.cpp + mooedit/mooeditfileinfo.c mooedit/moofold.c mooedit/moofold.h mooedit/mooindenter.c mooedit/mooindenter.h mooedit/moolang.c mooedit/moolang.h - mooedit/moolangmgr.cpp + mooedit/moolangmgr.c mooedit/moolangmgr.h mooedit/moolangmgr-private.h mooedit/moolang-private.h diff --git a/moo/mooedit/mooedit.h b/moo/mooedit/mooedit.h index 08221169..d315b4d4 100644 --- a/moo/mooedit/mooedit.h +++ b/moo/mooedit/mooedit.h @@ -13,7 +13,8 @@ * License along with medit. If not, see . */ -#pragma once +#ifndef MOO_EDIT_H +#define MOO_EDIT_H #include #include @@ -121,4 +122,7 @@ gboolean moo_edit_close (MooEdit *edi void moo_edit_comment_selection (MooEdit *edit); void moo_edit_uncomment_selection (MooEdit *edit); + G_END_DECLS + +#endif /* MOO_EDIT_H */ diff --git a/moo/mooedit/mooeditaction-factory.cpp b/moo/mooedit/mooeditaction-factory.c similarity index 95% rename from moo/mooedit/mooeditaction-factory.cpp rename to moo/mooedit/mooeditaction-factory.c index dd364227..9d55d350 100644 --- a/moo/mooedit/mooeditaction-factory.cpp +++ b/moo/mooedit/mooeditaction-factory.c @@ -1,7 +1,7 @@ /* - * mooeditaction-factory.cpp + * mooeditaction-factory.c * - * Copyright (C) 2004-2016 by Yevgen Muntyan + * Copyright (C) 2004-2010 by Yevgen Muntyan * * This file is part of medit. medit is free software; you can * redistribute it and/or modify it under the terms of the @@ -206,6 +206,7 @@ moo_edit_class_install_action (MooEditClass *klass, GHashTable *actions; ActionInfo *info; GType type; + MooEditList *l; g_return_if_fail (MOO_IS_EDIT_CLASS (klass)); g_return_if_fail (MOO_IS_ACTION_FACTORY (factory)); @@ -227,15 +228,15 @@ moo_edit_class_install_action (MooEditClass *klass, info = action_info_new (factory, doc_conditions, view_conditions); g_hash_table_insert (actions, g_strdup (action_id), info); - for (const auto& doc: Edit::_moo_edit_instances) + for (l = _moo_edit_instances; l != NULL; l = l->next) { - if (g_type_is_a (G_OBJECT_TYPE (doc), type)) + if (g_type_is_a (G_OBJECT_TYPE (l->data), type)) { - GtkAction *action = create_action (action_id, info, doc); + GtkAction *action = create_action (action_id, info, l->data); if (action) { - moo_edit_add_action (doc, action); + moo_edit_add_action (l->data, action); g_object_unref (action); } } @@ -420,13 +421,13 @@ error: if (doc_conditions) { - g_ptr_array_foreach (doc_conditions, (GFunc) extern_g_free, NULL); + g_ptr_array_foreach (doc_conditions, (GFunc) g_free, NULL); g_ptr_array_free (doc_conditions, TRUE); } if (view_conditions) { - g_ptr_array_foreach (view_conditions, (GFunc) extern_g_free, NULL); + g_ptr_array_foreach (view_conditions, (GFunc) g_free, NULL); g_ptr_array_free (view_conditions, TRUE); } @@ -520,6 +521,7 @@ moo_edit_class_remove_action (MooEditClass *klass, { GHashTable *actions; GType type; + MooEditList *l; g_return_if_fail (MOO_IS_EDIT_CLASS (klass)); @@ -529,11 +531,9 @@ moo_edit_class_remove_action (MooEditClass *klass, if (actions) g_hash_table_remove (actions, action_id); - for (const auto& doc: Edit::_moo_edit_instances) - { - if (g_type_is_a(G_OBJECT_TYPE(doc), type)) - moo_edit_remove_action(doc, action_id); - } + for (l = _moo_edit_instances; l != NULL; l = l->next) + if (g_type_is_a (G_OBJECT_TYPE (l->data), type)) + moo_edit_remove_action (l->data, action_id); } @@ -541,7 +541,7 @@ GtkActionGroup * moo_edit_get_actions (MooEdit *edit) { g_return_val_if_fail (MOO_IS_EDIT (edit), NULL); - return moo_action_collection_get_group (edit->priv->actions.gobj(), NULL); + return moo_action_collection_get_group (edit->priv->actions, NULL); } @@ -573,18 +573,23 @@ add_action (const char *id, } } -void Edit::_add_class_actions() +void +_moo_edit_add_class_actions (MooEdit *edit) { - GType type = G_OBJECT_TYPE (gobj()); + GType type; - while (true) + g_return_if_fail (MOO_IS_EDIT (edit)); + + type = G_OBJECT_TYPE (edit); + + while (TRUE) { GHashTable *actions; actions = get_actions_hash (type); if (actions) - g_hash_table_foreach (actions, (GHFunc) add_action, gobj()); + g_hash_table_foreach (actions, (GHFunc) add_action, edit); if (type == MOO_TYPE_EDIT) break; @@ -601,7 +606,7 @@ create_input_methods_menu_item (GtkAction *action) GtkWidget *item, *menu; gboolean visible = TRUE; - view = MOO_EDIT_VIEW (g_object_get_data (G_OBJECT (action), "moo-edit-view")); + view = g_object_get_data (G_OBJECT (action), "moo-edit-view"); g_return_val_if_fail (MOO_IS_EDIT_VIEW (view), NULL); item = gtk_menu_item_new (); @@ -627,7 +632,7 @@ create_special_chars_menu_item (GtkAction *action) GtkWidget *item, *menu; gboolean visible = TRUE; - view = MOO_EDIT_VIEW (g_object_get_data (G_OBJECT (action), "moo-edit-view")); + view = g_object_get_data (G_OBJECT (action), "moo-edit-view"); g_return_val_if_fail (MOO_IS_EDIT_VIEW (view), NULL); item = gtk_menu_item_new (); @@ -644,7 +649,8 @@ create_special_chars_menu_item (GtkAction *action) return item; } -void Edit::_class_init_actions(MooEditClass *klass) +void +_moo_edit_class_init_actions (MooEditClass *klass) { moo_edit_class_new_action (klass, "Undo", "display-name", GTK_STOCK_UNDO, diff --git a/moo/mooedit/mooeditbookmark.cpp b/moo/mooedit/mooeditbookmark.c similarity index 89% rename from moo/mooedit/mooeditbookmark.cpp rename to moo/mooedit/mooeditbookmark.c index 1829eb36..6c586e24 100644 --- a/moo/mooedit/mooeditbookmark.cpp +++ b/moo/mooedit/mooeditbookmark.c @@ -13,6 +13,10 @@ * License along with medit. If not, see . */ +/** + * class:MooEditBookmark: (parent MooLineMark) (moo.private 1) + **/ + #include "mooedit/mooeditbookmark.h" #include "mooedit/mooedit-private.h" #include "mooedit/mootextbuffer.h" @@ -68,16 +72,22 @@ get_line_count (MooEdit *edit) } -void MooEditBookmark::set_enable_bookmarks(Edit edit, bool enable) +void +moo_edit_set_enable_bookmarks (MooEdit *edit, + gboolean enable) { - if (enable != edit.get_priv().enable_bookmarks) + g_return_if_fail (MOO_IS_EDIT (edit)); + + enable = enable != 0; + + if (enable != edit->priv->enable_bookmarks) { - edit.get_priv().enable_bookmarks = enable; + edit->priv->enable_bookmarks = enable; if (!enable) - edit._delete_bookmarks(false); + _moo_edit_delete_bookmarks (edit, FALSE); - edit.notify("enable-bookmarks"); + g_object_notify (G_OBJECT (edit), "enable-bookmarks"); } } @@ -115,7 +125,7 @@ update_bookmarks (MooEdit *edit) new_ = g_slist_prepend (new_, l->data); g_slist_foreach (deleted, (GFunc) disconnect_bookmark, NULL); - g_slist_foreach (deleted, (GFunc) extern_g_object_unref, NULL); + g_slist_foreach (deleted, (GFunc) g_object_unref, NULL); g_slist_free (deleted); new_ = g_slist_sort (new_, (GCompareFunc) cmp_bookmarks); @@ -253,18 +263,15 @@ moo_edit_add_bookmark (MooEdit *edit, guint line, guint no) { + guint i; MooEditBookmark *bk; g_return_if_fail (MOO_IS_EDIT (edit)); g_return_if_fail (line < get_line_count (edit)); g_return_if_fail (moo_edit_get_bookmark_at_line (edit, line) == NULL); - for (const auto& view: edit->priv->views) - { - view->set ("show-line-marks", TRUE); - view->set ("show-line-marks", true); - view->set ("show-line-marks", TRUE, "show-line-marks", TRUE); - } + for (i = 0; i < edit->priv->views->n_elms; ++i) + g_object_set (edit->priv->views->elms[i], "show-line-marks", TRUE, (char*) 0); bk = MOO_EDIT_BOOKMARK (g_object_new (MOO_TYPE_EDIT_BOOKMARK, "background", get_bookmark_color (edit), (char*) 0)); moo_text_buffer_add_line_mark (get_moo_buffer (edit), MOO_LINE_MARK (bk), line); @@ -304,20 +311,24 @@ disconnect_bookmark (MooEditBookmark *bk) } -void Edit::_line_mark_moved(MooEdit* edit, MooLineMark* mark) +void +_moo_edit_line_mark_moved (MooEdit *edit, + MooLineMark *mark) { if (MOO_IS_EDIT_BOOKMARK (mark) && g_object_get_data (G_OBJECT (mark), "moo-edit-bookmark") && !edit->priv->update_bookmarks_idle) { edit->priv->update_bookmarks_idle = - g_idle_add ((GSourceFunc) update_bookmarks, edit); + gdk_threads_add_idle ((GSourceFunc) update_bookmarks, edit); bookmarks_changed (edit); } } -void Edit::_line_mark_deleted(MooEdit* edit, MooLineMark* mark) +void +_moo_edit_line_mark_deleted (MooEdit *edit, + MooLineMark *mark) { if (MOO_IS_EDIT_BOOKMARK (mark) && g_object_get_data (G_OBJECT (mark), "moo-edit-bookmark") && @@ -365,12 +376,14 @@ moo_edit_get_bookmarks_in_range (MooEdit *edit, } -void Edit::_delete_bookmarks(bool in_destroy) +void +_moo_edit_delete_bookmarks (MooEdit *edit, + gboolean in_destroy) { - auto& priv = get_priv(); + GSList *bookmarks; - GSList *bookmarks = priv.bookmarks; - priv.bookmarks = NULL; + bookmarks = edit->priv->bookmarks; + edit->priv->bookmarks = NULL; if (bookmarks) { @@ -379,15 +392,15 @@ void Edit::_delete_bookmarks(bool in_destroy) disconnect_bookmark (MOO_EDIT_BOOKMARK (bookmarks->data)); if (!in_destroy) - moo_text_buffer_delete_line_mark (get_moo_buffer (gobj()), + moo_text_buffer_delete_line_mark (get_moo_buffer (edit), MOO_LINE_MARK (bookmarks->data)); - ::g_object_unref (bookmarks->data); + g_object_unref (bookmarks->data); bookmarks = g_slist_delete_link (bookmarks, bookmarks); } if (!in_destroy) - bookmarks_changed(gobj()); + bookmarks_changed (edit); } } @@ -482,14 +495,15 @@ get_bookmark_color (MooEdit *doc) return style ? _moo_text_style_get_bg_color (style) : NULL; } -void Edit::_update_bookmarks_style() +void +_moo_edit_update_bookmarks_style (MooEdit *edit) { const GSList *bookmarks; const char *color; - color = get_bookmark_color (gobj()); + color = get_bookmark_color (edit); - bookmarks = moo_edit_list_bookmarks (gobj()); + bookmarks = moo_edit_list_bookmarks (edit); while (bookmarks) { moo_line_mark_set_background (MOO_LINE_MARK (bookmarks->data), color); diff --git a/moo/mooedit/mooeditbookmark.h b/moo/mooedit/mooeditbookmark.h index 9edaa60a..43660048 100644 --- a/moo/mooedit/mooeditbookmark.h +++ b/moo/mooedit/mooeditbookmark.h @@ -18,9 +18,6 @@ #include #include -#ifdef __cplusplus -#include -#endif G_BEGIN_DECLS @@ -39,12 +36,6 @@ struct MooEditBookmark { MooLineMark mark; guint no; - -#ifdef __cplusplus - static void set_enable_bookmarks (Edit edit, - bool enable); - static bool get_enable_bookmarks (const Edit& edit); -#endif // __cplusplus }; struct MooEditBookmarkClass @@ -52,13 +43,12 @@ struct MooEditBookmarkClass MooLineMarkClass mark_class; }; -#ifdef __cplusplus -using EditBookmarkPtr = moo::gobj_ptr; -using EditBookmark = moo::gobj_ref; -#endif GType moo_edit_bookmark_get_type (void) G_GNUC_CONST; +void moo_edit_set_enable_bookmarks (MooEdit *edit, + gboolean enable); +gboolean moo_edit_get_enable_bookmarks (MooEdit *edit); /* list must not be modified */ const GSList *moo_edit_list_bookmarks (MooEdit *edit); void moo_edit_toggle_bookmark (MooEdit *edit, diff --git a/moo/mooedit/mooeditdialogs.cpp b/moo/mooedit/mooeditdialogs.c similarity index 66% rename from moo/mooedit/mooeditdialogs.cpp rename to moo/mooedit/mooeditdialogs.c index 42796ed7..2b56f893 100644 --- a/moo/mooedit/mooeditdialogs.cpp +++ b/moo/mooedit/mooeditdialogs.c @@ -17,7 +17,6 @@ #include "mooedit/mooeditprefs.h" #include "mooedit/mooedit-fileops.h" #include "mooedit/mooeditfileinfo.h" -#include "mooedit/mooedit-impl.h" #include "mooutils/moodialogs.h" #include "mooutils/moostock.h" #include "mooutils/mooi18n.h" @@ -26,18 +25,10 @@ #include "mooedit/mootextfind-prompt-gxml.h" #include "mooedit/mooeditsavemult-gxml.h" #include "mooedit/mootryencoding-gxml.h" -#include "moocpp/moocpp.h" #include #include #include -#ifdef __WIN32__ -#include -#include -#endif // __WIN32__ -using namespace moo; - -#ifndef __WIN32__ MooOpenInfoArray * _moo_edit_open_dialog (GtkWidget *widget, @@ -45,7 +36,7 @@ _moo_edit_open_dialog (GtkWidget *widget, { MooFileDialog *dialog; const char *encoding; - g::FilePtr start; + GFile *start = NULL; MooFileArray *files = NULL; MooOpenInfoArray *info_array = NULL; guint i; @@ -54,17 +45,19 @@ _moo_edit_open_dialog (GtkWidget *widget, if (current_doc && moo_prefs_get_bool (moo_edit_setting (MOO_EDIT_PREFS_DIALOGS_OPEN_FOLLOWS_DOC))) { - g::FilePtr file(moo_edit_get_file(current_doc), ref_transfer::take_ownership); + GFile *file = moo_edit_get_file (current_doc); if (file) - start = file->get_parent(); + start = g_file_get_parent (file); + + g_object_unref (file); } if (!start) - start.set_new(moo_prefs_get_file(moo_edit_setting(MOO_EDIT_PREFS_LAST_DIR))); + start = moo_prefs_get_file (moo_edit_setting (MOO_EDIT_PREFS_LAST_DIR)); dialog = moo_file_dialog_new (MOO_FILE_DIALOG_OPEN, widget, - TRUE, GTK_STOCK_OPEN, start.gobj(), + TRUE, GTK_STOCK_OPEN, start, NULL); g_object_set (dialog, "enable-encodings", TRUE, NULL); moo_file_dialog_set_help_id (dialog, "dialog-open"); @@ -84,12 +77,14 @@ _moo_edit_open_dialog (GtkWidget *widget, info_array = moo_open_info_array_new (); for (i = 0; i < files->n_elms; ++i) - moo_open_info_array_take (info_array, moo_open_info_new_file (files->elms[i], encoding, -1, MOO_OPEN_FLAGS_NONE)); + moo_open_info_array_take (info_array, moo_open_info_new_file (files->elms[i], encoding, -1, 0)); - start.set_new(g_file_get_parent (files->elms[0])); - moo_prefs_set_file (moo_edit_setting (MOO_EDIT_PREFS_LAST_DIR), start.gobj()); + g_object_unref (start); + start = g_file_get_parent (files->elms[0]); + moo_prefs_set_file (moo_edit_setting (MOO_EDIT_PREFS_LAST_DIR), start); } + g_object_unref (start); g_object_unref (dialog); moo_file_array_free (files); return info_array; @@ -103,8 +98,8 @@ _moo_edit_save_as_dialog (MooEdit *doc, const char *encoding; MooFileDialog *dialog; MooSaveInfo *info; - g::FilePtr start; - g::FilePtr file; + GFile *start = NULL; + GFile *file = NULL; g_return_val_if_fail (MOO_IS_EDIT (doc), NULL); @@ -113,19 +108,20 @@ _moo_edit_save_as_dialog (MooEdit *doc, if (moo_prefs_get_bool (moo_edit_setting (MOO_EDIT_PREFS_DIALOGS_OPEN_FOLLOWS_DOC))) { - file = wrap_new (moo_edit_get_file (doc)); + file = moo_edit_get_file (doc); if (file) - start = file->get_parent (); + start = g_file_get_parent (file); + g_object_unref (file); file = NULL; } if (!start) - start = wrap_new (moo_prefs_get_file (moo_edit_setting (MOO_EDIT_PREFS_LAST_DIR))); + start = moo_prefs_get_file (moo_edit_setting (MOO_EDIT_PREFS_LAST_DIR)); dialog = moo_file_dialog_new (MOO_FILE_DIALOG_SAVE, GTK_WIDGET (moo_edit_get_view (doc)), FALSE, GTK_STOCK_SAVE_AS, - start.gobj(), display_basename); + start, display_basename); g_object_set (dialog, "enable-encodings", TRUE, NULL); moo_file_dialog_set_encoding (dialog, moo_edit_get_encoding (doc)); moo_file_dialog_set_help_id (dialog, "dialog-save"); @@ -135,76 +131,25 @@ _moo_edit_save_as_dialog (MooEdit *doc, if (!moo_file_dialog_run (dialog)) { g_object_unref (dialog); + g_object_unref (start); return NULL; } encoding = moo_file_dialog_get_encoding (dialog); file = moo_file_dialog_get_file (dialog); - g_return_val_if_fail (file != nullptr, NULL); - info = moo_save_info_new_file (file.gobj(), encoding); + g_return_val_if_fail (file != NULL, NULL); + info = moo_save_info_new_file (file, encoding); - start = file->get_parent (); - moo_prefs_set_file (moo_edit_setting (MOO_EDIT_PREFS_LAST_DIR), start.gobj()); + g_object_unref (start); + start = g_file_get_parent (file); + moo_prefs_set_file (moo_edit_setting (MOO_EDIT_PREFS_LAST_DIR), start); + g_object_unref (start); + g_object_unref (file); g_object_unref (dialog); return info; } -#else // __WIN32__ - -MooOpenInfoArray * -_moo_edit_open_dialog(GtkWidget* parent, - MooEdit* current_doc) -{ - gstr start_folder; - - if (current_doc && moo_prefs_get_bool(moo_edit_setting(MOO_EDIT_PREFS_DIALOGS_OPEN_FOLLOWS_DOC))) - { - g::FilePtr file(moo_edit_get_file(current_doc), ref_transfer::take_ownership); - - if (file) - start_folder = file->get_parent()->get_path(); - } - - GtkWidget* toplevel = parent ? gtk_widget_get_toplevel(parent) : nullptr; - HWND hwnd = toplevel ? reinterpret_cast (GDK_WINDOW_HWND(toplevel->window)) : nullptr; - g::gstrvec files = moo_show_win32_file_open_dialog(hwnd, start_folder); - if (files.empty()) - return nullptr; - - MooOpenInfoArray *result = moo_open_info_array_new(); - for (const gstr& path : files) - moo_open_info_array_take(result, moo_open_info_new(path, MOO_ENCODING_AUTO, -1, MOO_OPEN_FLAGS_NONE)); - return result; -} - - -MooSaveInfo* -_moo_edit_save_as_dialog(MooEdit* doc, - const char* display_basename) -{ - MooEditView* view = moo_edit_get_view (doc); - GtkWidget* toplevel = view ? gtk_widget_get_toplevel(GTK_WIDGET(view)) : nullptr; - HWND hwnd = toplevel ? reinterpret_cast (GDK_WINDOW_HWND(toplevel->window)) : nullptr; - - gstr start_folder; - - if (moo_prefs_get_bool(moo_edit_setting(MOO_EDIT_PREFS_DIALOGS_OPEN_FOLLOWS_DOC))) - { - g::FilePtr file = wrap_new(moo_edit_get_file(doc)); - if (file) - start_folder = file->get_parent()->get_path(); - } - - gstr save_as = moo_show_win32_file_save_as_dialog(hwnd, start_folder, gstr::wrap(display_basename)); - if (save_as.empty()) - return nullptr; - - return moo_save_info_new(save_as, nullptr); -} - -#endif // __WIN32__ - MooSaveChangesResponse _moo_edit_save_changes_dialog (MooEdit *doc) @@ -225,37 +170,50 @@ enum { NUM_COLUMNS }; +static void +name_data_func (G_GNUC_UNUSED GtkTreeViewColumn *column, + GtkCellRenderer *cell, + GtkTreeModel *model, + GtkTreeIter *iter) +{ + MooEdit *doc = NULL; + + gtk_tree_model_get (model, iter, COLUMN_EDIT, &doc, -1); + g_return_if_fail (MOO_IS_EDIT (doc)); + + g_object_set (cell, "text", moo_edit_get_display_basename (doc), NULL); + g_object_unref (doc); +} + static void -save_toggled (GtkCellRendererToggle *pcell, +save_toggled (GtkCellRendererToggle *cell, gchar *path, - GtkListStore *pmodel) + GtkTreeModel *model) { GtkTreePath *tree_path; + GtkTreeIter iter; + gboolean save = TRUE; + gboolean active; gboolean sensitive; GtkDialog *dialog; - g_return_if_fail (GTK_IS_LIST_STORE (pmodel)); - - gtk::ListStore model (*pmodel); - gtk::CellRendererToggle cell (*pcell); + g_return_if_fail (GTK_IS_LIST_STORE (model)); tree_path = gtk_tree_path_new_from_string (path); g_return_if_fail (tree_path != NULL); - GtkTreeIter iter; - model.get_iter (iter, *tree_path); - bool save = true; - model.get (iter, COLUMN_SAVE, save); + gtk_tree_model_get_iter (model, &iter, tree_path); + gtk_tree_model_get (model, &iter, COLUMN_SAVE, &save, -1); - bool active = cell.get_active (); + active = gtk_cell_renderer_toggle_get_active (cell); if (active == save) - model.set (iter, COLUMN_SAVE, !save); + gtk_list_store_set (GTK_LIST_STORE (model), &iter, COLUMN_SAVE, !save, -1); gtk_tree_path_free (tree_path); - dialog = GTK_DIALOG (model.get_data ("moo-dialog")); + dialog = g_object_get_data (G_OBJECT (model), "moo-dialog"); g_return_if_fail (dialog != NULL); if (!save) @@ -265,65 +223,64 @@ save_toggled (GtkCellRendererToggle *pcell, else { sensitive = FALSE; - model.get_iter_first (iter); + gtk_tree_model_get_iter_first (model, &iter); do { - model.get (iter, COLUMN_SAVE, save); + gtk_tree_model_get (model, &iter, COLUMN_SAVE, &save, -1); if (save) { sensitive = TRUE; break; } } - while (model.iter_next (iter)); + while (gtk_tree_model_iter_next (model, &iter)); } gtk_dialog_set_response_sensitive (dialog, GTK_RESPONSE_YES, sensitive); } static void -files_treeview_init (gtk::TreeView treeview, GtkWidget *dialog, MooEditArray *docs) +files_treeview_init (GtkTreeView *treeview, GtkWidget *dialog, MooEditArray *docs) { - gtk::ListStorePtr store = gtk::ListStore::create ({ G_TYPE_BOOLEAN, MOO_TYPE_EDIT }); + GtkListStore *store; + GtkTreeViewColumn *column; + GtkCellRenderer *cell; + guint i; - for (guint i = 0; i < docs->n_elms; ++i) + store = gtk_list_store_new (NUM_COLUMNS, G_TYPE_BOOLEAN, MOO_TYPE_EDIT); + + for (i = 0; i < docs->n_elms; ++i) { GtkTreeIter iter; - store->append (iter); - store->set (iter, - COLUMN_SAVE, TRUE, - COLUMN_EDIT, docs->elms[i]); + gtk_list_store_append (store, &iter); + gtk_list_store_set (store, &iter, + COLUMN_SAVE, TRUE, + COLUMN_EDIT, docs->elms[i], + -1); } - treeview.set_model (store); + gtk_tree_view_set_model (treeview, GTK_TREE_MODEL (store)); - gtk::TreeViewColumnPtr column = gtk::TreeViewColumn::create (); - treeview.append_column (*column); - gtk::CellRendererPtr cell = gtk::CellRendererToggle::create (); - column->pack_start (*cell, FALSE); - cell->set ("activatable", TRUE); - column->add_attribute (*cell, "active", COLUMN_SAVE); - cell->connect ("toggled", G_CALLBACK (save_toggled), store.gobj()); + column = gtk_tree_view_column_new (); + gtk_tree_view_append_column (treeview, column); + cell = gtk_cell_renderer_toggle_new (); + gtk_tree_view_column_pack_start (column, cell, FALSE); + g_object_set (cell, "activatable", TRUE, NULL); + gtk_tree_view_column_add_attribute (column, cell, "active", COLUMN_SAVE); + g_signal_connect (cell, "toggled", G_CALLBACK (save_toggled), store); - column = gtk::TreeViewColumn::create (); - treeview.append_column (*column); - cell = gtk::CellRendererText::create (); - column->pack_start (*cell, TRUE); + column = gtk_tree_view_column_new (); + gtk_tree_view_append_column (treeview, column); + cell = gtk_cell_renderer_text_new (); + gtk_tree_view_column_pack_start (column, cell, TRUE); + gtk_tree_view_column_set_cell_data_func (column, cell, + (GtkTreeCellDataFunc) name_data_func, + NULL, NULL); - column->set_cell_data_func (*cell, - [] (gtk::TreeViewColumn, - gtk::CellRenderer cell, - gtk::TreeModel model, - const GtkTreeIter& iter) - { - gobj_ptr doc; - model.get (iter, COLUMN_EDIT, doc); - g_return_if_fail (MOO_IS_EDIT (doc.gobj ())); - cell.set ("text", moo_edit_get_display_basename (doc.gobj ())); - }); + g_object_set_data (G_OBJECT (store), "moo-dialog", dialog); - store->set_data ("moo-dialog", dialog); + g_object_unref (store); } @@ -369,7 +326,7 @@ find_widget_for_response (GtkDialog *dialog, for (l = children; ret == NULL && l != NULL; l = l->next) { - GtkWidget *widget = GTK_WIDGET (l->data); + GtkWidget *widget = l->data; int response_here = gtk_dialog_get_response_for_widget (dialog, widget); if (response_here == response) ret = widget; @@ -383,11 +340,17 @@ MooSaveChangesResponse _moo_edit_save_multiple_changes_dialog (MooEditArray *docs, MooEditArray *to_save) { + GtkWidget *dialog; + char *msg, *question; + int response; + MooSaveChangesResponse retval; + SaveMultDialogXml *xml; + g_return_val_if_fail (docs != NULL && docs->n_elms > 1, MOO_SAVE_CHANGES_RESPONSE_CANCEL); g_return_val_if_fail (to_save != NULL, MOO_SAVE_CHANGES_RESPONSE_CANCEL); - SaveMultDialogXml *xml = save_mult_dialog_xml_new (); - GtkWidget *dialog = GTK_WIDGET (xml->SaveMultDialog); + xml = save_mult_dialog_xml_new (); + dialog = GTK_WIDGET (xml->SaveMultDialog); moo_window_set_parent (dialog, GTK_WIDGET (moo_edit_get_view (docs->elms[0]))); @@ -404,19 +367,20 @@ _moo_edit_save_multiple_changes_dialog (MooEditArray *docs, GTK_RESPONSE_NO, GTK_RESPONSE_CANCEL, -1); - gstr question = gstr::printf (dngettext (GETTEXT_PACKAGE, - /* Translators: number of documents here is always greater than one, so - * ignore singular form (which is simply copy of the plural here) */ - "There are %u documents with unsaved changes. " - "Save changes before closing?", - "There are %u documents with unsaved changes. " - "Save changes before closing?", - docs->n_elms), - (guint) docs->n_elms); - gstr msg = g::markup_printf_escaped ("%s", question); + question = g_strdup_printf (dngettext (GETTEXT_PACKAGE, + /* Translators: number of documents here is always greater than one, so + ignore singular form (which is simply copy of the plural here) */ + "There are %u documents with unsaved changes. " + "Save changes before closing?", + "There are %u documents with unsaved changes. " + "Save changes before closing?", + docs->n_elms), + (guint) docs->n_elms); + msg = g_markup_printf_escaped ("%s", + question); gtk_label_set_markup (xml->label, msg); - files_treeview_init (wrap (*xml->treeview), dialog, docs); + files_treeview_init (xml->treeview, dialog, docs); { GtkWidget *button; @@ -424,8 +388,7 @@ _moo_edit_save_multiple_changes_dialog (MooEditArray *docs, gtk_widget_grab_focus (button); } - MooSaveChangesResponse retval; - int response = gtk_dialog_run (GTK_DIALOG (dialog)); + response = gtk_dialog_run (GTK_DIALOG (dialog)); switch (response) { @@ -438,9 +401,10 @@ _moo_edit_save_multiple_changes_dialog (MooEditArray *docs, break; default: retval = MOO_SAVE_CHANGES_RESPONSE_CANCEL; - break; } + g_free (question); + g_free (msg); gtk_widget_destroy (dialog); return retval; } @@ -450,13 +414,24 @@ _moo_edit_save_multiple_changes_dialog (MooEditArray *docs, /* Error dialogs */ -void _moo_edit_save_error_dialog(Edit& doc, g::File file, GError *error) +void +_moo_edit_save_error_dialog (MooEdit *doc, + GFile *file, + GError *error) { - gstr filename = moo_file_get_display_name (file); - gstr msg = gstr::printf(_("Could not save file\n%s"), filename); + char *filename, *msg = NULL; - moo_error_dialog(msg, moo_error_message(error), - GTK_WIDGET(moo_edit_get_view(doc.gobj()))); + g_return_if_fail (G_IS_FILE (file)); + + filename = moo_file_get_display_name (file); + + msg = g_strdup_printf (_("Could not save file\n%s"), filename); + + moo_error_dialog (msg, moo_error_message (error), + GTK_WIDGET (moo_edit_get_view (doc))); + + g_free (msg); + g_free (filename); } static gboolean @@ -498,56 +473,67 @@ moo_edit_question_dialog (MooEdit *doc, return res == GTK_RESPONSE_YES; } -bool _moo_edit_save_error_enc_dialog(Edit& doc, - g::File file, - const char* encoding) +gboolean +_moo_edit_save_error_enc_dialog (MooEdit *doc, + GFile *file, + const char *encoding) { + char *filename; + char *secondary; + gboolean result; + + g_return_val_if_fail (G_IS_FILE (file), FALSE); g_return_val_if_fail (encoding != NULL, FALSE); - gstr filename = moo_file_get_display_name (file); + filename = moo_file_get_display_name (file); - auto secondary = gstr::printf ( - _("Could not save file %s in encoding %s. " - "Do you want to save it in UTF-8 encoding instead?"), - filename, encoding); + secondary = g_strdup_printf (_("Could not save file %s in encoding %s. " + "Do you want to save it in UTF-8 encoding instead?"), + filename, encoding); - return moo_edit_question_dialog (&doc, _("Save file in UTF-8 encoding?"), - secondary, GTK_STOCK_OK, GTK_RESPONSE_YES); + result = moo_edit_question_dialog (doc, _("Save file in UTF-8 encoding?"), + secondary, GTK_STOCK_OK, GTK_RESPONSE_YES); + + g_free (secondary); + g_free (filename); + return result; } MooEditTryEncodingResponse -_moo_edit_try_encoding_dialog (g::File file, - const char* encoding, - /*out*/ gstr& new_encoding) +_moo_edit_try_encoding_dialog (G_GNUC_UNUSED GFile *file, + const char *encoding, + char **new_encoding) { MooEditWindow *window; GtkWidget *dialog; TryEncodingDialogXml *xml; int dialog_response; - gstr msg; - gstr secondary; + char *filename = NULL; + char *msg = NULL; + char *secondary = NULL; - gstr filename = moo_file_get_display_name(file); + filename = moo_file_get_display_name (file); - if (!filename.empty()) + if (filename) { /* Could not open file foo.txt */ - gstr tmp = gstr::printf(_("Could not open file\n%s"), filename); - msg = g::markup_printf_escaped("%s", tmp); + char *tmp = g_strdup_printf (_("Could not open file\n%s"), filename); + msg = g_markup_printf_escaped ("%s", tmp); + g_free (tmp); } else { const char *tmp = _("Could not open file"); - msg = g::markup_printf_escaped("%s", tmp); + msg = g_markup_printf_escaped ("%s", tmp); } - if (encoding != NULL) - secondary = gstr::printf (_("Could not open file using character encoding %s. " - "Try to select another encoding below."), encoding); + if (encoding) + secondary = g_strdup_printf (_("Could not open file using character encoding %s. " + "Try to select another encoding below."), encoding); else - secondary = gstr::printf (_("Could not detect file character encoding. " - "Try to select an encoding below.")); + secondary = g_strdup_printf (_("Could not detect file character encoding. " + "Try to select an encoding below.")); xml = try_encoding_dialog_xml_new (); g_return_val_if_fail (xml && xml->TryEncodingDialog, MOO_EDIT_TRY_ENCODING_RESPONSE_CANCEL); @@ -575,9 +561,11 @@ _moo_edit_try_encoding_dialog (g::File file, dialog_response = gtk_dialog_run (GTK_DIALOG (dialog)); - new_encoding.set(_moo_encodings_combo_get_enc (GTK_COMBO_BOX (xml->encoding_combo), MOO_ENCODING_COMBO_OPEN)); + *new_encoding = g_strdup (_moo_encodings_combo_get_enc (GTK_COMBO_BOX (xml->encoding_combo), MOO_ENCODING_COMBO_OPEN)); gtk_widget_destroy (dialog); + g_free (secondary); + g_free (msg); return dialog_response == GTK_RESPONSE_OK ? MOO_EDIT_TRY_ENCODING_RESPONSE_TRY_ANOTHER : @@ -586,26 +574,28 @@ _moo_edit_try_encoding_dialog (g::File file, void -_moo_edit_open_error_dialog (GtkWidget* widget, - g::File* file, - GError* error) +_moo_edit_open_error_dialog (GtkWidget *widget, + GFile *file, + GError *error) { - gstr msg; - gstr secondary; + char *filename, *msg = NULL; + char *secondary; - g_warn_if_fail (file != nullptr); - gstr filename = file ? moo_file_get_display_name (*file) : gstr (); + filename = moo_file_get_display_name (file); - if (!filename.empty()) + if (filename) /* Could not open file foo.txt */ - msg.set_printf (_("Could not open file\n%s"), filename); + msg = g_strdup_printf (_("Could not open file\n%s"), filename); else - msg.set_const (_("Could not open file")); + msg = g_strdup (_("Could not open file")); - if (error) - secondary.set (error->message); + secondary = error ? g_strdup (error->message) : NULL; moo_error_dialog (msg, secondary, widget); + + g_free (msg); + g_free (secondary); + g_free (filename); } diff --git a/moo/mooedit/mooeditdialogs.h b/moo/mooedit/mooeditdialogs.h index ba45abd4..f7914816 100644 --- a/moo/mooedit/mooeditdialogs.h +++ b/moo/mooedit/mooeditdialogs.h @@ -1,7 +1,7 @@ /* * mooeditdialogs.h * - * Copyright (C) 2004-2016 by Yevgen Muntyan + * Copyright (C) 2004-2010 by Yevgen Muntyan * * This file is part of medit. medit is free software; you can * redistribute it and/or modify it under the terms of the @@ -13,7 +13,8 @@ * License along with medit. If not, see . */ -#pragma once +#ifndef MOO_EDIT_DIALOGS_H +#define MOO_EDIT_DIALOGS_H #include "mooutils/moodialogs.h" #include "mooedit/mooedittypes.h" @@ -38,8 +39,20 @@ MooSaveChangesResponse _moo_edit_save_multiple_changes_dialog (MooEdit gboolean _moo_edit_reload_modified_dialog (MooEdit *doc); gboolean _moo_edit_overwrite_modified_dialog (MooEdit *doc); +void _moo_edit_save_error_dialog (MooEdit *doc, + GFile *file, + GError *error); +gboolean _moo_edit_save_error_enc_dialog (MooEdit *doc, + GFile *file, + const char *encoding); +void _moo_edit_open_error_dialog (GtkWidget *widget, + GFile *file, + GError *error); void _moo_edit_reload_error_dialog (MooEdit *doc, GError *error); +MooEditTryEncodingResponse _moo_edit_try_encoding_dialog (GFile *file, + const char *encoding, + char **new_encoding); gboolean _moo_text_search_from_start_dialog (GtkWidget *parent, gboolean backwards); @@ -52,21 +65,4 @@ GtkWidget *_moo_text_prompt_on_replace_dialog (GtkWidg G_END_DECLS -#ifdef __cplusplus - -#include - -MooEditTryEncodingResponse _moo_edit_try_encoding_dialog (g::File& file, - const char* encoding, - /*out*/ g::gstr& new_encoding); -bool _moo_edit_save_error_enc_dialog (Edit& doc, - g::File& file, - const char* encoding); -void _moo_edit_save_error_dialog (Edit& doc, - g::File& file, - GError* error); -void _moo_edit_open_error_dialog (GtkWidget* widget, - g::File& file, - GError* error); - -#endif // __cplusplus +#endif /* MOO_EDIT_DIALOGS_H */ diff --git a/moo/mooedit/mooeditfileinfo-impl.h b/moo/mooedit/mooeditfileinfo-impl.h index a5f232ed..8e6675d1 100644 --- a/moo/mooedit/mooeditfileinfo-impl.h +++ b/moo/mooedit/mooeditfileinfo-impl.h @@ -1,74 +1,49 @@ -#pragma once +#ifndef MOO_EDIT_FILE_INFO_IMPL_H +#define MOO_EDIT_FILE_INFO_IMPL_H #include "mooeditfileinfo.h" -#include "moocpp/moocpp.h" -using namespace moo; +G_BEGIN_DECLS struct MooOpenInfo { - g::FilePtr file; - gstr encoding; + GObject parent; + + GFile *file; + char *encoding; int line; MooOpenFlags flags; - - MooOpenInfo(GFile* file, const char* encoding, int line, MooOpenFlags flags) - : file(wrap_new(g_file_dup(file))) - , encoding(gstr::wrap(encoding)) - , line(line) - , flags(flags) - { - } - - MooOpenInfo(const MooOpenInfo& other) - : file(other.file->dup()) - , encoding(other.encoding) - , line(other.line) - , flags(other.flags) - { - } - - MooOpenInfo& operator=(const MooOpenInfo&) = delete; - MooOpenInfo(MooOpenInfo&&) = delete; - MooOpenInfo& operator=(MooOpenInfo&&) = delete; }; -struct MooReloadInfo : public GObject +struct MooOpenInfoClass { - MooReloadInfo(const char* encoding, int line) - : encoding(gstr::wrap(encoding)) - , line(line) - { - } + GObjectClass parent_class; +}; - MooReloadInfo(const MooReloadInfo& other) - : encoding(other.encoding) - , line(other.line) - { - } +struct MooReloadInfo { + GObject parent; - gstr encoding; + char *encoding; int line; - - MooReloadInfo(MooReloadInfo&&) = delete; }; -struct MooSaveInfo : public GObject +struct MooReloadInfoClass { - g::FilePtr file; - gstr encoding; - - MooSaveInfo(GFile* file, const char* encoding) - : file(wrap_new(g_file_dup(file))) - , encoding(gstr::wrap(encoding)) - { - } - - MooSaveInfo(const MooSaveInfo& other) - : file(other.file->dup()) - , encoding(other.encoding) - { - } - - MooSaveInfo(MooSaveInfo&&) = delete; + GObjectClass parent_class; }; + +struct MooSaveInfo { + GObject parent; + + GFile *file; + char *encoding; +}; + +struct MooSaveInfoClass +{ + GObjectClass parent_class; +}; + +G_END_DECLS + +#endif /* MOO_EDIT_FILE_INFO_IMPL_H */ diff --git a/moo/mooedit/mooeditfileinfo.c b/moo/mooedit/mooeditfileinfo.c new file mode 100644 index 00000000..6de672d8 --- /dev/null +++ b/moo/mooedit/mooeditfileinfo.c @@ -0,0 +1,481 @@ +/** + * class:MooOpenInfo: (parent GObject): information for opening a file + * + * Object which contains filename, character encoding, line + * number, and options to use in moo_editor_open_file(). + **/ + +/** + * class:MooSaveInfo: (parent GObject): information for saving a file + * + * Object which contains a filename and character encoding to + * use in moo_editor_save() and moo_editor_save_as(). + **/ + +/** + * class:MooReloadInfo: (parent GObject): information for reloading a file + * + * Object which contains character encoding and line number to + * use in moo_editor_reload(). + **/ + +#include "mooeditfileinfo-impl.h" +#include + +static void moo_open_info_class_init (MooOpenInfoClass *klass); +static void moo_save_info_class_init (MooSaveInfoClass *klass); +static void moo_reload_info_class_init (MooReloadInfoClass *klass); + +MOO_DEFINE_OBJECT_ARRAY (MooOpenInfo, moo_open_info) + +G_DEFINE_TYPE (MooOpenInfo, moo_open_info, G_TYPE_OBJECT) +G_DEFINE_TYPE (MooSaveInfo, moo_save_info, G_TYPE_OBJECT) +G_DEFINE_TYPE (MooReloadInfo, moo_reload_info, G_TYPE_OBJECT) + +/** + * moo_open_info_new_file: (static-method-of MooOpenInfo) (moo-kwargs) + * + * @file: + * @encoding: (type const-utf8) (allow-none) (default NULL) + * @line: (type index) (default -1) + * @flags: (default 0) + * + * Returns: (transfer full) + **/ +MooOpenInfo * +moo_open_info_new_file (GFile *file, + const char *encoding, + int line, + MooOpenFlags flags) +{ + MooOpenInfo *info; + + g_return_val_if_fail (G_IS_FILE (file), NULL); + + info = g_object_new (MOO_TYPE_OPEN_INFO, NULL); + + info->file = g_file_dup (file); + info->encoding = g_strdup (encoding); + info->line = line; + info->flags = flags; + + return info; +} + +/** + * moo_open_info_new: (constructor-of MooOpenInfo) (moo-kwargs) + * + * @path: (type const-filename) + * @encoding: (type const-utf8) (allow-none) (default NULL) + * @line: (type index) (default -1) + * @flags: (default 0) + * + * Returns: (transfer full) + **/ +MooOpenInfo * +moo_open_info_new (const char *path, + const char *encoding, + int line, + MooOpenFlags flags) +{ + GFile *file = g_file_new_for_path (path); + MooOpenInfo *info = moo_open_info_new_file (file, encoding, line, flags); + g_object_unref (file); + return info; +} + +/** + * moo_open_info_new_uri: (static-method-of MooOpenInfo) (moo-kwargs) + * + * @uri: (type const-utf8) + * @encoding: (type const-utf8) (allow-none) (default NULL) + * @line: (type index) (default -1) + * @flags: (default 0) + * + * Returns: (transfer full) + **/ +MooOpenInfo * +moo_open_info_new_uri (const char *uri, + const char *encoding, + int line, + MooOpenFlags flags) +{ + GFile *file = g_file_new_for_uri (uri); + MooOpenInfo *info = moo_open_info_new_file (file, encoding, line, flags); + g_object_unref (file); + return info; +} + +/** + * moo_open_info_dup: + * + * Returns: (transfer full) + **/ +MooOpenInfo * +moo_open_info_dup (MooOpenInfo *info) +{ + MooOpenInfo *copy; + + g_return_val_if_fail (info != NULL, NULL); + + copy = moo_open_info_new_file (info->file, info->encoding, info->line, info->flags); + g_return_val_if_fail (copy != NULL, NULL); + + return copy; +} + +void +moo_open_info_free (MooOpenInfo *info) +{ + if (info) + g_object_unref (info); +} + + +/** + * moo_open_info_get_filename: (moo.private 1) + * + * Returns: (type filename) + **/ +char * +moo_open_info_get_filename (MooOpenInfo *info) +{ + g_return_val_if_fail (MOO_IS_OPEN_INFO (info), NULL); + return g_file_get_path (info->file); +} + +/** + * moo_open_info_get_uri: (moo.private 1) + * + * Returns: (type utf8) + **/ +char * +moo_open_info_get_uri (MooOpenInfo *info) +{ + g_return_val_if_fail (MOO_IS_OPEN_INFO (info), NULL); + return g_file_get_uri (info->file); +} + +/** + * moo_open_info_get_file: (moo.private 1) + * + * Returns: (transfer full) + **/ +GFile * +moo_open_info_get_file (MooOpenInfo *info) +{ + g_return_val_if_fail (MOO_IS_OPEN_INFO (info), NULL); + return g_file_dup (info->file); +} + +/** + * moo_open_info_get_encoding: (moo.private 1) + * + * Returns: (type const-utf8) + **/ +const char * +moo_open_info_get_encoding (MooOpenInfo *info) +{ + g_return_val_if_fail (MOO_IS_OPEN_INFO (info), NULL); + return info->encoding; +} + +/** + * moo_open_info_set_encoding: (moo.private 1) + * + * @info: + * @encoding: (type const-utf8) (allow-none) + **/ +void +moo_open_info_set_encoding (MooOpenInfo *info, + const char *encoding) +{ + g_return_if_fail (MOO_IS_OPEN_INFO (info)); + MOO_ASSIGN_STRING (info->encoding, encoding); +} + +/** + * moo_open_info_get_line: + * + * Returns: (type index) + **/ +int +moo_open_info_get_line (MooOpenInfo *info) +{ + g_return_val_if_fail (MOO_IS_OPEN_INFO (info), -1); + return info->line; +} + +/** + * moo_open_info_set_line: + * + * @info: + * @line: (type index) + **/ +void +moo_open_info_set_line (MooOpenInfo *info, + int line) +{ + g_return_if_fail (MOO_IS_OPEN_INFO (info)); + info->line = line; +} + +/** + * moo_open_info_get_flags: + **/ +MooOpenFlags +moo_open_info_get_flags (MooOpenInfo *info) +{ + g_return_val_if_fail (MOO_IS_OPEN_INFO (info), 0); + return info->flags; +} + +/** + * moo_open_info_set_flags: + **/ +void +moo_open_info_set_flags (MooOpenInfo *info, + MooOpenFlags flags) +{ + g_return_if_fail (MOO_IS_OPEN_INFO (info)); + info->flags = flags; +} + +/** + * moo_open_info_add_flags: + **/ +void +moo_open_info_add_flags (MooOpenInfo *info, + MooOpenFlags flags) +{ + g_return_if_fail (MOO_IS_OPEN_INFO (info)); + info->flags |= flags; +} + + +static void +moo_open_info_finalize (GObject *object) +{ + MooOpenInfo *info = (MooOpenInfo*) object; + + g_object_unref (info->file); + g_free (info->encoding); + + G_OBJECT_CLASS (moo_open_info_parent_class)->finalize (object); +} + +static void +moo_open_info_class_init (MooOpenInfoClass *klass) +{ + G_OBJECT_CLASS (klass)->finalize = moo_open_info_finalize; +} + +static void +moo_open_info_init (MooOpenInfo *info) +{ + info->line = -1; +} + + +/** + * moo_save_info_new_file: (static-method-of MooSaveInfo) + * + * @file: + * @encoding: (type const-utf8) (allow-none) (default NULL) + * + * Returns: (transfer full) + **/ +MooSaveInfo * +moo_save_info_new_file (GFile *file, + const char *encoding) +{ + MooSaveInfo *info; + + g_return_val_if_fail (G_IS_FILE (file), NULL); + + info = g_object_new (MOO_TYPE_SAVE_INFO, NULL); + + info->file = g_file_dup (file); + info->encoding = g_strdup (encoding); + + return info; +} + +/** + * moo_save_info_new: (constructor-of MooSaveInfo) + * + * @path: (type const-filename) + * @encoding: (type const-utf8) (allow-none) (default NULL) + * + * Returns: (transfer full) + **/ +MooSaveInfo * +moo_save_info_new (const char *path, + const char *encoding) +{ + GFile *file = g_file_new_for_path (path); + MooSaveInfo *info = moo_save_info_new_file (file, encoding); + g_object_unref (file); + return info; +} + +/** + * moo_save_info_new_uri: (static-method-of MooSaveInfo) + * + * @uri: (type const-utf8) + * @encoding: (type const-utf8) (allow-none) (default NULL) + * + * Returns: (transfer full) + **/ +MooSaveInfo * +moo_save_info_new_uri (const char *uri, + const char *encoding) +{ + GFile *file = g_file_new_for_uri (uri); + MooSaveInfo *info = moo_save_info_new_file (file, encoding); + g_object_unref (file); + return info; +} + +/** + * moo_save_info_dup: + * + * Returns: (transfer full) + **/ +MooSaveInfo * +moo_save_info_dup (MooSaveInfo *info) +{ + MooSaveInfo *copy; + + g_return_val_if_fail (info != NULL, NULL); + + copy = moo_save_info_new_file (info->file, info->encoding); + g_return_val_if_fail (copy != NULL, NULL); + + return copy; +} + +void +moo_save_info_free (MooSaveInfo *info) +{ + if (info) + g_object_unref (info); +} + +static void +moo_save_info_finalize (GObject *object) +{ + MooSaveInfo *info = (MooSaveInfo*) object; + + g_object_unref (info->file); + g_free (info->encoding); + + G_OBJECT_CLASS (moo_save_info_parent_class)->finalize (object); +} + +static void +moo_save_info_class_init (MooSaveInfoClass *klass) +{ + G_OBJECT_CLASS (klass)->finalize = moo_save_info_finalize; +} + +static void +moo_save_info_init (G_GNUC_UNUSED MooSaveInfo *info) +{ +} + + +/** + * moo_reload_info_new: (constructor-of MooReloadInfo) + * + * @encoding: (type const-utf8) (allow-none) (default NULL) + * @line: (type index) (default -1) + **/ +MooReloadInfo * +moo_reload_info_new (const char *encoding, + int line) +{ + MooReloadInfo *info; + + info = g_object_new (MOO_TYPE_RELOAD_INFO, NULL); + + info->encoding = g_strdup (encoding); + info->line = line; + + return info; +} + +/** + * moo_reload_info_dup: + * + * Returns: (transfer full) + **/ +MooReloadInfo * +moo_reload_info_dup (MooReloadInfo *info) +{ + MooReloadInfo *copy; + + g_return_val_if_fail (info != NULL, NULL); + + copy = moo_reload_info_new (info->encoding, info->line); + g_return_val_if_fail (copy != NULL, NULL); + + return copy; +} + +void +moo_reload_info_free (MooReloadInfo *info) +{ + if (info) + g_object_unref (info); +} + + +/** + * moo_reload_info_get_line: + * + * Returns: (type index) + **/ +int +moo_reload_info_get_line (MooReloadInfo *info) +{ + g_return_val_if_fail (MOO_IS_RELOAD_INFO (info), -1); + return info->line; +} + +/** + * moo_reload_info_set_line: + * + * @info: + * @line: (type index) + **/ +void +moo_reload_info_set_line (MooReloadInfo *info, + int line) +{ + g_return_if_fail (MOO_IS_RELOAD_INFO (info)); + info->line = line; +} + + +static void +moo_reload_info_finalize (GObject *object) +{ + MooReloadInfo *info = (MooReloadInfo*) object; + + g_free (info->encoding); + + G_OBJECT_CLASS (moo_reload_info_parent_class)->finalize (object); +} + +static void +moo_reload_info_class_init (MooReloadInfoClass *klass) +{ + G_OBJECT_CLASS (klass)->finalize = moo_reload_info_finalize; +} + +static void +moo_reload_info_init (MooReloadInfo *info) +{ + info->line = -1; +} diff --git a/moo/mooedit/mooeditfileinfo.cpp b/moo/mooedit/mooeditfileinfo.cpp deleted file mode 100644 index f5f9b082..00000000 --- a/moo/mooedit/mooeditfileinfo.cpp +++ /dev/null @@ -1,342 +0,0 @@ -/** -* boxed:MooOpenInfo: information for opening a file - * - * Object which contains filename, character encoding, line - * number, and options to use in moo_editor_open_file(). - **/ - -/** - * boxed:MooSaveInfo: information for saving a file - * - * Object which contains a filename and character encoding to - * use in moo_editor_save() and moo_editor_save_as(). - **/ - -/** - * boxed:MooReloadInfo: information for reloading a file - * - * Object which contains character encoding and line number to - * use in moo_editor_reload(). - **/ - -#include "mooeditfileinfo-impl.h" -#include -#include - -using namespace moo; - -MOO_DEFINE_BOXED_CPP_TYPE(MooOpenInfo, moo_open_info) -MOO_DEFINE_BOXED_CPP_TYPE(MooSaveInfo, moo_save_info) -MOO_DEFINE_BOXED_CPP_TYPE(MooReloadInfo, moo_reload_info) - -MOO_DEFINE_PTR_ARRAY_FULL(MooOpenInfoArray, moo_open_info_array, MooOpenInfo, - gboxed_helper::array_elm_copy, - gboxed_helper::array_elm_free) - -/** - * moo_open_info_new_file: (static-method-of MooOpenInfo) (moo-kwargs) - * - * @file: - * @encoding: (type const-utf8) (allow-none) (default NULL) - * @line: (type index) (default -1) - * @flags: (default 0) - * - * Returns: (transfer full) - **/ -MooOpenInfo * -moo_open_info_new_file (GFile *file, - const char *encoding, - int line, - MooOpenFlags flags) -{ - g_return_val_if_fail (G_IS_FILE (file), nullptr); - return new MooOpenInfo(file, encoding, line, flags); -} - -/** - * moo_open_info_new: (constructor-of MooOpenInfo) (moo-kwargs) - * - * @path: (type const-filename) - * @encoding: (type const-utf8) (allow-none) (default NULL) - * @line: (type index) (default -1) - * @flags: (default 0) - * - * Returns: (transfer full) - **/ -MooOpenInfo * -moo_open_info_new (const char *path, - const char *encoding, - int line, - MooOpenFlags flags) -{ - g::FilePtr file = g::File::new_for_path(path); - return moo_open_info_new_file (file.gobj(), encoding, line, flags); -} - -/** - * moo_open_info_new_uri: (static-method-of MooOpenInfo) (moo-kwargs) - * - * @uri: (type const-utf8) - * @encoding: (type const-utf8) (allow-none) (default NULL) - * @line: (type index) (default -1) - * @flags: (default 0) - * - * Returns: (transfer full) - **/ -MooOpenInfo * -moo_open_info_new_uri (const char *uri, - const char *encoding, - int line, - MooOpenFlags flags) -{ - g::FilePtr file = g::File::new_for_uri(uri); - return moo_open_info_new_file (file.gobj(), encoding, line, flags); -} - -/** - * moo_open_info_dup: - * - * Returns: (transfer full) - **/ -MooOpenInfo * -moo_open_info_dup (MooOpenInfo *info) -{ - g_return_val_if_fail(info != nullptr, nullptr); - return new MooOpenInfo(*info); -} - - -/** - * moo_open_info_get_filename: (moo.private 1) - * - * Returns: (type filename) - **/ -char * -moo_open_info_get_filename (MooOpenInfo *info) -{ - g_return_val_if_fail(info != nullptr, nullptr); - return info->file->get_path().release_owned(); -} - -/** - * moo_open_info_get_uri: (moo.private 1) - * - * Returns: (type utf8) - **/ -char * -moo_open_info_get_uri (MooOpenInfo *info) -{ - g_return_val_if_fail(info != nullptr, nullptr); - return info->file->get_uri().release_owned(); -} - -/** - * moo_open_info_get_file: (moo.private 1) - * - * Returns: (transfer full) - **/ -GFile * -moo_open_info_get_file (MooOpenInfo *info) -{ - g_return_val_if_fail(info != nullptr, nullptr); - return info->file->dup().release(); -} - -/** - * moo_open_info_get_encoding: (moo.private 1) - * - * Returns: (type const-utf8) - **/ -const char * -moo_open_info_get_encoding (MooOpenInfo *info) -{ - g_return_val_if_fail(info != nullptr, nullptr); - return info->encoding; -} - -/** - * moo_open_info_set_encoding: (moo.private 1) - * - * @info: - * @encoding: (type const-utf8) (allow-none) - **/ -void -moo_open_info_set_encoding (MooOpenInfo *info, - const char *encoding) -{ - g_return_if_fail(info != nullptr); - info->encoding.set(encoding); -} - -/** - * moo_open_info_get_line: - * - * Returns: (type index) - **/ -int -moo_open_info_get_line (MooOpenInfo *info) -{ - g_return_val_if_fail(info != nullptr, -1); - return info->line; -} - -/** - * moo_open_info_set_line: - * - * @info: - * @line: (type index) - **/ -void -moo_open_info_set_line (MooOpenInfo *info, - int line) -{ - g_return_if_fail(info != nullptr); - info->line = line; -} - -/** - * moo_open_info_get_flags: - **/ -MooOpenFlags -moo_open_info_get_flags (MooOpenInfo *info) -{ - g_return_val_if_fail(info != nullptr, MOO_OPEN_FLAGS_NONE); - return info->flags; -} - -/** - * moo_open_info_set_flags: - **/ -void -moo_open_info_set_flags(MooOpenInfo *info, - MooOpenFlags flags) -{ - g_return_if_fail(info != nullptr); - info->flags = flags; -} - -/** - * moo_open_info_add_flags: - **/ -void -moo_open_info_add_flags(MooOpenInfo *info, - MooOpenFlags flags) -{ - g_return_if_fail(info != nullptr); - info->flags |= flags; -} - - -/** - * moo_save_info_new_file: (static-method-of MooSaveInfo) - * - * @file: - * @encoding: (type const-utf8) (allow-none) (default NULL) - * - * Returns: (transfer full) - **/ -MooSaveInfo * -moo_save_info_new_file(GFile *file, - const char *encoding) -{ - g_return_val_if_fail(G_IS_FILE(file), nullptr); - return new MooSaveInfo(file, encoding); -} - -/** - * moo_save_info_new: (constructor-of MooSaveInfo) - * - * @path: (type const-filename) - * @encoding: (type const-utf8) (allow-none) (default NULL) - * - * Returns: (transfer full) - **/ -MooSaveInfo * -moo_save_info_new(const char *path, - const char *encoding) -{ - auto file = g::File::new_for_path(path); - MooSaveInfo *info = moo_save_info_new_file(file.gobj(), encoding); - return info; -} - -/** - * moo_save_info_new_uri: (static-method-of MooSaveInfo) - * - * @uri: (type const-utf8) - * @encoding: (type const-utf8) (allow-none) (default NULL) - * - * Returns: (transfer full) - **/ -MooSaveInfo * -moo_save_info_new_uri (const char *uri, - const char *encoding) -{ - auto file = g::File::new_for_uri(uri); - MooSaveInfo *info = moo_save_info_new_file(file.gobj(), encoding); - return info; -} - -/** - * moo_save_info_dup: - * - * Returns: (transfer full) - **/ -MooSaveInfo * -moo_save_info_dup (MooSaveInfo *info) -{ - g_return_val_if_fail(info != nullptr, nullptr); - return new MooSaveInfo(*info); -} - - -/** - * moo_reload_info_new: (constructor-of MooReloadInfo) - * - * @encoding: (type const-utf8) (allow-none) (default NULL) - * @line: (type index) (default -1) - **/ -MooReloadInfo * -moo_reload_info_new (const char *encoding, - int line) -{ - return new MooReloadInfo(encoding, line); -} - -/** - * moo_reload_info_dup: - * - * Returns: (transfer full) - **/ -MooReloadInfo * -moo_reload_info_dup (MooReloadInfo *info) -{ - g_return_val_if_fail(info != nullptr, nullptr); - return new MooReloadInfo(*info); -} - -/** - * moo_reload_info_get_line: - * - * Returns: (type index) - **/ -int -moo_reload_info_get_line (MooReloadInfo *info) -{ - g_return_val_if_fail (info != nullptr, -1); - return info->line; -} - -/** - * moo_reload_info_set_line: - * - * @info: - * @line: (type index) - **/ -void -moo_reload_info_set_line (MooReloadInfo *info, - int line) -{ - g_return_if_fail (info != nullptr); - info->line = line; -} diff --git a/moo/mooedit/mooeditfileinfo.h b/moo/mooedit/mooeditfileinfo.h index e114db6e..03717d49 100644 --- a/moo/mooedit/mooeditfileinfo.h +++ b/moo/mooedit/mooeditfileinfo.h @@ -1,7 +1,7 @@ /* * mooeditfileinfo.h * - * Copyright (C) 2004-2016 by Yevgen Muntyan + * Copyright (C) 2004-2010 by Yevgen Muntyan * * This file is part of medit. medit is free software; you can * redistribute it and/or modify it under the terms of the @@ -13,18 +13,42 @@ * License along with medit. If not, see . */ -#pragma once +#ifndef MOO_EDIT_FILE_INFO_H +#define MOO_EDIT_FILE_INFO_H +#include #include -#ifdef __cplusplus -#include -#endif G_BEGIN_DECLS #define MOO_TYPE_OPEN_INFO (moo_open_info_get_type ()) +#define MOO_OPEN_INFO(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), MOO_TYPE_OPEN_INFO, MooOpenInfo)) +#define MOO_OPEN_INFO_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), MOO_TYPE_OPEN_INFO, MooOpenInfoClass)) +#define MOO_IS_OPEN_INFO(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), MOO_TYPE_OPEN_INFO)) +#define MOO_IS_OPEN_INFO_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), MOO_TYPE_OPEN_INFO)) +#define MOO_OPEN_INFO_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), MOO_TYPE_OPEN_INFO, MooOpenInfoClass)) + #define MOO_TYPE_SAVE_INFO (moo_save_info_get_type ()) +#define MOO_SAVE_INFO(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), MOO_TYPE_SAVE_INFO, MooSaveInfo)) +#define MOO_SAVE_INFO_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), MOO_TYPE_SAVE_INFO, MooSaveInfoClass)) +#define MOO_IS_SAVE_INFO(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), MOO_TYPE_SAVE_INFO)) +#define MOO_IS_SAVE_INFO_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), MOO_TYPE_SAVE_INFO)) +#define MOO_SAVE_INFO_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), MOO_TYPE_SAVE_INFO, MooSaveInfoClass)) + #define MOO_TYPE_RELOAD_INFO (moo_reload_info_get_type ()) +#define MOO_RELOAD_INFO(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), MOO_TYPE_RELOAD_INFO, MooReloadInfo)) +#define MOO_RELOAD_INFO_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), MOO_TYPE_RELOAD_INFO, MooReloadInfoClass)) +#define MOO_IS_RELOAD_INFO(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), MOO_TYPE_RELOAD_INFO)) +#define MOO_IS_RELOAD_INFO_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), MOO_TYPE_RELOAD_INFO)) +#define MOO_RELOAD_INFO_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), MOO_TYPE_RELOAD_INFO, MooReloadInfoClass)) + +typedef struct MooOpenInfoClass MooOpenInfoClass; +typedef struct MooSaveInfoClass MooSaveInfoClass; +typedef struct MooReloadInfoClass MooReloadInfoClass; + +GType moo_open_info_get_type (void) G_GNUC_CONST; +GType moo_reload_info_get_type (void) G_GNUC_CONST; +GType moo_save_info_get_type (void) G_GNUC_CONST; MooOpenInfo *moo_open_info_new (const char *path, const char *encoding, @@ -39,6 +63,7 @@ MooOpenInfo *moo_open_info_new_uri (const char *uri, int line, MooOpenFlags flags); MooOpenInfo *moo_open_info_dup (MooOpenInfo *info); +void moo_open_info_free (MooOpenInfo *info); char *moo_open_info_get_filename (MooOpenInfo *info); char *moo_open_info_get_uri (MooOpenInfo *info); @@ -59,6 +84,7 @@ void moo_open_info_add_flags (MooOpenInfo *info, MooReloadInfo *moo_reload_info_new (const char *encoding, int line); MooReloadInfo *moo_reload_info_dup (MooReloadInfo *info); +void moo_reload_info_free (MooReloadInfo *info); int moo_reload_info_get_line (MooReloadInfo *info); void moo_reload_info_set_line (MooReloadInfo *info, @@ -71,5 +97,8 @@ MooSaveInfo *moo_save_info_new_file (GFile *file, MooSaveInfo *moo_save_info_new_uri (const char *uri, const char *encoding); MooSaveInfo *moo_save_info_dup (MooSaveInfo *info); +void moo_save_info_free (MooSaveInfo *info); G_END_DECLS + +#endif /* MOO_EDIT_FILE_INFO_H */ diff --git a/moo/mooedit/mooeditor-impl.h b/moo/mooedit/mooeditor-impl.h index 6f7fc186..8f62b752 100644 --- a/moo/mooedit/mooeditor-impl.h +++ b/moo/mooedit/mooeditor-impl.h @@ -3,6 +3,7 @@ #include "mooedit/mooeditor.h" #include "mooutils/moohistorymgr.h" +#include "mooutils/moofilewatch.h" G_BEGIN_DECLS @@ -14,13 +15,8 @@ void _moo_editor_move_doc (MooEditor *editor, MooEditView *dest_view, gboolean focus); -#ifdef __cplusplus - -class MooFileWatch; MooFileWatch *_moo_editor_get_file_watch (MooEditor *editor); -#endif // __cplusplus - void _moo_editor_apply_prefs (MooEditor *editor); G_END_DECLS diff --git a/moo/mooedit/mooeditor-private.h b/moo/mooedit/mooeditor-private.h index 777f785c..aca3082b 100644 --- a/moo/mooedit/mooeditor-private.h +++ b/moo/mooedit/mooeditor-private.h @@ -1,7 +1,7 @@ /* * mooeditor-private.h * - * Copyright (C) 2004-2015 by Yevgen Muntyan + * Copyright (C) 2004-2010 by Yevgen Muntyan * * This file is part of medit. medit is free software; you can * redistribute it and/or modify it under the terms of the @@ -13,37 +13,46 @@ * License along with medit. If not, see . */ -#pragma once +#ifndef MOO_EDITOR_PRIVATE_H +#define MOO_EDITOR_PRIVATE_H -#include #include "mooedit/mooeditor-impl.h" #include "mooedit/moolangmgr.h" -#include "moocpp/moocpp.h" -enum MooEditorOptions { - MOO_EDITOR_OPTIONS_NONE = 0, +G_BEGIN_DECLS + +typedef enum { OPEN_SINGLE = 1 << 0, ALLOW_EMPTY_WINDOW = 1 << 1, SINGLE_WINDOW = 1 << 2, SAVE_BACKUPS = 1 << 3, STRIP_WHITESPACE = 1 << 4, + EMBEDDED = 1 << 5 +} MooEditorOptions; + +struct MooEditorPrivate { + MooEditArray *windowless; + MooEditWindowArray *windows; + MooUiXml *doc_ui_xml; + MooUiXml *ui_xml; + MooHistoryMgr *history; + MooFileWatch *file_watch; + MooEditorOptions opts; + + GType window_type; + GType doc_type; + + MooLangMgr *lang_mgr; }; +G_END_DECLS + +#ifdef __cplusplus + +#include "mooutils/mooutils-cpp.h" + MOO_DEFINE_FLAGS(MooEditorOptions); -struct MooEditorPrivate { - std::vector windows; - moo::gobj_ptr doc_ui_xml; - moo::gobj_ptr ui_xml; - moo::gobj_ptr history; - moo::gref_ptr file_watch; - MooEditorOptions opts; +#endif // __cplusplus - GType window_type; - GType doc_type; - - moo::gobj_ptr lang_mgr; - - MooEditorPrivate(); - ~MooEditorPrivate(); -}; +#endif /* MOO_EDITOR_PRIVATE_H */ diff --git a/moo/mooedit/mooeditor.cpp b/moo/mooedit/mooeditor.cpp index a6bdd18b..4780341c 100644 --- a/moo/mooedit/mooeditor.cpp +++ b/moo/mooedit/mooeditor.cpp @@ -1,7 +1,7 @@ /* - * mooeditor.cpp + * mooeditor.c * - * Copyright (C) 2004-2016 by Yevgen Muntyan + * Copyright (C) 2004-2010 by Yevgen Muntyan * Copyright (C) 2014 by Ulrich Eckhardt * * This file is part of medit. medit is free software; you can @@ -32,10 +32,9 @@ #include "mooedit/mooedithistoryitem.h" #include "mooedit/mooedit-ui.h" #include "mooedit/medit-ui.h" -#include "moocpp/moocpp.h" -#include "moocpp/gutil.h" #include "mooutils/moomenuaction.h" #include "marshals.h" +#include "mooutils/mooutils-cpp.h" #include "mooutils/mooutils-misc.h" #include "mooutils/mooaction-private.h" #include "mooutils/mooutils-gobject.h" @@ -45,13 +44,10 @@ #include "mooutils/mooi18n.h" #include "mooutils/mooencodings.h" #include "mooutils/moolist.h" -#include "mooutils/moofilewatch.h" #include #include #include -using namespace moo; - #define RECENT_ACTION_ID "OpenRecent" #define RECENT_DIALOG_ACTION_ID "OpenRecentDialog" @@ -70,6 +66,9 @@ static GtkAction *create_open_recent_action (MooWindow *window, static void action_recent_dialog (MooEditWindow *window); static MooEditWindow *create_window (MooEditor *editor); +static void moo_editor_add_doc (MooEditor *editor, + MooEditWindow *window, + MooEdit *doc); static MooSaveResponse moo_editor_before_save (MooEditor *editor, MooEdit *doc, GFile *file); @@ -111,6 +110,7 @@ enum { PROP_SINGLE_WINDOW, PROP_SAVE_BACKUPS, PROP_STRIP_WHITESPACE, + PROP_EMBEDDED }; enum { @@ -133,7 +133,12 @@ G_DEFINE_TYPE (MooEditor, moo_editor, G_TYPE_OBJECT) inline static gboolean test_flag(MooEditor *editor, MooEditorOptions flag) { - return (editor->priv->opts & flag) != MOO_EDITOR_OPTIONS_NONE; + return (editor->priv->opts & flag) != 0; +} + +inline static gboolean is_embedded(MooEditor *editor) +{ + return test_flag(editor, EMBEDDED); } inline static void set_flag(MooEditor *editor, MooEditorOptions flag, gboolean set_or_not) @@ -148,7 +153,7 @@ static void moo_editor_class_init (MooEditorClass *klass) { GObjectClass *gobject_class = G_OBJECT_CLASS (klass); - MooWindowClass *edit_window_class; + G_GNUC_UNUSED MooWindowClass *edit_window_class; gobject_class->constructor = moo_editor_constructor; gobject_class->finalize = moo_editor_finalize; @@ -186,6 +191,10 @@ moo_editor_class_init (MooEditorClass *klass) g_param_spec_boolean ("strip-whitespace", "strip-whitespace", "strip-whitespace", FALSE, (GParamFlags) (G_PARAM_READWRITE | G_PARAM_CONSTRUCT))); + g_object_class_install_property (gobject_class, PROP_EMBEDDED, + g_param_spec_boolean ("embedded", "embedded", "embedded", + FALSE, (GParamFlags) (G_PARAM_READWRITE | G_PARAM_CONSTRUCT))); + signals[BEFORE_CLOSE_WINDOW] = g_signal_new ("before-close-window", G_OBJECT_CLASS_TYPE (klass), @@ -331,36 +340,13 @@ moo_editor_class_init (MooEditorClass *klass) add_new_window_action (); } -MooEditorPrivate::MooEditorPrivate() -{ - // zero-initialized when allocated with the GObject -} - -MooEditorPrivate::~MooEditorPrivate() -{ - if (file_watch) - { - GError *error = NULL; - - if (!file_watch->close (&error)) - { - g_warning ("error in moo_file_watch_close: %s", moo_error_message (error)); - g_error_free (error); - error = NULL; - } - - file_watch.reset(); - } - - if (!windows.empty()) - g_critical ("finalizing editor while some windows are open"); -} - static void moo_editor_init (MooEditor *editor) { - init_cpp_private(editor, editor->priv, MOO_TYPE_EDITOR); + editor->priv = G_TYPE_INSTANCE_GET_PRIVATE (editor, MOO_TYPE_EDITOR, MooEditorPrivate); + editor->priv->windows = moo_edit_window_array_new (); + editor->priv->windowless = moo_edit_array_new (); } static GObject * @@ -376,19 +362,21 @@ moo_editor_constructor (GType type, _moo_stock_init (); - editor->priv->doc_ui_xml.set_new(moo_ui_xml_new()); - moo_ui_xml_add_ui_from_string (editor->priv->doc_ui_xml.gobj(), + editor->priv->doc_ui_xml = moo_ui_xml_new (); + moo_ui_xml_add_ui_from_string (editor->priv->doc_ui_xml, mooedit_ui_xml, -1); - editor->priv->lang_mgr.ref(moo_lang_mgr_default()); - g_signal_connect_swapped (editor->priv->lang_mgr.gobj(), "loaded", + editor->priv->lang_mgr = moo_object_ref (moo_lang_mgr_default ()); + g_signal_connect_swapped (editor->priv->lang_mgr, "loaded", G_CALLBACK (_moo_editor_apply_prefs), editor); - editor->priv->history.set_new(MOO_HISTORY_MGR ( - g_object_new (MOO_TYPE_HISTORY_MGR, - "name", "Editor", - (const char*) NULL))); + editor->priv->history = NULL; + if (!is_embedded (editor)) + editor->priv->history = MOO_HISTORY_MGR ( + g_object_new (MOO_TYPE_HISTORY_MGR, + "name", "Editor", + (const char*) NULL)); _moo_edit_filter_settings_load (); _moo_editor_apply_prefs (editor); @@ -426,6 +414,10 @@ moo_editor_set_property (GObject *object, set_flag (editor, STRIP_WHITESPACE, g_value_get_boolean (value)); break; + case PROP_EMBEDDED: + set_flag (editor, EMBEDDED, g_value_get_boolean (value)); + break; + default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -462,6 +454,10 @@ moo_editor_get_property (GObject *object, g_value_set_boolean (value, test_flag (editor, STRIP_WHITESPACE)); break; + case PROP_EMBEDDED: + g_value_set_boolean (value, test_flag (editor, EMBEDDED)); + break; + default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -477,7 +473,34 @@ moo_editor_finalize (GObject *object) if (editor_instance == editor) editor_instance = NULL; - finalize_cpp_private(editor, editor->priv); + if (editor->priv->ui_xml) + g_object_unref (editor->priv->ui_xml); + if (editor->priv->history) + g_object_unref (editor->priv->history); + g_object_unref (editor->priv->lang_mgr); + g_object_unref (editor->priv->doc_ui_xml); + + if (editor->priv->file_watch) + { + GError *error = NULL; + + if (!moo_file_watch_close (editor->priv->file_watch, &error)) + { + g_warning ("error in moo_file_watch_close: %s", moo_error_message (error)); + g_error_free (error); + error = NULL; + } + + moo_file_watch_unref (editor->priv->file_watch); + } + + if (editor->priv->windows->n_elms) + g_critical ("finalizing editor while some windows are open"); + if (editor->priv->windowless->n_elms) + g_critical ("finalizing editor while some documents are open"); + + moo_edit_window_array_free (editor->priv->windows); + moo_edit_array_free (editor->priv->windowless); G_OBJECT_CLASS (moo_editor_parent_class)->finalize (object); } @@ -489,23 +512,26 @@ _moo_editor_get_file_watch (MooEditor *editor) g_return_val_if_fail (MOO_IS_EDITOR (editor), NULL); if (!editor->priv->file_watch) - editor->priv->file_watch = MooFileWatch::create(nullptr); + editor->priv->file_watch = moo_file_watch_new (NULL); - return editor->priv->file_watch.gobj(); + return editor->priv->file_watch; } /** * moo_editor_create_instance: (static-method-of MooEditor) (moo.lua 0) * + * @embedded: (default TRUE): + * * Returns: (transfer full) */ MooEditor * -moo_editor_create_instance () +moo_editor_create_instance (gboolean embedded) { if (!editor_instance) { editor_instance = MOO_EDITOR (g_object_new (MOO_TYPE_EDITOR, + "embedded", embedded, (const char*) NULL)); g_object_add_weak_pointer (G_OBJECT (editor_instance), reinterpret_cast (&editor_instance)); } @@ -593,19 +619,20 @@ static MooEditWindow * get_top_window (MooEditor *editor) { GtkWindow *window; + GSList *window_list; + guint i; - if (editor->priv->windows.empty()) + if (moo_edit_window_array_is_empty (editor->priv->windows)) return NULL; - GSList *window_list = nullptr; - for (const auto& w: editor->priv->windows) - window_list = g_slist_prepend (window_list, w); + for (window_list = NULL, i = 0; i < editor->priv->windows->n_elms; ++i) + window_list = g_slist_prepend (window_list, editor->priv->windows->elms[i]); window_list = g_slist_reverse (window_list); window = _moo_get_top_window (window_list); if (!window) - window = GTK_WINDOW (editor->priv->windows[0]); + window = GTK_WINDOW (editor->priv->windows->elms[0]); g_slist_free (window_list); @@ -623,11 +650,11 @@ moo_editor_get_ui_xml (MooEditor *editor) if (!editor->priv->ui_xml) { - editor->priv->ui_xml.set_new(moo_ui_xml_new ()); - moo_ui_xml_add_ui_from_string (editor->priv->ui_xml.gobj(), medit_ui_xml, -1); + editor->priv->ui_xml = moo_ui_xml_new (); + moo_ui_xml_add_ui_from_string (editor->priv->ui_xml, medit_ui_xml, -1); } - return editor->priv->ui_xml.gobj(); + return editor->priv->ui_xml; } @@ -638,7 +665,7 @@ MooUiXml * moo_editor_get_doc_ui_xml (MooEditor *editor) { g_return_val_if_fail (MOO_IS_EDITOR (editor), NULL); - return editor->priv->doc_ui_xml.gobj(); + return editor->priv->doc_ui_xml; } @@ -649,16 +676,25 @@ void moo_editor_set_ui_xml (MooEditor *editor, MooUiXml *xml) { + guint i; + g_return_if_fail (MOO_IS_EDITOR (editor)); g_return_if_fail (MOO_IS_UI_XML (xml)); if (editor->priv->ui_xml == xml) return; - editor->priv->ui_xml.ref(xml); + if (editor->priv->ui_xml) + g_object_unref (editor->priv->ui_xml); - for (const auto& window: editor->priv->windows) - moo_window_set_ui_xml (MOO_WINDOW (window), editor->priv->ui_xml.gobj()); + editor->priv->ui_xml = xml; + + if (editor->priv->ui_xml) + g_object_ref (editor->priv->ui_xml); + + for (i = 0; i < editor->priv->windows->n_elms; ++i) + moo_window_set_ui_xml (MOO_WINDOW (editor->priv->windows->elms[i]), + editor->priv->ui_xml); } @@ -666,14 +702,15 @@ MooHistoryMgr * _moo_editor_get_history_mgr (MooEditor *editor) { g_return_val_if_fail (MOO_IS_EDITOR (editor), NULL); - return editor->priv->history.gobj(); + return editor->priv->history; } // static void // add_recent_uri (MooEditor *editor, // const char *uri) // { -// moo_history_mgr_add_uri (editor->priv->history, uri); +// if (!is_embedded (editor)) +// moo_history_mgr_add_uri (editor->priv->history, uri); // } static void @@ -699,7 +736,7 @@ recent_item_activated (GSList *items, encoding = _moo_edit_history_item_get_encoding (item); if (!moo_editor_open_uri (editor, uri, encoding, -1, window)) - moo_history_mgr_remove_uri (editor->priv->history.gobj(), uri); + moo_history_mgr_remove_uri (editor->priv->history, uri); g_free (filename); @@ -719,11 +756,11 @@ create_recent_menu (GtkAction *action) g_return_val_if_fail (MOO_IS_EDIT_WINDOW (window), NULL); editor = moo_editor_instance (); - menu = moo_history_mgr_create_menu (editor->priv->history.gobj(), - recent_item_activated, - window, NULL); + menu = moo_history_mgr_create_menu (editor->priv->history, + recent_item_activated, + window, NULL); moo_bind_bool_property (action, - "sensitive", editor->priv->history.gobj(), + "sensitive", editor->priv->history, "empty", TRUE); item = gtk_separator_menu_item_new (); @@ -761,9 +798,9 @@ action_recent_dialog (MooEditWindow *window) editor = moo_editor_instance (); g_return_if_fail (MOO_IS_EDITOR (editor)); - dialog = moo_history_mgr_create_dialog (editor->priv->history.gobj(), - recent_item_activated, - window, NULL); + dialog = moo_history_mgr_create_dialog (editor->priv->history, + recent_item_activated, + window, NULL); gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (window)); _moo_window_set_remember_size (GTK_WINDOW (dialog), moo_edit_setting (MOO_EDIT_PREFS_DIALOGS "/recent-files"), @@ -785,14 +822,23 @@ create_window (MooEditor *editor) "editor", editor, "ui-xml", moo_editor_get_ui_xml (editor), (const char*) NULL)); - - editor->priv->windows.emplace_back(window); + moo_edit_window_array_append (editor->priv->windows, window); _moo_window_attach_plugins (window); gtk_widget_show (GTK_WIDGET (window)); return window; } +static void +moo_editor_add_doc (MooEditor *editor, + MooEditWindow *window, + MooEdit *doc) +{ + if (!window) + moo_edit_array_append (editor->priv->windowless, doc); +} + + /** * moo_editor_new_window: */ @@ -810,6 +856,7 @@ moo_editor_new_window (MooEditor *editor) { doc = MOO_EDIT (g_object_new (get_doc_type (editor), "editor", editor, (const char*) NULL)); _moo_edit_window_insert_doc (window, doc, NULL); + moo_editor_add_doc (editor, window, doc); g_object_unref (doc); } @@ -817,6 +864,40 @@ moo_editor_new_window (MooEditor *editor) } +// /* this creates MooEdit instance which can not be put into a window */ +// MooEdit * +// moo_editor_create_doc (MooEditor *editor, +// const char *filename, +// const char *encoding, +// GError **error) +// { +// MooEdit *doc; +// GFile *file = NULL; +// +// g_return_val_if_fail (MOO_IS_EDITOR (editor), NULL); +// +// doc = MOO_EDIT (g_object_new (get_doc_type (editor), "editor", editor, (const char*) NULL)); +// +// if (filename) +// file = g_file_new_for_path (filename); +// +// if (file && !_moo_edit_load_file (doc, file, encoding, NULL, error)) +// { +// g_object_ref_sink (doc); +// g_object_unref (file); +// g_object_unref (doc); +// return NULL; +// } +// +// moo_editor_add_doc (editor, NULL, doc); +// _moo_doc_attach_plugins (NULL, doc); +// +// g_object_unref (file); +// +// return doc; +// } + + /** * moo_editor_new_doc: * @@ -842,6 +923,7 @@ moo_editor_new_doc (MooEditor *editor, doc = MOO_EDIT (g_object_new (get_doc_type (editor), "editor", editor, (const char*) NULL)); _moo_edit_window_insert_doc (window, doc, NULL); + moo_editor_add_doc (editor, window, doc); g_object_unref (doc); if (moo_prefs_get_bool (moo_edit_setting (MOO_EDIT_PREFS_AUTO_SYNC))) @@ -894,6 +976,7 @@ _moo_editor_move_doc (MooEditor *editor, } _moo_edit_window_insert_tab (dest, tab, dest_view); + moo_editor_add_doc (editor, dest, doc); dest_doc = dest_view ? moo_edit_view_get_doc (dest_view) : NULL; if (dest_doc && moo_edit_is_empty (dest_doc)) @@ -918,6 +1001,9 @@ update_history_item_for_doc (MooEditor *editor, const char *enc; MooEditView *view; + if (is_embedded (editor)) + return; + if (!(uri = moo_edit_get_uri (doc))) return; @@ -933,40 +1019,44 @@ update_history_item_for_doc (MooEditor *editor, _moo_edit_history_item_set_encoding (item, enc); if (add) - moo_history_mgr_add_file (editor->priv->history.gobj(), item); + moo_history_mgr_add_file (editor->priv->history, item); else - moo_history_mgr_update_file (editor->priv->history.gobj(), item); + moo_history_mgr_update_file (editor->priv->history, item); moo_history_item_free (item); g_free (uri); } -static EditPtr -moo_editor_load_file(MooEditor *editor, - MooOpenInfo *info, - MooEditWindow *window, - GtkWidget *parent, - gboolean silent, - gboolean add_history, - gerrp& error) +static MooEdit * +moo_editor_load_file (MooEditor *editor, + MooOpenInfo *info, + MooEditWindow *window, + GtkWidget *parent, + gboolean silent, + gboolean add_history, + GError **error) { + MooEdit *doc; MooEditView *view = NULL; gboolean new_doc = FALSE; gboolean new_object = FALSE; const char *recent_encoding = NULL; - gerrp error_here; + GError *error_here = NULL; gboolean success = TRUE; + char *uri; + char *filename; + int line; - moo_return_error_if_fail_p(MOO_IS_EDITOR(editor)); - moo_return_error_if_fail_p(info != NULL && info->file != nullptr); + moo_return_error_if_fail_p (MOO_IS_EDITOR (editor)); + moo_return_error_if_fail_p (info != NULL && G_IS_FILE (info->file)); - gstr uri = info->file->get_uri(); - gstr filename = info->file->get_path(); - int line = info->line; - EditPtr doc = wrap(moo_editor_get_doc_for_file(editor, info->file.gobj())); + uri = g_file_get_uri (info->file); + filename = g_file_get_path (info->file); + line = info->line; + doc = moo_editor_get_doc_for_file (editor, info->file); - if (filename.empty()) + if (!filename) { g_set_error (&error_here, MOO_EDIT_FILE_ERROR, MOO_EDIT_FILE_ERROR_NOT_IMPLEMENTED, @@ -983,9 +1073,9 @@ moo_editor_load_file(MooEditor *editor, if (window) { - doc = wrap (moo_edit_window_get_active_doc (window)); + doc = moo_edit_window_get_active_doc (window); - if (doc && !moo_edit_is_empty (doc.gobj())) + if (doc && !moo_edit_is_empty (doc)) doc = NULL; } } @@ -993,19 +1083,19 @@ moo_editor_load_file(MooEditor *editor, if (success && !doc) { new_object = TRUE; - doc = wrap_new(MOO_EDIT(g_object_new(get_doc_type(editor), "editor", editor, nullptr))); + doc = MOO_EDIT (g_object_new (get_doc_type (editor), "editor", editor, (const char*) NULL)); } if (success) { - view = moo_edit_get_view (doc.gobj()); + view = moo_edit_get_view (doc); - if (!new_doc && line < 0 && (info->flags & MOO_OPEN_FLAG_RELOAD) != MOO_OPEN_FLAGS_NONE) + if (!new_doc && line < 0 && (info->flags & MOO_OPEN_FLAG_RELOAD) != 0) line = moo_text_view_get_cursor_line (GTK_TEXT_VIEW (view)); - if (info->encoding.empty()) + if (!info->encoding) { - MooHistoryItem *hist_item = moo_history_mgr_find_uri (editor->priv->history.gobj(), uri); + MooHistoryItem *hist_item = moo_history_mgr_find_uri (editor->priv->history, uri); if (hist_item) recent_encoding = _moo_edit_history_item_get_encoding (hist_item); } @@ -1013,18 +1103,14 @@ moo_editor_load_file(MooEditor *editor, if (success && new_doc) { - if ((info->flags & MOO_OPEN_FLAG_CREATE_NEW) && _moo_edit_file_is_new(*info->file)) + if ((info->flags & MOO_OPEN_FLAG_CREATE_NEW) && _moo_edit_file_is_new (info->file)) { - doc->_set_status(MOO_EDIT_STATUS_NEW); - doc->_set_file(info->file.gobj(), info->encoding); + _moo_edit_set_status (doc, MOO_EDIT_STATUS_NEW); + _moo_edit_set_file (doc, info->file, info->encoding); } else { - // XXX - success = _moo_edit_load_file(*doc, *info->file, - info->encoding, - gstr::wrap(recent_encoding), - error_here); + success = _moo_edit_load_file (doc, info->file, info->encoding, recent_encoding, &error_here); } } @@ -1036,20 +1122,22 @@ moo_editor_load_file(MooEditor *editor, window = moo_editor_get_active_window (editor); if (!parent && window) parent = GTK_WIDGET (window); - _moo_edit_open_error_dialog(parent, info->file, error_here.get()); + _moo_edit_open_error_dialog (parent, info->file, error_here); } - error = std::move (error_here); + g_propagate_error (error, error_here); + error_here = NULL; } else if (!new_doc && (info->flags & MOO_OPEN_FLAG_RELOAD)) { - success = _moo_edit_reload_file(*doc, info->encoding, error_here); + success = _moo_edit_reload_file (doc, info->encoding, &error_here); if (!success) { if (!silent && !_moo_is_file_error_cancelled (error_here)) - _moo_edit_reload_error_dialog (doc.gobj(), error_here.get()); - error = std::move (error_here); + _moo_edit_reload_error_dialog (doc, error_here); + g_propagate_error (error, error_here); + error_here = NULL; } } @@ -1058,7 +1146,8 @@ moo_editor_load_file(MooEditor *editor, if (!window || (info->flags & MOO_OPEN_FLAG_NEW_WINDOW)) window = create_window (editor); - _moo_edit_window_insert_doc (window, doc.gobj(), NULL); + _moo_edit_window_insert_doc (window, doc, NULL); + moo_editor_add_doc (editor, window, doc); } if (success) @@ -1067,7 +1156,7 @@ moo_editor_load_file(MooEditor *editor, if (line < 0 && new_doc) { - hist_item = moo_history_mgr_find_uri (editor->priv->history.gobj(), uri); + hist_item = moo_history_mgr_find_uri (editor->priv->history, uri); if (hist_item) line = _moo_edit_history_item_get_line (hist_item); } @@ -1077,15 +1166,20 @@ moo_editor_load_file(MooEditor *editor, } if (success && add_history) - update_history_item_for_doc (editor, doc.gobj(), TRUE); + update_history_item_for_doc (editor, doc, TRUE); if (success) { - moo_editor_set_active_doc (editor, doc.gobj()); + moo_editor_set_active_doc (editor, doc); gtk_widget_grab_focus (GTK_WIDGET (view)); } - return success ? std::move(doc) : nullptr; + if (new_object) + g_object_unref (doc); + + g_free (filename); + g_free (uri); + return success ? doc : NULL; } // static MooEdit * @@ -1194,10 +1288,10 @@ moo_editor_load_file(MooEditor *editor, // } static MooEditArray * -_moo_editor_open_files (MooEditor* editor, - MooOpenInfoArray* files, - GtkWidget* parent, - gerrp& error) +_moo_editor_open_files (MooEditor *editor, + MooOpenInfoArray *files, + GtkWidget *parent, + GError **error) { guint i; MooEdit *bring_to_front = NULL; @@ -1221,18 +1315,19 @@ _moo_editor_open_files (MooEditor* editor, for (i = 0; i < files->n_elms; ++i) { MooOpenInfo *info = files->elms[i]; + MooEdit *doc = NULL; if (!window) window = moo_editor_get_active_window (editor); - EditPtr doc = moo_editor_load_file(editor, info, window, parent, - FALSE, TRUE, error); + doc = moo_editor_load_file (editor, info, window, parent, + is_embedded (editor), TRUE, error); if (doc) { - parent = GTK_WIDGET (moo_edit_get_view (doc.gobj())); - bring_to_front = doc.gobj(); - moo_edit_array_append (docs, doc.gobj()); + parent = GTK_WIDGET (moo_edit_get_view (doc)); + bring_to_front = doc; + moo_edit_array_append (docs, doc); } else { @@ -1353,7 +1448,7 @@ find_busy (MooEditArray *docs) { guint i; for (i = 0; i < docs->n_elms; ++i) - if (Edit(*docs->elms[i])._is_busy()) + if (MOO_EDIT_IS_BUSY (docs->elms[i])) return docs->elms[i]; return NULL; } @@ -1460,17 +1555,17 @@ moo_editor_close_window (MooEditor *editor, g_return_val_if_fail (MOO_IS_EDITOR (editor), FALSE); g_return_val_if_fail (MOO_IS_EDIT_WINDOW (window), FALSE); - if (!contains(editor->priv->windows, window)) + if (moo_edit_window_array_find (editor->priv->windows, window) < 0) return TRUE; g_object_ref (window); g_signal_emit_by_name (window, "before-close", &response); - if (response != MOO_CLOSE_RESPONSE_CANCEL && contains(editor->priv->windows, window)) + if (response != MOO_CLOSE_RESPONSE_CANCEL && moo_edit_window_array_find (editor->priv->windows, window) >= 0) g_signal_emit (editor, signals[BEFORE_CLOSE_WINDOW], 0, window, &response); - if (response != MOO_CLOSE_RESPONSE_CANCEL && contains(editor->priv->windows, window)) + if (response != MOO_CLOSE_RESPONSE_CANCEL && moo_edit_window_array_find (editor->priv->windows, window) >= 0) do_close_window (editor, window); g_object_unref (window); @@ -1494,7 +1589,7 @@ do_close_window (MooEditor *editor, for (i = 0; i < docs->n_elms; ++i) do_close_doc (editor, docs->elms[i]); - remove(editor->priv->windows, window); + moo_edit_window_array_remove (editor->priv->windows, window); _moo_window_detach_plugins (window); gtk_widget_destroy (GTK_WIDGET (window)); @@ -1511,22 +1606,28 @@ do_close_doc (MooEditor *editor, { MooEditWindow *window; - EditPtr docp = wrap(doc); // get a reference so it doesn't get destroyed below + g_object_ref (doc); - g_signal_emit(editor, signals[WILL_CLOSE_DOC], 0, doc); - g_signal_emit_by_name(doc, "will-close"); + g_signal_emit (editor, signals[WILL_CLOSE_DOC], 0, doc); + g_signal_emit_by_name (doc, "will-close"); - window = moo_edit_get_window(doc); - g_assert(window); + window = moo_edit_get_window (doc); - update_history_item_for_doc(editor, doc, TRUE); + if (!window) + { + g_assert (moo_edit_array_find (editor->priv->windowless, doc) >= 0); + moo_edit_array_remove (editor->priv->windowless, doc); + } + + update_history_item_for_doc (editor, doc, TRUE); if (window) - _moo_edit_window_remove_doc(window, doc); + _moo_edit_window_remove_doc (window, doc); else - _moo_doc_detach_plugins(NULL, doc); + _moo_doc_detach_plugins (NULL, doc); - docp->_closed(); + _moo_edit_closed (doc); + g_object_unref (doc); } @@ -1569,7 +1670,7 @@ moo_editor_close_docs (MooEditor *editor, g_return_val_if_fail (MOO_IS_EDIT (doc), FALSE); - if (Edit(*doc)._is_busy()) + if (MOO_EDIT_IS_BUSY (doc)) { moo_editor_set_active_doc (editor, doc); return FALSE; @@ -1588,6 +1689,7 @@ moo_editor_close_docs (MooEditor *editor, "editor", editor, (const char*) NULL)); _moo_edit_window_insert_doc (window, doc, NULL); + moo_editor_add_doc (editor, window, doc); g_object_unref (doc); } @@ -1719,33 +1821,73 @@ _moo_editor_close_all (MooEditor *editor) } -static EditPtr +/* Remove after March 2009 */ +static char * +filename_from_utf8 (const char *encoded) +{ + if (g_str_has_prefix (encoded, "base64")) + { + guchar *filename; + gsize len; + + filename = g_base64_decode (encoded + strlen ("base64"), &len); + + if (!filename || !len || filename[len-1] != 0) + { + g_critical ("oops"); + return NULL; + } + + return (char*) filename; + } + else + { + return g_strdup (encoded); + } +} + +static MooEdit * load_doc_session (MooEditor *editor, MooEditWindow *window, MooMarkupNode *elm, gboolean file_is_uri) { - gstr uri; + const char *uri = NULL; + const char *encoding; + char *freeme = NULL; + MooEdit *doc = NULL; + MooOpenInfo *info; if (file_is_uri) { - uri = gstr::wrap(moo_markup_get_content(elm)); + uri = moo_markup_get_content (elm); } else { - const char *filename = moo_markup_get_content (elm); + const char *filename_utf8 = moo_markup_get_content (elm); + char *filename = filename_from_utf8 (filename_utf8); if (filename) - uri = g::filename_to_uri(filename); + { + freeme = g_filename_to_uri (filename, NULL, NULL); + uri = freeme; + } + g_free (filename); } - if (uri.empty()) - return EditPtr::wrap(moo_editor_new_doc(editor, window)); + if (!uri || !uri[0]) + { + g_free (freeme); + return moo_editor_new_doc (editor, window); + } - const char *encoding = moo_markup_get_prop (elm, "encoding"); - std::unique_ptr info(moo_open_info_new_uri(uri, encoding, -1, MOO_OPEN_FLAGS_NONE)); + encoding = moo_markup_get_prop (elm, "encoding"); + info = moo_open_info_new_uri (uri, encoding, -1, MOO_OPEN_FLAGS_NONE); - gerrp ignored; - return moo_editor_load_file(editor, info.get(), window, GTK_WIDGET(window), TRUE, FALSE, ignored); + doc = moo_editor_load_file (editor, info, window, GTK_WIDGET (window), TRUE, FALSE, NULL); + + g_object_unref (info); + g_free (freeme); + return doc; } static MooMarkupNode * @@ -1790,10 +1932,12 @@ load_window_session (MooEditor *editor, { if (MOO_MARKUP_IS_ELEMENT (node)) { - EditPtr doc = load_doc_session (editor, window, node, file_is_uri); + MooEdit *doc; + + doc = load_doc_session (editor, window, node, file_is_uri); if (doc && moo_markup_bool_prop (node, "active", FALSE)) - active_doc = doc.gobj(); + active_doc = doc; } } @@ -1918,16 +2062,7 @@ MooEditWindowArray * moo_editor_get_windows (MooEditor *editor) { g_return_val_if_fail (MOO_IS_EDITOR (editor), NULL); - - MooEditWindowArray* copy = moo_edit_window_array_new (); - MOO_IP_ARRAY_GROW (MooEditWindow*, copy, elms, editor->priv->windows.size()); - gsize i = 0; - for (const auto& window: editor->priv->windows) - { - copy->elms[i++] = MOO_EDIT_WINDOW(g_object_ref(window)); - } - - return copy; + return moo_edit_window_array_copy (editor->priv->windows); } /** @@ -1938,19 +2073,22 @@ moo_editor_get_windows (MooEditor *editor) MooEditArray * moo_editor_get_docs (MooEditor *editor) { + guint i; MooEditArray *docs; g_return_val_if_fail (MOO_IS_EDITOR (editor), NULL); docs = moo_edit_array_new (); - for (const auto& window: editor->priv->windows) + for (i = 0; i < editor->priv->windows->n_elms; ++i) { - MooEditArray *docs_here = moo_edit_window_get_docs (window); + MooEditArray *docs_here = moo_edit_window_get_docs (editor->priv->windows->elms[i]); moo_edit_array_append_array (docs, docs_here); moo_edit_array_free (docs_here); } + moo_edit_array_append_array (docs, editor->priv->windowless); + return docs; } @@ -1975,9 +2113,7 @@ moo_editor_open_files (MooEditor *editor, moo_return_error_if_fail (MOO_IS_EDITOR (editor)); moo_return_error_if_fail (!moo_open_info_array_is_empty (files)); - gerrp error_here(error); - docs = _moo_editor_open_files (editor, files, parent, error_here); - + docs = _moo_editor_open_files (editor, files, parent, error); ret = !moo_edit_array_is_empty (docs); moo_assert (moo_edit_array_is_empty (docs) || @@ -2003,15 +2139,19 @@ moo_editor_new_file (MooEditor *editor, GError **error) { MooEdit *doc; + MooOpenInfo *info_copy; moo_return_error_if_fail_p (MOO_IS_EDITOR (editor)); - moo_return_error_if_fail_p (info != nullptr); + moo_return_error_if_fail_p (info != NULL); + + info_copy = moo_open_info_dup (info); + moo_return_error_if_fail_p (info_copy != NULL); - std::unique_ptr info_copy (moo_open_info_dup (info)); info_copy->flags |= MOO_OPEN_FLAG_CREATE_NEW; - doc = moo_editor_open_file (editor, info_copy.get (), parent, error); + doc = moo_editor_open_file (editor, info_copy, parent, error); + g_object_unref (info_copy); return doc; } @@ -2038,8 +2178,7 @@ moo_editor_open_file (MooEditor *editor, files = moo_open_info_array_new (); moo_open_info_array_append (files, info); - gerrp error_here(error); - docs = _moo_editor_open_files (editor, files, parent, error_here); + docs = _moo_editor_open_files (editor, files, parent, error); moo_open_info_array_free (files); @@ -2069,8 +2208,16 @@ moo_editor_open_uri (MooEditor *editor, int line, MooEditWindow *window) { - std::unique_ptr info (moo_open_info_new_uri (uri, encoding, line, MOO_OPEN_FLAGS_NONE)); - return moo_editor_open_file (editor, info.get(), window ? GTK_WIDGET (window) : NULL, NULL); + MooEdit *ret; + MooOpenInfo *info; + + info = moo_open_info_new_uri (uri, encoding, line, MOO_OPEN_FLAGS_NONE); + g_return_val_if_fail (info != NULL, NULL); + + ret = moo_editor_open_file (editor, info, window ? GTK_WIDGET (window) : NULL, NULL); + + g_object_unref (info); + return ret; } /** @@ -2089,10 +2236,62 @@ moo_editor_open_path (MooEditor *editor, int line, MooEditWindow *window) { - std::unique_ptr info (moo_open_info_new (path, encoding, line, MOO_OPEN_FLAGS_NONE)); - return moo_editor_open_file (editor, info.get(), window ? GTK_WIDGET (window) : NULL, NULL); + MooEdit *ret; + MooOpenInfo *info; + + info = moo_open_info_new (path, encoding, line, MOO_OPEN_FLAGS_NONE); + g_return_val_if_fail (info != NULL, NULL); + + ret = moo_editor_open_file (editor, info, window ? GTK_WIDGET (window) : NULL, NULL); + + g_object_unref (info); + return ret; } +/** + * moo_editor_create_doc: (moo.lua 0) + * + * @editor: + * @filename: (type const-filename) (allow-none) (default NULL) + * @encoding: (type const-utf8) (allow-none) (default NULL) + * @error: + * + * Create a document instance which can be embedded into arbitrary + * widget. + * + * This method may not be used in medit (use moo_editor_new_doc(), + * moo_editor_new_file(), moo_editor_open_file(), moo_editor_open_files(), + * moo_editor_open_uri(), moo_editor_open_path() instead). + */ +MooEdit * +moo_editor_create_doc (MooEditor *editor, + const char *filename, + const char *encoding, + GError **error) +{ + MooEdit *doc; + GFile *file = NULL; + + moo_return_error_if_fail_p (MOO_IS_EDITOR (editor)); + + if (filename) + file = g_file_new_for_path (filename); + + doc = MOO_EDIT (g_object_new (get_doc_type (editor), "editor", editor, (const char*) NULL)); + + if (file == NULL || _moo_edit_load_file (doc, file, encoding, NULL, error)) + { + moo_editor_add_doc (editor, NULL, doc); + } + else + { + g_object_unref (doc); + doc = NULL; + } + + moo_file_free (file); + return doc; +} // MooEdit * // moo_editor_open_file (MooEditor *editor, @@ -2162,7 +2361,8 @@ moo_editor_open_path (MooEditor *editor, // // fenc = moo_file_enc_new_for_path (filename, NULL); // moo_editor_load_file (editor, window, NULL, fenc, -// FALSE, TRUE, line, &doc); +// is_embedded (editor), +// TRUE, line, &doc); // // /* XXX */ // moo_editor_set_active_doc (editor, doc); @@ -2318,18 +2518,18 @@ gboolean moo_editor_reload (MooEditor *editor, MooEdit *doc, MooReloadInfo *info, - GError **errorp) + GError **error) { guint i; - gerrp error(errorp); + GError *error_here = NULL; MooEditViewArray *views = NULL; gboolean ret = FALSE; moo_return_error_if_fail (MOO_IS_EDITOR (editor)); - if (Edit(*doc)._is_busy()) + if (MOO_EDIT_IS_BUSY (doc)) { - g_set_error (&error, + g_set_error (error, MOO_EDIT_RELOAD_ERROR, MOO_EDIT_RELOAD_ERROR_BUSY, "document is busy"); @@ -2338,18 +2538,19 @@ moo_editor_reload (MooEditor *editor, if (moo_edit_is_untitled (doc)) { - g_set_error (&error, + g_set_error (error, MOO_EDIT_RELOAD_ERROR, MOO_EDIT_RELOAD_ERROR_UNTITLED, "document is untitled"); goto out; } - if (!moo_edit_get_clean (doc) && + if (!is_embedded (editor) && + !moo_edit_get_clean (doc) && moo_edit_is_modified (doc) && !_moo_edit_reload_modified_dialog (doc)) { - g_set_error (&error, + g_set_error (error, MOO_EDIT_RELOAD_ERROR, MOO_EDIT_RELOAD_ERROR_CANCELLED, "cancelled by user"); @@ -2378,10 +2579,12 @@ moo_editor_reload (MooEditor *editor, g_object_set_data (G_OBJECT (view), "moo-reload-cursor-offset", GINT_TO_POINTER (cursor_offset)); } - if (!_moo_edit_reload_file(*doc, info ? (const char*) info->encoding : nullptr, error)) + if (!_moo_edit_reload_file (doc, info ? info->encoding : NULL, &error_here)) { - if (!_moo_is_file_error_cancelled (error)) - _moo_edit_reload_error_dialog (doc, error.get()); + if (!is_embedded (editor) && !_moo_is_file_error_cancelled (error_here)) + _moo_edit_reload_error_dialog (doc, error_here); + + g_propagate_error (error, error_here); g_object_set_data (G_OBJECT (doc), "moo-scroll-to", NULL); goto out; @@ -2431,78 +2634,79 @@ moo_editor_will_save (G_GNUC_UNUSED MooEditor *editor, MooEdit *doc, G_GNUC_UNUSED GFile *file) { - g_return_if_fail(doc != nullptr); if (moo_edit_config_get_bool (doc->config, "strip")) - Edit(*doc)._strip_whitespace(); + _moo_edit_strip_whitespace (doc); if (moo_edit_config_get_bool (doc->config, "add-newline")) - Edit(*doc)._ensure_newline(); + _moo_edit_ensure_newline (doc); } -static bool -do_save(MooEditor& editor, - Edit doc, - g::File file, - const char* encoding, - gerrp& error) +static gboolean +do_save (MooEditor *editor, + MooEdit *doc, + GFile *file, + const char *encoding, + GError **error) { int response = MOO_SAVE_RESPONSE_CONTINUE; - gerrp error_here; + GError *error_here = NULL; gboolean result; - g_signal_emit (&editor, signals[BEFORE_SAVE], 0, doc.gobj (), file.gobj (), &response); + g_signal_emit (editor, signals[BEFORE_SAVE], 0, doc, file, &response); if (response != MOO_SAVE_RESPONSE_CANCEL) - doc.signal_emit_by_name ("before-save", file.gobj (), &response); + g_signal_emit_by_name (doc, "before-save", file, &response); if (response == MOO_SAVE_RESPONSE_CANCEL) { - g_set_error(&error, - MOO_EDIT_SAVE_ERROR, - MOO_EDIT_SAVE_ERROR_CANCELLED, - "cancelled"); + g_set_error (error, + MOO_EDIT_SAVE_ERROR, + MOO_EDIT_SAVE_ERROR_CANCELLED, + "cancelled"); return FALSE; } - g_signal_emit (&editor, signals[WILL_SAVE], 0, doc.gobj (), file.gobj ()); - doc.signal_emit_by_name ("will-save", file.gobj ()); + g_signal_emit (editor, signals[WILL_SAVE], 0, doc, file); + g_signal_emit_by_name (doc, "will-save", file); - result = _moo_edit_save_file(doc, file, encoding, - moo_editor_get_save_flags(&editor), - error_here); + result = _moo_edit_save_file (doc, file, encoding, + moo_editor_get_save_flags (editor), + &error_here); if (!result && error_here->domain == MOO_EDIT_FILE_ERROR && error_here->code == MOO_EDIT_FILE_ERROR_ENCODING) { - error_here.clear(); + g_error_free (error_here); + error_here = NULL; - if (_moo_edit_save_error_enc_dialog(doc, file, encoding)) + if (_moo_edit_save_error_enc_dialog (doc, file, encoding)) { - result = _moo_edit_save_file(doc, file, "UTF-8", - moo_editor_get_save_flags(&editor), - error_here); + result = _moo_edit_save_file (doc, file, "UTF-8", + moo_editor_get_save_flags (editor), + &error_here); } else { - g_set_error(&error, - MOO_EDIT_SAVE_ERROR, - MOO_EDIT_SAVE_ERROR_CANCELLED, - "cancelled"); + g_set_error (error, + MOO_EDIT_SAVE_ERROR, + MOO_EDIT_SAVE_ERROR_CANCELLED, + "cancelled"); return FALSE; } } if (!result) { - _moo_edit_save_error_dialog(doc, file, error_here.get()); - error = std::move(error_here); + if (!is_embedded (editor)) + _moo_edit_save_error_dialog (doc, file, error_here); + g_propagate_error (error, error_here); return FALSE; } - update_history_item_for_doc(&editor, &doc, TRUE); + update_history_item_for_doc (editor, doc, TRUE); - doc.signal_emit_by_name("after-save"); - g_signal_emit (&editor, signals[AFTER_SAVE], 0, doc.gobj ()); + g_signal_emit_by_name (doc, "after-save"); + g_signal_emit (editor, signals[AFTER_SAVE], 0, doc); - return true; + return TRUE; } /** @@ -2513,10 +2717,14 @@ moo_editor_save (MooEditor *editor, MooEdit *doc, GError **error) { + GFile *file; + char *encoding; + gboolean result = FALSE; + moo_return_error_if_fail (MOO_IS_EDITOR (editor)); moo_return_error_if_fail (MOO_IS_EDIT (doc)); - if (Edit(*doc)._is_busy()) + if (MOO_EDIT_IS_BUSY (doc)) { g_set_error (error, MOO_EDIT_SAVE_ERROR, @@ -2528,21 +2736,27 @@ moo_editor_save (MooEditor *editor, if (moo_edit_is_untitled (doc)) return moo_editor_save_as (editor, doc, NULL, error); - g::FilePtr file = wrap_new(moo_edit_get_file(doc)); - gstr encoding = gstr::wrap(moo_edit_get_encoding(doc)); + file = moo_edit_get_file (doc); + encoding = g_strdup (moo_edit_get_encoding (doc)); - if ((moo_edit_get_status (doc) & MOO_EDIT_STATUS_MODIFIED_ON_DISK) && + if (!is_embedded (editor) && + (moo_edit_get_status (doc) & MOO_EDIT_STATUS_MODIFIED_ON_DISK) && !_moo_edit_overwrite_modified_dialog (doc)) { g_set_error (error, MOO_EDIT_SAVE_ERROR, MOO_EDIT_SAVE_ERROR_CANCELLED, "cancelled by user"); - return false; + goto out; } - gerrp error_here(error); - return do_save(*editor, *doc, *file, encoding, error_here); + result = do_save (editor, doc, file, encoding, error); + + /* fall through */ +out: + g_object_unref (file); + g_free (encoding); + return result; } /** @@ -2559,46 +2773,55 @@ moo_editor_save (MooEditor *editor, gboolean moo_editor_save_as (MooEditor *editor, MooEdit *doc, - MooSaveInfo *info_init, + MooSaveInfo *info, GError **error) { + MooSaveInfo *freeme = NULL; + gboolean result = FALSE; + moo_return_error_if_fail (MOO_IS_EDITOR (editor)); moo_return_error_if_fail (MOO_IS_EDIT (doc)); - moo_return_error_if_fail (!info_init || !info_init->file); + moo_return_error_if_fail (!info || info->file); - if (Edit(*doc)._is_busy()) + if (MOO_EDIT_IS_BUSY (doc)) { g_set_error (error, MOO_EDIT_SAVE_ERROR, MOO_EDIT_SAVE_ERROR_BUSY, "document is busy"); - return false; + return FALSE; } - std::unique_ptr info (info_init ? moo_save_info_dup (info_init) : nullptr); - if (!info) { - info.reset(_moo_edit_save_as_dialog(doc, moo_edit_get_display_basename(doc))); + freeme = _moo_edit_save_as_dialog (doc, moo_edit_get_display_basename (doc)); - if (!info) + if (!freeme) { g_set_error (error, MOO_EDIT_SAVE_ERROR, MOO_EDIT_SAVE_ERROR_CANCELLED, "cancelled by user"); - return false; + goto out; } + + info = freeme; } - else if (info->encoding.empty()) + else if (!info->encoding) { - info.reset(moo_save_info_new_file(info->file.gobj(), moo_edit_get_encoding(doc))); + freeme = moo_save_info_new_file (info->file, moo_edit_get_encoding (doc)); + info = freeme; } - update_history_item_for_doc(editor, doc, FALSE); + update_history_item_for_doc (editor, doc, FALSE); - gerrp error_here(error); - return do_save(*editor, *doc, *info->file, info->encoding, error_here); + result = do_save (editor, doc, info->file, info->encoding, error); + + /* fall through */ +out: + if (freeme) + g_object_unref (freeme); + return result; } /** @@ -2610,15 +2833,18 @@ moo_editor_save_copy (MooEditor *editor, MooSaveInfo *info, GError **error) { + gboolean retval; + moo_return_error_if_fail (MOO_IS_EDITOR (editor)); moo_return_error_if_fail (MOO_IS_EDIT (doc)); - moo_return_error_if_fail (info != nullptr && info->file != nullptr); + moo_return_error_if_fail (info != NULL && info->file != NULL); - gerrp error_here(error); - return _moo_edit_save_file_copy (*doc, *info->file, - !info->encoding.empty() ? info->encoding : moo_edit_get_encoding (doc), - moo_editor_get_save_flags (editor), - error_here); + retval = _moo_edit_save_file_copy (doc, info->file, + info->encoding ? info->encoding : moo_edit_get_encoding (doc), + moo_editor_get_save_flags (editor), + error); + + return retval; } @@ -2633,34 +2859,17 @@ doc_array_find_norm_name (MooEditArray *docs, for (i = 0; i < docs->n_elms; ++i) { - Edit doc = *docs->elms[i]; - const gstr& doc_norm_name = doc._get_normalized_name(); - if (doc_norm_name == norm_name) - return &doc; + MooEdit *doc = docs->elms[i]; + char *doc_norm_name = _moo_edit_get_normalized_name (doc); + gboolean this_doc = doc_norm_name != NULL && strcmp (doc_norm_name, norm_name) == 0; + g_free (doc_norm_name); + if (this_doc) + return doc; } return NULL; } -// static MooEdit * -// doc_array_find_norm_name (const std::vector>& docs, -// const char *norm_name) -// { -// g_return_val_if_fail (norm_name != NULL, NULL); -// -// for (const auto& doc: docs) -// { -// char *doc_norm_name = _moo_edit_get_normalized_name (doc.gobj()); -// gboolean this_doc = doc_norm_name != NULL && strcmp (doc_norm_name, norm_name) == 0; -// g_free (doc_norm_name); -// if (this_doc) -// return doc.gobj(); -// } -// -// return NULL; -// } - - /** * moo_editor_get_doc_for_file: * @@ -2670,24 +2879,26 @@ MooEdit * moo_editor_get_doc_for_file (MooEditor *editor, GFile *file) { + char *norm_name = NULL; MooEdit *doc = NULL; + guint i; g_return_val_if_fail (MOO_IS_EDITOR (editor), NULL); g_return_val_if_fail (G_IS_FILE (file), NULL); - gstr norm_name = Edit::_get_normalized_name (*file); - g_return_val_if_fail (!norm_name.empty(), NULL); + norm_name = _moo_file_get_normalized_name (file); + g_return_val_if_fail (norm_name != NULL, NULL); - for (const auto& window: editor->priv->windows) + doc = doc_array_find_norm_name (editor->priv->windowless, norm_name); + + for (i = 0; !doc && i < editor->priv->windows->n_elms; ++i) { - MooEditArray *docs = moo_edit_window_get_docs (window); + MooEditArray *docs = moo_edit_window_get_docs (editor->priv->windows->elms[i]); doc = doc_array_find_norm_name (docs, norm_name); moo_edit_array_free (docs); - - if (doc != nullptr) - break; } + g_free (norm_name); return doc; } @@ -2783,7 +2994,7 @@ _moo_editor_apply_prefs (MooEditor *editor) color_scheme = moo_prefs_get_string (moo_edit_setting (MOO_EDIT_PREFS_COLOR_SCHEME)); if (color_scheme) - _moo_lang_mgr_set_active_scheme (editor->priv->lang_mgr.gobj(), color_scheme); + _moo_lang_mgr_set_active_scheme (editor->priv->lang_mgr, color_scheme); backups = moo_prefs_get_bool (moo_edit_setting (MOO_EDIT_PREFS_MAKE_BACKUPS)); diff --git a/moo/mooedit/mooeditor.h b/moo/mooedit/mooeditor.h index 9463435e..01f1f2f7 100644 --- a/moo/mooedit/mooeditor.h +++ b/moo/mooedit/mooeditor.h @@ -83,11 +83,15 @@ struct MooEditorClass GType moo_editor_get_type (void) G_GNUC_CONST; MooEditor *moo_editor_instance (void); -MooEditor *moo_editor_create_instance (void); +MooEditor *moo_editor_create_instance (gboolean embedded); MooEditWindow *moo_editor_new_window (MooEditor *editor); MooEdit *moo_editor_new_doc (MooEditor *editor, MooEditWindow *window); +MooEdit *moo_editor_create_doc (MooEditor *editor, + const char *path, + const char *encoding, + GError **error); MooEdit *moo_editor_new_file (MooEditor *editor, MooOpenInfo *info, diff --git a/moo/mooedit/mooeditprefs.cpp b/moo/mooedit/mooeditprefs.c similarity index 98% rename from moo/mooedit/mooeditprefs.cpp rename to moo/mooedit/mooeditprefs.c index e08aa8aa..aaa5dfb5 100644 --- a/moo/mooedit/mooeditprefs.cpp +++ b/moo/mooedit/mooeditprefs.c @@ -16,6 +16,7 @@ #include "mooedit/mooeditprefs.h" #include "mooedit/mooedit-impl.h" #include "mooedit/mooeditview-impl.h" +#include "mooedit/mooedit-fileops.h" #include "mooedit/mootextview-private.h" #include "mooedit/mooedit-enums.h" #include "mooedit/mootextbuffer.h" @@ -32,7 +33,9 @@ static void _moo_edit_init_prefs (void); -static guint _moo_edit_settings[MOO_EDIT_LAST_SETTING]; + +static guint settings[MOO_EDIT_LAST_SETTING]; +guint *_moo_edit_settings = settings; const char * @@ -217,7 +220,7 @@ _moo_edit_view_apply_prefs (MooEditView *view) { MooLangMgr *mgr; MooTextStyleScheme *scheme; - MooDrawWsFlags ws_flags = MOO_DRAW_WS_NONE; + MooDrawWsFlags ws_flags = 0; g_return_if_fail (MOO_IS_EDIT_VIEW (view)); diff --git a/moo/mooedit/mooeditprefs.h b/moo/mooedit/mooeditprefs.h index ba999658..d74e2328 100644 --- a/moo/mooedit/mooeditprefs.h +++ b/moo/mooedit/mooeditprefs.h @@ -29,7 +29,7 @@ GtkWidget *moo_edit_prefs_page_new_3 (MooEditor *editor); GtkWidget *moo_edit_prefs_page_new_4 (MooEditor *editor); GtkWidget *moo_edit_prefs_page_new_5 (MooEditor *editor); -/* defined in mooeditprefs.cpp */ +/* defined in mooeditprefs.c */ const char *moo_edit_setting (const char *setting_name); #define MOO_EDIT_PREFS_TITLE_FORMAT "window_title" diff --git a/moo/mooedit/mooeditprogress.cpp b/moo/mooedit/mooeditprogress.c similarity index 60% rename from moo/mooedit/mooeditprogress.cpp rename to moo/mooedit/mooeditprogress.c index 88799b92..b9623424 100644 --- a/moo/mooedit/mooeditprogress.cpp +++ b/moo/mooedit/mooeditprogress.c @@ -21,11 +21,9 @@ struct MooEditProgress ProgressWidgetXml *xml; guint timeout; - g::gstr text; + char *text; GDestroyNotify cancel_op; gpointer cancel_data; - - void update() const; }; struct MooEditProgressClass @@ -40,7 +38,6 @@ MOO_DEFINE_TYPE_STATIC (MooEditProgress, moo_edit_progress, GTK_TYPE_ALIGNMENT) static void moo_edit_progress_init (MooEditProgress *pr) { - new(pr)(MooEditProgress); pr->xml = progress_widget_xml_new_with_root (GTK_WIDGET (pr)); g_signal_connect_swapped (pr->xml->cancel, "clicked", G_CALLBACK (cancel_clicked), pr); } @@ -56,42 +53,46 @@ moo_edit_progress_dispose (GObject *object) pr->timeout = 0; } - G_OBJECT_CLASS (moo_edit_progress_parent_class)->dispose (object); -} + g_free (pr->text); + pr->text = NULL; -static void -moo_edit_progress_finalize(GObject* object) -{ - MooEditProgress* pr = MOO_EDIT_PROGRESS(object); - pr->~MooEditProgress(); - G_OBJECT_CLASS(moo_edit_progress_parent_class)->finalize(object); + G_OBJECT_CLASS (moo_edit_progress_parent_class)->dispose (object); } static void moo_edit_progress_class_init (MooEditProgressClass *klass) { - G_OBJECT_CLASS(klass)->finalize = moo_edit_progress_finalize; - G_OBJECT_CLASS(klass)->dispose = moo_edit_progress_dispose; + G_OBJECT_CLASS (klass)->dispose = moo_edit_progress_dispose; } -EditProgressPtr +MooEditProgress * _moo_edit_progress_new (void) { - return moo::wrap_new(MOO_EDIT_PROGRESS(g_object_new(MOO_TYPE_EDIT_PROGRESS, NULL))); + return g_object_new (MOO_TYPE_EDIT_PROGRESS, NULL); } -void MooEditProgress::update() const +static void +update_progress (MooEditProgress *progress) { - g_return_if_fail (!text.empty()); - gtk_progress_bar_set_text(xml->progressbar, text); + g_return_if_fail (MOO_IS_EDIT_PROGRESS (progress)); + g_return_if_fail (progress->text != NULL); + gtk_progress_bar_set_text (progress->xml->progressbar, + progress->text); } void -_moo_edit_progress_set_text (MooEditProgress& progress, - const char* text) +_moo_edit_progress_set_text (MooEditProgress *progress, + const char *text) { - progress.text.set(text); - progress.update(); + char *tmp; + + g_return_if_fail (MOO_IS_EDIT_PROGRESS (progress)); + + tmp = progress->text; + progress->text = g_strdup (text); + g_free (tmp); + + update_progress (progress); } static gboolean @@ -100,7 +101,7 @@ pulse_progress (MooEditProgress *progress) g_return_val_if_fail (MOO_IS_EDIT_PROGRESS (progress), FALSE); g_return_val_if_fail (GTK_IS_WIDGET (progress->xml->progressbar), FALSE); gtk_progress_bar_pulse (GTK_PROGRESS_BAR (progress->xml->progressbar)); - progress->update(); + update_progress (progress); return TRUE; } @@ -118,10 +119,10 @@ show_progress (MooEditProgress *progress) g_source_remove (progress->timeout); progress->timeout = - g_timeout_add (PROGRESS_TIMEOUT, - (GSourceFunc) pulse_progress, - progress); - progress->update(); + gdk_threads_add_timeout (PROGRESS_TIMEOUT, + (GSourceFunc) pulse_progress, + progress); + update_progress (progress); gtk_widget_show (GTK_WIDGET (progress)); @@ -129,30 +130,32 @@ show_progress (MooEditProgress *progress) } void -_moo_edit_progress_set_cancel_func (MooEditProgress& progress, - GDestroyNotify cancel_func, - gpointer cancel_func_data) +_moo_edit_progress_set_cancel_func (MooEditProgress *progress, + GDestroyNotify cancel_func, + gpointer cancel_func_data) { - progress.cancel_op = cancel_func; - progress.cancel_data = cancel_func_data; - gtk_widget_set_sensitive (GTK_WIDGET (progress.xml->cancel), + g_return_if_fail (MOO_IS_EDIT_PROGRESS (progress)); + progress->cancel_op = cancel_func; + progress->cancel_data = cancel_func_data; + gtk_widget_set_sensitive (GTK_WIDGET (progress->xml->cancel), cancel_func != NULL); } void -_moo_edit_progress_start (MooEditProgress& progress, - const char* text, +_moo_edit_progress_start (MooEditProgress *progress, + const char *text, GDestroyNotify cancel_func, gpointer cancel_func_data) { - g_return_if_fail(progress.timeout == 0); + g_return_if_fail (MOO_IS_EDIT_PROGRESS (progress)); + g_return_if_fail (progress->timeout == 0); - progress.text.set_new(g_strdup(text)); + progress->text = g_strdup (text); - _moo_edit_progress_set_cancel_func(progress, cancel_func, cancel_func_data); + _moo_edit_progress_set_cancel_func (progress, cancel_func, cancel_func_data); - progress.timeout = - g_timeout_add (INITIAL_TIMEOUT, - (GSourceFunc) show_progress, - &progress); + progress->timeout = + gdk_threads_add_timeout (INITIAL_TIMEOUT, + (GSourceFunc) show_progress, + progress); } diff --git a/moo/mooedit/mooeditprogress.h b/moo/mooedit/mooeditprogress.h index 3c3a90d9..bc5a79bc 100644 --- a/moo/mooedit/mooeditprogress.h +++ b/moo/mooedit/mooeditprogress.h @@ -1,26 +1,24 @@ -#pragma once +#ifndef MOO_EDIT_PROGRESS_H +#define MOO_EDIT_PROGRESS_H #include "mooedit.h" #include "mooeditwindow.h" +G_BEGIN_DECLS + typedef struct MooEditProgress MooEditProgress; -#ifdef __cplusplus +MooEditProgress *_moo_edit_progress_new (void); +void _moo_edit_progress_start (MooEditProgress *progress, + const char *text, + GDestroyNotify cancel_func, + gpointer cancel_func_data); +void _moo_edit_progress_set_cancel_func (MooEditProgress *progress, + GDestroyNotify cancel_func, + gpointer cancel_func_data); +void _moo_edit_progress_set_text (MooEditProgress *progress, + const char *text); -#include +G_END_DECLS -using EditProgressPtr = moo::gobj_ptr; -using EditProgress = moo::gobj_ref; - -EditProgressPtr _moo_edit_progress_new (void); -void _moo_edit_progress_start (MooEditProgress& progress, - const char* text, - GDestroyNotify cancel_func, - gpointer cancel_func_data); -void _moo_edit_progress_set_cancel_func (MooEditProgress& progress, - GDestroyNotify cancel_func, - gpointer cancel_func_data); -void _moo_edit_progress_set_text (MooEditProgress& progress, - const char* text); - -#endif // __cplusplus +#endif /* MOO_EDIT_PROGRESS_H */ diff --git a/moo/mooedit/mooedittab.cpp b/moo/mooedit/mooedittab.c similarity index 90% rename from moo/mooedit/mooedittab.cpp rename to moo/mooedit/mooedittab.c index 9598d1fe..0bb39527 100644 --- a/moo/mooedit/mooedittab.cpp +++ b/moo/mooedit/mooedittab.c @@ -18,7 +18,7 @@ struct MooEditTab GtkWidget *vpaned1; GtkWidget *vpaned2; - EditPtr doc; + MooEdit *doc; MooEditView *active_view; }; @@ -40,8 +40,6 @@ G_DEFINE_TYPE (MooEditTab, moo_edit_tab, GTK_TYPE_VBOX) static void moo_edit_tab_init (MooEditTab *tab) { - new(tab) (MooEditTab); - gtk_box_set_homogeneous (GTK_BOX (tab), FALSE); tab->hpaned = gtk_hpaned_new (); tab->vpaned1 = gtk_vpaned_new (); @@ -57,32 +55,25 @@ moo_edit_tab_dispose (GObject *object) { MooEditTab *tab = MOO_EDIT_TAB (object); - tab->doc.reset(); + if (tab->doc) + { + g_object_unref (tab->doc); + tab->doc = NULL; + } G_OBJECT_CLASS (moo_edit_tab_parent_class)->dispose (object); } -static void -moo_edit_tab_finalize (GObject *object) -{ - MooEditTab *tab = MOO_EDIT_TAB (object); - - tab->~MooEditTab(); - - G_OBJECT_CLASS (moo_edit_tab_parent_class)->finalize (object); -} - static void moo_edit_tab_class_init (MooEditTabClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); object_class->dispose = moo_edit_tab_dispose; - object_class->finalize = moo_edit_tab_finalize; } static GtkWidget * -create_view_scrolled_window(MooEditView& view) +create_view_scrolled_window (MooEditView *view) { GtkWidget *swin = gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (swin), @@ -91,7 +82,7 @@ create_view_scrolled_window(MooEditView& view) gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (swin), GTK_SHADOW_ETCHED_IN); - gtk_container_add (GTK_CONTAINER (swin), GTK_WIDGET (&view)); + gtk_container_add (GTK_CONTAINER (swin), GTK_WIDGET (view)); gtk_widget_show_all (swin); return swin; } @@ -99,10 +90,9 @@ create_view_scrolled_window(MooEditView& view) static GtkWidget * create_view_in_scrolled_window (MooEditTab *tab) { - g_return_val_if_fail (tab->doc != nullptr, nullptr); - auto view = EditView::_create(*tab->doc); - view->_set_tab(tab); - return create_view_scrolled_window(*view); + MooEditView *view = _moo_edit_view_new (tab->doc); + _moo_edit_view_set_tab (view, tab); + return create_view_scrolled_window (view); } MooEditTab * @@ -114,13 +104,13 @@ _moo_edit_tab_new (MooEdit *doc) g_return_val_if_fail (moo_edit_get_n_views (doc) == 1, NULL); - tab = MOO_EDIT_TAB (g_object_new (MOO_TYPE_EDIT_TAB, NULL)); - tab->doc.ref (doc); + tab = g_object_new (MOO_TYPE_EDIT_TAB, NULL); + tab->doc = g_object_ref (doc); view = moo_edit_get_view (doc); - EditView(*view)._set_tab(tab); + _moo_edit_view_set_tab (view, tab); - swin = create_view_scrolled_window (*view); + swin = create_view_scrolled_window (view); gtk_paned_pack1 (GTK_PANED (tab->vpaned1), swin, TRUE, FALSE); gtk_widget_show (tab->vpaned1); gtk_widget_show (GTK_WIDGET (tab)); @@ -135,7 +125,7 @@ MooEdit * moo_edit_tab_get_doc (MooEditTab *tab) { g_return_val_if_fail (MOO_IS_EDIT_TAB (tab), NULL); - return tab->doc.gobj(); + return tab->doc; } /** @@ -158,7 +148,7 @@ moo_edit_tab_get_views (MooEditTab *tab) GList *children = gtk_container_get_children (GTK_CONTAINER (i == 0 ? tab->vpaned1 : tab->vpaned2)); while (children) { - MooEditView *view = MOO_EDIT_VIEW (gtk_bin_get_child (GTK_BIN (children->data))); + MooEditView *view = MOO_EDIT_VIEW (gtk_bin_get_child (children->data)); moo_edit_view_array_append (views, view); children = g_list_delete_link (children, children); } @@ -182,7 +172,7 @@ moo_edit_tab_get_active_view (MooEditTab *tab) { GList *children = gtk_container_get_children (GTK_CONTAINER (i == 0 ? tab->vpaned1 : tab->vpaned2)); if (children) - tab->active_view = MOO_EDIT_VIEW (gtk_bin_get_child (GTK_BIN (children->data))); + tab->active_view = MOO_EDIT_VIEW (gtk_bin_get_child (children->data)); g_list_free (children); } } @@ -317,13 +307,13 @@ _moo_edit_tab_set_split_horizontal (MooEditTab *tab, if (view1) { - tab->doc->_remove_view (*view1); + _moo_edit_remove_view (tab->doc, view1); gtk_container_remove (GTK_CONTAINER (tab->vpaned2), GTK_WIDGET (view1)->parent); } if (view2) { - tab->doc->_remove_view (*view2); + _moo_edit_remove_view (tab->doc, view2); gtk_container_remove (GTK_CONTAINER (tab->vpaned2), GTK_WIDGET (view2)->parent); } @@ -411,13 +401,13 @@ _moo_edit_tab_set_split_vertical (MooEditTab *tab, if (view1) { - tab->doc->_remove_view (*view1); + _moo_edit_remove_view (tab->doc, view1); gtk_container_remove (GTK_CONTAINER (tab->vpaned1), GTK_WIDGET (view1)->parent); } if (view2) { - tab->doc->_remove_view (*view2); + _moo_edit_remove_view (tab->doc, view2); gtk_container_remove (GTK_CONTAINER (tab->vpaned2), GTK_WIDGET (view2)->parent); } @@ -449,12 +439,10 @@ _moo_edit_tab_create_progress (MooEditTab *tab) g_return_val_if_fail (MOO_IS_EDIT_TAB (tab), NULL); g_return_val_if_fail (!tab->progress, tab->progress); - EditProgressPtr progress = _moo_edit_progress_new(); - tab->progress = progress.gobj(); + tab->progress = _moo_edit_progress_new (); gtk_box_pack_start (GTK_BOX (tab), GTK_WIDGET (tab->progress), FALSE, FALSE, 0); gtk_box_reorder_child (GTK_BOX (tab), GTK_WIDGET (tab->progress), 0); - // progress object is owned by gtk now return tab->progress; } diff --git a/moo/mooedit/mooedittypes.h b/moo/mooedit/mooedittypes.h index 85a29f69..a7e9516a 100644 --- a/moo/mooedit/mooedittypes.h +++ b/moo/mooedit/mooedittypes.h @@ -1,4 +1,5 @@ -#pragma once +#ifndef MOO_EDIT_TYPES_H +#define MOO_EDIT_TYPES_H #include #include @@ -8,27 +9,23 @@ G_BEGIN_DECLS -#define MOO_DECLARE_C_CLASS(Object, object) \ - typedef struct Object Object; \ - GType object##_get_type(void) G_GNUC_CONST; +typedef struct MooOpenInfo MooOpenInfo; +typedef struct MooSaveInfo MooSaveInfo; +typedef struct MooReloadInfo MooReloadInfo; -MOO_DECLARE_C_CLASS(MooEdit, moo_edit); -MOO_DECLARE_C_CLASS(MooEditor, moo_editor); -MOO_DECLARE_C_CLASS(MooEditView, moo_edit_view); -MOO_DECLARE_C_CLASS(MooEditWindow, moo_edit_window); -MOO_DECLARE_C_CLASS(MooEditor, moo_editor); -MOO_DECLARE_C_CLASS(MooEditTab, moo_edit_tab); -MOO_DECLARE_C_CLASS(MooTextView, moo_text_view); -MOO_DECLARE_C_CLASS(MooOpenInfo, moo_open_info); -MOO_DECLARE_C_CLASS(MooSaveInfo, moo_save_info); -MOO_DECLARE_C_CLASS(MooReloadInfo, moo_reload_info); +typedef struct MooEdit MooEdit; +typedef struct MooEditView MooEditView; +typedef struct MooEditWindow MooEditWindow; +typedef struct MooEditor MooEditor; +typedef struct MooEditTab MooEditTab; MOO_DECLARE_OBJECT_ARRAY (MooEdit, moo_edit) MOO_DECLARE_OBJECT_ARRAY (MooEditView, moo_edit_view) MOO_DECLARE_OBJECT_ARRAY (MooEditTab, moo_edit_tab) MOO_DECLARE_OBJECT_ARRAY (MooEditWindow, moo_edit_window) +MOO_DEFINE_SLIST (MooEditList, moo_edit_list, MooEdit) -MOO_DECLARE_PTR_ARRAY(MooOpenInfo, moo_open_info) +MOO_DECLARE_OBJECT_ARRAY (MooOpenInfo, moo_open_info) #define MOO_TYPE_LINE_END (moo_type_line_end ()) GType moo_type_line_end (void) G_GNUC_CONST; @@ -41,38 +38,4 @@ MOO_DECLARE_QUARK (moo-edit-save-error, moo_edit_save_error_quark) G_END_DECLS -#ifdef __cplusplus - -#include - -namespace moo { - -MOO_DEFINE_SIMPLE_GOBJ_CLASS(TextView, gtk::TextView, MooTextView, moo_text_view_get_type()); -MOO_DEFINE_SIMPLE_GOBJ_CLASS(EditTab, gtk::Widget, MooEditTab, moo_edit_tab_get_type()); -MOO_DEFINE_SIMPLE_GOBJ_CLASS(EditWindow, gtk::Window, MooEditWindow, moo_edit_window_get_type()); -MOO_DEFINE_SIMPLE_GOBJ_CLASS(EditView, moo::TextView, MooEditView, moo_edit_view_get_type()); - -} // namespace moo - -MOO_DECLARE_CUSTOM_GOBJ_TYPE(MooEdit); -MOO_DECLARE_CUSTOM_GOBJ_TYPE(MooEditView); - -MOO_GOBJ_TYPEDEFS(TextView, MooTextView); -MOO_GOBJ_TYPEDEFS(Edit, MooEdit); -MOO_GOBJ_TYPEDEFS(EditTab, MooEditTab); -MOO_GOBJ_TYPEDEFS(EditView, MooEditView); -MOO_GOBJ_TYPEDEFS(EditWindow, MooEditWindow); - -void g_object_unref(MooOpenInfo*) = delete; -void g_object_unref(MooReloadInfo*) = delete; -void g_object_unref(MooSaveInfo*) = delete; - -void g_free(MooOpenInfo*) = delete; -void g_free(MooReloadInfo*) = delete; -void g_free(MooSaveInfo*) = delete; - -MOO_DEFINE_NON_GOBJ_TYPE(MooOpenInfo); -MOO_DEFINE_NON_GOBJ_TYPE(MooReloadInfo); -MOO_DEFINE_NON_GOBJ_TYPE(MooSaveInfo); - -#endif // __cplusplus +#endif /* MOO_EDIT_TYPES_H */ diff --git a/moo/mooedit/mooeditview-impl.h b/moo/mooedit/mooeditview-impl.h index 87f0e943..99db9b45 100644 --- a/moo/mooedit/mooeditview-impl.h +++ b/moo/mooedit/mooeditview-impl.h @@ -1,34 +1,19 @@ -#pragma once +#ifndef MOO_EDIT_VIEW_IMPL_H +#define MOO_EDIT_VIEW_IMPL_H #include "mooedit/mooeditview.h" -#include "mooedit/mooedittypes.h" - -#ifdef __cplusplus - -template<> -class moo::gobj_ref : public virtual moo::gobj_ref_parent -{ -public: - MOO_DEFINE_GOBJREF_METHODS(MooEditView); - - void _unset_doc (); - void _set_tab (MooEditTab* tab); - - GtkTextMark* _get_fake_cursor_mark (); - - void _apply_config (); - - static gobj_ptr _create (Edit doc); - - MooEditViewPrivate& get_priv() { return *gobj()->priv; } - const MooEditViewPrivate& get_priv() const { return *gobj()->priv; } -}; - -#endif // __cplusplus G_BEGIN_DECLS +MooEditView *_moo_edit_view_new (MooEdit *doc); +void _moo_edit_view_unset_doc (MooEditView *view); +void _moo_edit_view_set_tab (MooEditView *view, + MooEditTab *tab); + +GtkTextMark *_moo_edit_view_get_fake_cursor_mark (MooEditView *view); + void _moo_edit_view_apply_prefs (MooEditView *view); +void _moo_edit_view_apply_config (MooEditView *view); void _moo_edit_view_ui_set_line_wrap (MooEditView *view, gboolean enabled); @@ -39,3 +24,5 @@ void _moo_edit_view_do_popup (MooEditView *view, GdkEventButton *event); G_END_DECLS + +#endif /* MOO_EDIT_VIEW_IMPL_H */ diff --git a/moo/mooedit/mooeditview-priv.h b/moo/mooedit/mooeditview-priv.h index 0bf1dae2..ee1440a3 100644 --- a/moo/mooedit/mooeditview-priv.h +++ b/moo/mooedit/mooeditview-priv.h @@ -1,13 +1,18 @@ -#pragma once +#ifndef MOO_EDIT_VIEW_PRIV_H +#define MOO_EDIT_VIEW_PRIV_H #include "mooedit/mooeditview-impl.h" -#include "mooedit/mooedit-impl.h" -#include "mooedit/mooedittypes.h" + +G_BEGIN_DECLS struct MooEditViewPrivate { - EditRawPtr doc; + MooEdit *doc; MooEditor *editor; MooEditTab *tab; GtkTextMark *fake_cursor_mark; }; + +G_END_DECLS + +#endif /* MOO_EDIT_VIEW_PRIV_H */ diff --git a/moo/mooedit/mooeditview.cpp b/moo/mooedit/mooeditview.c similarity index 81% rename from moo/mooedit/mooeditview.cpp rename to moo/mooedit/mooeditview.c index d945f563..28c11bf6 100644 --- a/moo/mooedit/mooeditview.cpp +++ b/moo/mooedit/mooeditview.c @@ -12,12 +12,9 @@ #include "mooutils/mooutils.h" #include "mooutils/moocompat.h" -using namespace moo; - MOO_DEFINE_OBJECT_ARRAY (MooEditView, moo_edit_view) static void moo_edit_view_dispose (GObject *object); -static void moo_edit_view_finalize (GObject *object); static gboolean moo_edit_view_focus_in (GtkWidget *widget, GdkEventFocus *event); @@ -47,7 +44,6 @@ moo_edit_view_class_init (MooEditViewClass *klass) MooTextViewClass *textview_class = MOO_TEXT_VIEW_CLASS (klass); gobject_class->dispose = moo_edit_view_dispose; - gobject_class->finalize = moo_edit_view_finalize; widget_class->popup_menu = moo_edit_view_popup_menu; widget_class->drag_motion = moo_edit_view_drag_motion; @@ -64,12 +60,14 @@ moo_edit_view_class_init (MooEditViewClass *klass) static void moo_edit_view_init (MooEditView *view) { - init_cpp_private (view, view->priv); + view->priv = G_TYPE_INSTANCE_GET_PRIVATE (view, MOO_TYPE_EDIT_VIEW, MooEditViewPrivate); } -void EditView::_unset_doc() +void +_moo_edit_view_unset_doc (MooEditView *view) { - get_priv().doc = nullptr; + g_return_if_fail (MOO_IS_EDIT_VIEW (view)); + view->priv->doc = NULL; } static void @@ -81,45 +79,41 @@ moo_edit_view_dispose (GObject *object) { GtkTextBuffer *buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view)); gtk_text_buffer_delete_mark (buffer, view->priv->fake_cursor_mark); - view->priv->fake_cursor_mark = nullptr; + view->priv->fake_cursor_mark = NULL; } if (view->priv->doc) { - view->priv->doc->_remove_view(*view); - g_assert (view->priv->doc == nullptr); - view->priv->doc = nullptr; + _moo_edit_remove_view (view->priv->doc, view); + g_assert (view->priv->doc == NULL); + view->priv->doc = NULL; } G_OBJECT_CLASS (moo_edit_view_parent_class)->dispose (object); } -static void -moo_edit_view_finalize (GObject *object) + +MooEditView * +_moo_edit_view_new (MooEdit *doc) { - MooEditView *view = MOO_EDIT_VIEW (object); - finalize_cpp_private (view, view->priv); - G_OBJECT_CLASS (moo_edit_view_parent_class)->finalize (object); -} + MooEditView *view; + MooIndenter *indent; + g_return_val_if_fail (MOO_IS_EDIT (doc), NULL); -EditViewPtr EditView::_create(Edit doc) -{ - MooEditView *view = MOO_EDIT_VIEW (g_object_new (MOO_TYPE_EDIT_VIEW, - "buffer", moo_edit_get_buffer (doc.gobj()), - nullptr)); + view = g_object_new (MOO_TYPE_EDIT_VIEW, "buffer", moo_edit_get_buffer (doc), NULL); + view->priv->doc = doc; + view->priv->editor = moo_edit_get_editor (doc); - view->priv->doc = doc.gobj(); - view->priv->editor = moo_edit_get_editor (&doc); + g_assert (gtk_text_view_get_buffer (GTK_TEXT_VIEW (view)) == moo_edit_get_buffer (doc)); - g_assert (gtk_text_view_get_buffer (GTK_TEXT_VIEW (view)) == moo_edit_get_buffer (&doc)); + indent = moo_indenter_new (doc); + moo_text_view_set_indenter (MOO_TEXT_VIEW (view), indent); + g_object_unref (indent); - auto indent = moo::wrap_new (moo_indenter_new (&doc)); - moo_text_view_set_indenter (MOO_TEXT_VIEW (view), indent.gobj()); + _moo_edit_add_view (doc, view); - doc._add_view (*view); - - return wrap_new (view); + return view; } @@ -136,7 +130,7 @@ moo_edit_view_apply_style_scheme (MooTextView *view, MooTextStyleScheme *scheme) { MOO_TEXT_VIEW_CLASS (moo_edit_view_parent_class)->apply_style_scheme (view, scheme); - Edit(*moo_edit_view_get_doc(MOO_EDIT_VIEW(view)))._update_bookmarks_style(); + _moo_edit_update_bookmarks_style (moo_edit_view_get_doc (MOO_EDIT_VIEW (view))); } @@ -150,7 +144,7 @@ moo_edit_view_focus_in (GtkWidget *widget, if (GTK_WIDGET_CLASS (moo_edit_view_parent_class)->focus_in_event) retval = GTK_WIDGET_CLASS (moo_edit_view_parent_class)->focus_in_event (widget, event); - view->priv->doc->_set_active_view (*view); + _moo_edit_set_active_view (view->priv->doc, view); if (view->priv->tab) _moo_edit_tab_set_focused_view (view->priv->tab, view); @@ -189,11 +183,14 @@ moo_edit_view_get_tab (MooEditView *view) return view->priv->tab; } -void EditView::_set_tab(MooEditTab *tab) +void +_moo_edit_view_set_tab (MooEditView *view, + MooEditTab *tab) { + g_return_if_fail (MOO_IS_EDIT_VIEW (view)); g_return_if_fail (MOO_IS_EDIT_TAB (tab)); - g_return_if_fail (get_priv().tab == NULL); - get_priv().tab = tab; + g_return_if_fail (view->priv->tab == NULL); + view->priv->tab = tab; } /** @@ -215,48 +212,49 @@ moo_edit_view_get_window (MooEditView *view) } -GtkTextMark *EditView::_get_fake_cursor_mark() +GtkTextMark * +_moo_edit_view_get_fake_cursor_mark (MooEditView *view) { - auto& priv = get_priv(); + g_return_val_if_fail (MOO_IS_EDIT_VIEW (view), NULL); - if (!priv.fake_cursor_mark) + if (!view->priv->fake_cursor_mark) { GtkTextIter iter; - GtkTextBuffer *buffer = gtk_text_view_get_buffer (gobj()); + GtkTextBuffer *buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view)); gtk_text_buffer_get_start_iter (buffer, &iter); - priv.fake_cursor_mark = gtk_text_buffer_create_mark (buffer, NULL, &iter, FALSE); + view->priv->fake_cursor_mark = gtk_text_buffer_create_mark (buffer, NULL, &iter, FALSE); } - return priv.fake_cursor_mark; + return view->priv->fake_cursor_mark; } -void EditView::_apply_config() +void +_moo_edit_view_apply_config (MooEditView *view) { GtkWrapMode wrap_mode; gboolean line_numbers; guint tab_width; char *word_chars; - auto& priv = get_priv(); + g_return_if_fail (MOO_IS_EDIT_VIEW (view)); + g_return_if_fail (view->priv->doc && view->priv->doc->config); - g_return_if_fail (priv.doc); - - moo_edit_config_get (priv.doc->get_config(), + moo_edit_config_get (view->priv->doc->config, "wrap-mode", &wrap_mode, "show-line-numbers", &line_numbers, "tab-width", &tab_width, "word-chars", &word_chars, (char*) 0); - gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (gobj()), wrap_mode); - moo_text_view_set_show_line_numbers (MOO_TEXT_VIEW (gobj()), line_numbers); - moo_text_view_set_tab_width (MOO_TEXT_VIEW (gobj()), tab_width); - moo_text_view_set_word_chars (MOO_TEXT_VIEW (gobj()), word_chars); + gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (view), wrap_mode); + moo_text_view_set_show_line_numbers (MOO_TEXT_VIEW (view), line_numbers); + moo_text_view_set_tab_width (MOO_TEXT_VIEW (view), tab_width); + moo_text_view_set_word_chars (MOO_TEXT_VIEW (view), word_chars); - gtk_widget_queue_draw (GTK_WIDGET (gobj())); + gtk_widget_queue_draw (GTK_WIDGET (view)); - ::g_free (word_chars); + g_free (word_chars); } @@ -397,11 +395,10 @@ _moo_edit_view_do_popup (MooEditView *view, xml = moo_editor_get_doc_ui_xml (view->priv->editor); g_return_if_fail (xml != NULL); - Edit doc = *view->priv->doc; - _moo_edit_check_actions (&doc, view); + _moo_edit_check_actions (view->priv->doc, view); menu = (GtkMenu*) moo_ui_xml_create_widget (xml, MOO_UI_MENU, "Editor/Popup", - &doc._get_actions(), + _moo_edit_get_actions (view->priv->doc), window ? MOO_WINDOW(window)->accel_group : NULL); g_return_if_fail (menu != NULL); g_object_ref_sink (menu); @@ -438,7 +435,7 @@ _moo_edit_view_ui_set_line_wrap (MooEditView *view, gboolean old_enabled; g_return_if_fail (MOO_IS_EDIT_VIEW (view)); - g_return_if_fail (view->priv->doc); + g_return_if_fail (view->priv->doc && view->priv->doc->config); g_object_get (view, "wrap-mode", &mode, NULL); @@ -455,7 +452,7 @@ _moo_edit_view_ui_set_line_wrap (MooEditView *view, else mode = GTK_WRAP_CHAR; - moo_edit_config_set (view->priv->doc->get_config(), + moo_edit_config_set (view->priv->doc->config, MOO_EDIT_CONFIG_SOURCE_USER, "wrap-mode", mode, NULL); } @@ -467,14 +464,14 @@ _moo_edit_view_ui_set_show_line_numbers (MooEditView *view, gboolean old_show; g_return_if_fail (MOO_IS_EDIT_VIEW (view)); - g_return_if_fail (view->priv->doc); + g_return_if_fail (view->priv->doc && view->priv->doc->config); g_object_get (view, "show-line-numbers", &old_show, NULL); if (!old_show == !show) return; - moo_edit_config_set (view->priv->doc->get_config(), + moo_edit_config_set (view->priv->doc->config, MOO_EDIT_CONFIG_SOURCE_USER, "show-line-numbers", show, (char*) NULL); diff --git a/moo/mooedit/mooeditview.h b/moo/mooedit/mooeditview.h index 89d7a519..8d71f51e 100644 --- a/moo/mooedit/mooeditview.h +++ b/moo/mooedit/mooeditview.h @@ -1,7 +1,7 @@ /* * mooeditview.h * - * Copyright (C) 2004-2016 by Yevgen Muntyan + * Copyright (C) 2004-2010 by Yevgen Muntyan * * This file is part of medit. medit is free software; you can * redistribute it and/or modify it under the terms of the @@ -13,19 +13,20 @@ * License along with medit. If not, see . */ -#pragma once +#ifndef MOO_EDIT_VIEW_H +#define MOO_EDIT_VIEW_H #include #include G_BEGIN_DECLS -#define MOO_TYPE_EDIT_VIEW (moo_edit_view_get_type ()) -#define MOO_EDIT_VIEW(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), MOO_TYPE_EDIT_VIEW, MooEditView)) -#define MOO_EDIT_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), MOO_TYPE_EDIT_VIEW, MooEditViewClass)) -#define MOO_IS_EDIT_VIEW(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), MOO_TYPE_EDIT_VIEW)) -#define MOO_IS_EDIT_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), MOO_TYPE_EDIT_VIEW)) -#define MOO_EDIT_VIEW_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), MOO_TYPE_EDIT_VIEW, MooEditViewClass)) +#define MOO_TYPE_EDIT_VIEW (moo_edit_view_get_type ()) +#define MOO_EDIT_VIEW(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), MOO_TYPE_EDIT_VIEW, MooEditView)) +#define MOO_EDIT_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), MOO_TYPE_EDIT_VIEW, MooEditViewClass)) +#define MOO_IS_EDIT_VIEW(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), MOO_TYPE_EDIT_VIEW)) +#define MOO_IS_EDIT_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), MOO_TYPE_EDIT_VIEW)) +#define MOO_EDIT_VIEW_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), MOO_TYPE_EDIT_VIEW, MooEditViewClass)) typedef struct MooEditViewPrivate MooEditViewPrivate; typedef struct MooEditViewClass MooEditViewClass; @@ -41,9 +42,13 @@ struct MooEditViewClass MooTextViewClass parent_class; }; +GType moo_edit_view_get_type (void) G_GNUC_CONST; + MooEdit *moo_edit_view_get_doc (MooEditView *view); MooEditTab *moo_edit_view_get_tab (MooEditView *view); MooEditWindow *moo_edit_view_get_window (MooEditView *view); MooEditor *moo_edit_view_get_editor (MooEditView *view); G_END_DECLS + +#endif /* MOO_EDIT_VIEW_H */ diff --git a/moo/mooedit/mooeditwindow.c b/moo/mooedit/mooeditwindow.c index c66749dc..edc182a2 100644 --- a/moo/mooedit/mooeditwindow.c +++ b/moo/mooedit/mooeditwindow.c @@ -1067,7 +1067,7 @@ queue_save_window_config (MooEditWindow *window) { if (!window->priv->save_params_idle) window->priv->save_params_idle = - g_idle_add ((GSourceFunc) save_window_config, window); + gdk_threads_add_idle ((GSourceFunc) save_window_config, window); } @@ -2118,23 +2118,6 @@ move_to_split_notebook_activated (GtkWidget *item, } -static void -copy_full_path_activated (GtkWidget *item, - MooEditWindow *window) -{ - MooEdit *doc = g_object_get_data(G_OBJECT(item), "moo-edit"); - GtkClipboard *clipboard = gtk_widget_get_clipboard(item, GDK_SELECTION_CLIPBOARD); - gtk_clipboard_set_text(clipboard, moo_edit_get_filename(doc), -1); -} - - -static void -open_containing_folder_activated (GtkWidget *item, - MooEditWindow *window) -{ -} - - /****************************************************************************/ /* Documents */ @@ -2235,34 +2218,6 @@ notebook_switch_page (MooNotebook *notebook, } -static void -add_tab_menu_item (const char *label, - MooEdit *doc, - MooEditWindow *window, - GtkMenu *menu, - GtkWidget *child, - GCallback cb, - gboolean enabled) -{ - /* Item in document tab context menu */ - GtkWidget* item = gtk_menu_item_new_with_label(label); - gtk_widget_show(item); - gtk_widget_set_sensitive(item, enabled); - gtk_menu_shell_append(GTK_MENU_SHELL(menu), item); - g_object_set_data(G_OBJECT(item), "moo-edit", doc); - g_object_set_data(G_OBJECT(item), "moo-edit-tab", child); - g_signal_connect(item, "activate", cb, window); -} - -static void -add_separator (GtkMenu *menu) -{ - gtk_menu_shell_append(GTK_MENU_SHELL(menu), - GTK_WIDGET(g_object_new(GTK_TYPE_SEPARATOR_MENU_ITEM, - "visible", TRUE, - (const char*) NULL))); -} - static gboolean notebook_populate_popup (MooEditWindow *window, GtkWidget *child, @@ -2270,6 +2225,7 @@ notebook_populate_popup (MooEditWindow *window, { MooEdit *doc; MooEditView *view; + GtkWidget *item; g_return_val_if_fail (MOO_IS_EDIT_WINDOW (window), TRUE); g_return_val_if_fail (MOO_IS_EDIT_TAB (child), TRUE); @@ -2280,49 +2236,54 @@ notebook_populate_popup (MooEditWindow *window, doc = moo_edit_view_get_doc (view); /* Item in document tab context menu */ - add_tab_menu_item(C_("tab-context-menu", "Close"), - doc, window, menu, child, - G_CALLBACK(close_activated), - TRUE); + item = gtk_menu_item_new_with_label (C_("tab-context-menu", "Close")); + gtk_widget_show (item); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + g_object_set_data (G_OBJECT (item), "moo-edit", doc); + g_object_set_data (G_OBJECT (item), "moo-edit-tab", child); + g_signal_connect (item, "activate", + G_CALLBACK (close_activated), + window); if (moo_edit_window_get_n_tabs (window) > 1) { /* Item in document tab context menu */ - add_tab_menu_item(C_("tab-context-menu", "Close All Others"), - doc, window, menu, child, - G_CALLBACK(close_others_activated), - TRUE); + item = gtk_menu_item_new_with_label (C_("tab-context-menu", "Close All Others")); + gtk_widget_show (item); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + g_object_set_data (G_OBJECT (item), "moo-edit", doc); + g_object_set_data (G_OBJECT (item), "moo-edit-tab", child); + g_signal_connect (item, "activate", + G_CALLBACK (close_others_activated), + window); } - add_separator (menu); - - /* Item in document tab context menu */ - add_tab_menu_item(C_("tab-context-menu", "Copy Full Path"), - doc, window, menu, child, - G_CALLBACK(copy_full_path_activated), - !moo_edit_is_untitled (doc)); - - /* Item in document tab context menu */ - add_tab_menu_item(C_("tab-context-menu", "Open Containing Folder"), - doc, window, menu, child, - G_CALLBACK(open_containing_folder_activated), - !moo_edit_is_untitled(doc)); - if (moo_edit_window_get_n_tabs (window) > 1) { - add_separator (menu); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), + GTK_WIDGET (g_object_new (GTK_TYPE_SEPARATOR_MENU_ITEM, + "visible", TRUE, + (const char*) NULL))); /* Item in document tab context menu */ - add_tab_menu_item(C_("tab-context-menu", "Detach"), - doc, window, menu, child, - G_CALLBACK(detach_activated), - TRUE); + item = gtk_menu_item_new_with_label (C_("tab-context-menu", "Detach")); + gtk_widget_show (item); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + g_object_set_data (G_OBJECT (item), "moo-edit", doc); + g_object_set_data (G_OBJECT (item), "moo-edit-tab", child); + g_signal_connect (item, "activate", + G_CALLBACK (detach_activated), + window); /* Item in document tab context menu */ - add_tab_menu_item(C_("tab-context-menu", "Move to Split Notebook"), - doc, window, menu, child, - G_CALLBACK(move_to_split_notebook_activated), - TRUE); + item = gtk_menu_item_new_with_label (C_("tab-context-menu", "Move to Split Notebook")); + gtk_widget_show (item); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + g_object_set_data (G_OBJECT (item), "moo-edit", doc); + g_object_set_data (G_OBJECT (item), "moo-edit-tab", child); + g_signal_connect (item, "activate", + G_CALLBACK (move_to_split_notebook_activated), + window); } return FALSE; @@ -3440,6 +3401,7 @@ create_tab_label (MooEditWindow *window, { GtkWidget *frame; GtkWidget *button; + GtkWidget *icon; { static gboolean been_here; diff --git a/moo/mooedit/moolangmgr.cpp b/moo/mooedit/moolangmgr.c similarity index 89% rename from moo/mooedit/moolangmgr.cpp rename to moo/mooedit/moolangmgr.c index 95d494e8..9b8047bb 100644 --- a/moo/mooedit/moolangmgr.cpp +++ b/moo/mooedit/moolangmgr.c @@ -1,7 +1,7 @@ /* - * moolangmgr.cpp + * moolangmgr.c * - * Copyright (C) 2004-2016 by Yevgen Muntyan + * Copyright (C) 2004-2010 by Yevgen Muntyan * * This file is part of medit. medit is free software; you can * redistribute it and/or modify it under the terms of the @@ -24,11 +24,8 @@ #include "mooutils/mooprefs.h" #include "marshals.h" #include "mooutils/moo-mime.h" -#include "moocpp/moocpp.h" #include -using namespace moo; - #define LANGUAGE_DIR "language-specs" #define ELEMENT_LANG_CONFIG MOO_EDIT_PREFS_PREFIX "/langs" #define ELEMENT_LANG "lang" @@ -48,17 +45,17 @@ typedef struct { } LangInfo; static LangInfo *lang_info_new (void); -static void lang_info_free (LangInfo* info); +static void lang_info_free (LangInfo *info); -static void string_list_free (GSList* list); -static GSList *string_list_copy (GSList* list); -static void read_langs (MooLangMgr* mgr); -static void read_schemes (MooLangMgr* mgr); -static void load_config (MooLangMgr* mgr); -static MooLang *get_lang_for_filename (MooLangMgr* mgr, - const gstr& filename); -static MooLang *get_lang_for_mime_type (MooLangMgr* mgr, - const char* mime_type); +static void string_list_free (GSList *list); +static GSList *string_list_copy (GSList *list); +static void read_langs (MooLangMgr *mgr); +static void read_schemes (MooLangMgr *mgr); +static void load_config (MooLangMgr *mgr); +static MooLang *get_lang_for_filename (MooLangMgr *mgr, + const char *filename); +static MooLang *get_lang_for_mime_type (MooLangMgr *mgr, + const char *mime_type); G_DEFINE_TYPE (MooLangMgr, moo_lang_mgr, G_TYPE_OBJECT) @@ -171,7 +168,9 @@ get_lang_info (MooLangMgr *mgr, const char *lang_id, gboolean create) { - LangInfo *info = (LangInfo*) g_hash_table_lookup (mgr->langs, lang_id); + LangInfo *info; + + info = g_hash_table_lookup (mgr->langs, lang_id); if (!info && create) { @@ -190,7 +189,7 @@ string_list_copy (GSList *list) while (list) { - copy = g_slist_prepend (copy, g_strdup ((const char*) list->data)); + copy = g_slist_prepend (copy, g_strdup (list->data)); list = list->next; } @@ -200,7 +199,7 @@ string_list_copy (GSList *list) static void string_list_free (GSList *list) { - g_slist_foreach (list, (GFunc) extern_g_free, NULL); + g_slist_foreach (list, (GFunc) g_free, NULL); g_slist_free (list); } @@ -275,7 +274,7 @@ get_lang_by_extension (MooLangMgr *mgr, { GSList *g, *globs; - lang = (MooLang*) l->data; + lang = l->data; globs = _moo_lang_mgr_get_globs (mgr, _moo_lang_id (lang)); for (g = globs; !found && g != NULL; g = g->next) @@ -293,7 +292,7 @@ get_lang_by_extension (MooLangMgr *mgr, if (!found) lang = NULL; - g_slist_foreach (langs, (GFunc) extern_g_object_unref, NULL); + g_slist_foreach (langs, (GFunc) g_object_unref, NULL); g_slist_free (langs); g_free (basename); return lang; @@ -327,7 +326,7 @@ lang_mgr_get_lang_for_bak_filename (MooLangMgr *mgr, } if (base) - lang = get_lang_for_filename (mgr, gstr::wrap(base)); + lang = get_lang_for_filename (mgr, base); g_free (base); return lang; @@ -335,8 +334,8 @@ lang_mgr_get_lang_for_bak_filename (MooLangMgr *mgr, static gboolean -filename_blacklisted (MooLangMgr* mgr, - const gstr& filename) +filename_blacklisted (MooLangMgr *mgr, + const char *filename) { /* XXX bak files */ char *basename; @@ -361,8 +360,8 @@ filename_blacklisted (MooLangMgr* mgr, } static gboolean -file_blacklisted (MooLangMgr* mgr, - const gstr& filename) +file_blacklisted (MooLangMgr *mgr, + const char *filename) { /* XXX mime type */ return filename_blacklisted (mgr, filename); @@ -370,49 +369,56 @@ file_blacklisted (MooLangMgr* mgr, MooLang * -moo_lang_mgr_get_lang_for_file (MooLangMgr* mgr, - g::File file) +moo_lang_mgr_get_lang_for_file (MooLangMgr *mgr, + GFile *file) { MooLang *lang = NULL; const char *mime_type; + char *filename; g_return_val_if_fail (MOO_IS_LANG_MGR (mgr), NULL); + g_return_val_if_fail (G_IS_FILE (file), NULL); read_langs (mgr); - gstr filename = file.get_parse_name(); + filename = g_file_get_parse_name (file); if (file_blacklisted (mgr, filename)) - return lang; + goto out; lang = get_lang_by_extension (mgr, filename); if (lang) - return lang; + goto out; lang = lang_mgr_get_lang_for_bak_filename (mgr, filename); if (lang) - return lang; + goto out; mime_type = moo_get_mime_type_for_file (filename, NULL); if (mime_type != MOO_MIME_TYPE_UNKNOWN) lang = get_lang_for_mime_type (mgr, mime_type); + if (lang) + goto out; + +out: + g_free (filename); return lang; } static MooLang * -get_lang_for_filename (MooLangMgr* mgr, - const gstr& filename) +get_lang_for_filename (MooLangMgr *mgr, + const char *filename) { MooLang *lang = NULL; const char *mime_type; g_return_val_if_fail (MOO_IS_LANG_MGR (mgr), NULL); - g_return_val_if_fail (!filename.empty(), NULL); + g_return_val_if_fail (filename != NULL, NULL); read_langs (mgr); @@ -466,7 +472,7 @@ get_lang_for_mime_type (MooLangMgr *mgr, { GSList *mimetypes; - lang = (MooLang*) l->data; + lang = l->data; mimetypes = _moo_lang_mgr_get_mime_types (mgr, _moo_lang_id (lang)); if (g_slist_find_custom (mimetypes, mime, (GCompareFunc) strcmp)) @@ -479,7 +485,7 @@ get_lang_for_mime_type (MooLangMgr *mgr, { GSList *mimetypes; - lang = (MooLang*) l->data; + lang = l->data; mimetypes = _moo_lang_mgr_get_mime_types (mgr, _moo_lang_id (lang)); if (g_slist_find_custom (mimetypes, mime, (GCompareFunc) check_mime_subclass)) @@ -488,7 +494,7 @@ get_lang_for_mime_type (MooLangMgr *mgr, string_list_free (mimetypes); } - g_slist_foreach (langs, (GFunc) extern_g_object_unref, NULL); + g_slist_foreach (langs, (GFunc) g_object_unref, NULL); g_slist_free (langs); return found ? lang : NULL; } @@ -520,7 +526,7 @@ read_langs (MooLangMgr *mgr) lang = gtk_source_language_manager_get_language (mgr->lang_mgr, id); info = get_lang_info (mgr, id, TRUE); - info->lang = (MooLang*) g_object_ref (lang); + info->lang = g_object_ref (lang); if (!info->globs_modified) info->globs = _moo_lang_get_globs (info->lang); @@ -660,9 +666,9 @@ _moo_lang_mgr_set_active_scheme (MooLangMgr *mgr, read_schemes (mgr); if (name) - scheme = (MooTextStyleScheme*) g_hash_table_lookup (mgr->schemes, name); + scheme = g_hash_table_lookup (mgr->schemes, name); if (!scheme) - scheme = (MooTextStyleScheme*) g_hash_table_lookup (mgr->schemes, SCHEME_DEFAULT); + scheme = g_hash_table_lookup (mgr->schemes, SCHEME_DEFAULT); if (!scheme) g_message ("could not find style scheme '%s'", name ? name : ""); @@ -830,7 +836,7 @@ string_list_equal (GSList *list1, { while (list1 && list2) { - if (strcmp ((const char*) list1->data, (const char*) list2->data) != 0) + if (strcmp (list1->data, list2->data) != 0) return FALSE; list1 = list1->next; @@ -848,7 +854,7 @@ set_globs_or_mime_types (MooLangMgr *mgr, gboolean globs) { LangInfo *info; - GSList *new_; + GSList *new; GSList *old = NULL; GSList **ptr; char *id = NULL; @@ -861,15 +867,15 @@ set_globs_or_mime_types (MooLangMgr *mgr, g_return_if_fail (info != NULL); - new_ = _moo_lang_parse_string_list (string); + new = _moo_lang_parse_string_list (string); old = globs ? _moo_lang_mgr_get_globs (mgr, id) : _moo_lang_mgr_get_mime_types (mgr, id); - if (string_list_equal (new_, old)) + if (string_list_equal (new, old)) { g_free (id); string_list_free (old); - string_list_free (new_); + string_list_free (new); return; } @@ -880,7 +886,7 @@ set_globs_or_mime_types (MooLangMgr *mgr, { GSList *builtin = globs ? _moo_lang_get_globs (info->lang) : _moo_lang_get_mime_types (info->lang); - modified = !string_list_equal (builtin, new_); + modified = !string_list_equal (builtin, new); if (modified) { @@ -888,14 +894,14 @@ set_globs_or_mime_types (MooLangMgr *mgr, } else { - string_list_free (new_); - new_ = builtin; + string_list_free (new); + new = builtin; } } ptr = globs ? &info->globs : &info->mime_types; string_list_free (*ptr); - *ptr = new_; + *ptr = new; if (globs) info->globs_modified = modified; @@ -936,7 +942,7 @@ _moo_lang_mgr_get_config (MooLangMgr *mgr, read_langs (mgr); id = _moo_lang_id_from_name (lang_id); - config = (const char*)g_hash_table_lookup (mgr->config, id); + config = g_hash_table_lookup (mgr->config, id); g_free (id); return config; @@ -968,7 +974,7 @@ _moo_lang_mgr_set_config (MooLangMgr *mgr, } id = _moo_lang_id_from_name (lang_id); - old = (const char*)g_hash_table_lookup (mgr->config, id); + old = g_hash_table_lookup (mgr->config, id); if (!moo_str_equal (old, norm)) mgr->modified = TRUE; @@ -1010,7 +1016,7 @@ list_to_string (GSList *list) while (list) { - g_string_append (string, (const char*) list->data); + g_string_append (string, list->data); if ((list = list->next)) g_string_append_c (string, ';'); @@ -1027,14 +1033,14 @@ save_one (const char *lang_id, const char *config; MooMarkupNode *lang_node; - struct Data { + struct { MooLangMgr *mgr; MooMarkupNode *xml; MooMarkupNode *root; - }; + } *data; - Data* data = (Data*) user_data; - config = (const char*)g_hash_table_lookup (data->mgr->config, lang_id); + data = user_data; + config = g_hash_table_lookup (data->mgr->config, lang_id); if (!config && !info->globs_modified && !info->mime_types_modified) return; diff --git a/moo/mooedit/moolangmgr.h b/moo/mooedit/moolangmgr.h index d17127cd..9d4f1f16 100644 --- a/moo/mooedit/moolangmgr.h +++ b/moo/mooedit/moolangmgr.h @@ -19,9 +19,6 @@ #include #include #include -#ifdef __cplusplus -#include -#endif G_BEGIN_DECLS @@ -38,48 +35,46 @@ GType moo_lang_mgr_get_type (void) G_GNUC_CONST; MooLangMgr *moo_lang_mgr_new (void); MooLangMgr *moo_lang_mgr_default (void); -MooLang *moo_lang_mgr_get_lang (MooLangMgr* mgr, - const char* lang_id); -#ifdef __cplusplus -MooLang *moo_lang_mgr_get_lang_for_file (MooLangMgr* mgr, - g::File& file); -#endif // __cplusplus +MooLang *moo_lang_mgr_get_lang (MooLangMgr *mgr, + const char *lang_id); +MooLang *moo_lang_mgr_get_lang_for_file (MooLangMgr *mgr, + GFile *file); /* list must be freed, content unref'ed */ -GSList *moo_lang_mgr_get_available_langs (MooLangMgr* mgr); +GSList *moo_lang_mgr_get_available_langs (MooLangMgr *mgr); /* list must be freed together with content */ -GSList *moo_lang_mgr_get_sections (MooLangMgr* mgr); +GSList *moo_lang_mgr_get_sections (MooLangMgr *mgr); -MooLang *_moo_lang_mgr_find_lang (MooLangMgr* mgr, - const char* name); +MooLang *_moo_lang_mgr_find_lang (MooLangMgr *mgr, + const char *name); -MooTextStyleScheme *moo_lang_mgr_get_active_scheme (MooLangMgr* mgr); -void _moo_lang_mgr_set_active_scheme (MooLangMgr* mgr, - const char* scheme_name); +MooTextStyleScheme *moo_lang_mgr_get_active_scheme (MooLangMgr *mgr); +void _moo_lang_mgr_set_active_scheme (MooLangMgr *mgr, + const char *scheme_name); /* list must be freed, content unref'ed */ -GSList *moo_lang_mgr_list_schemes (MooLangMgr* mgr); +GSList *moo_lang_mgr_list_schemes (MooLangMgr *mgr); /* list must be freed together with content */ -GSList *_moo_lang_mgr_get_globs (MooLangMgr* mgr, - const char* lang_id); +GSList *_moo_lang_mgr_get_globs (MooLangMgr *mgr, + const char *lang_id); /* list must be freed together with content */ -GSList *_moo_lang_mgr_get_mime_types (MooLangMgr* mgr, - const char* lang_id); -void _moo_lang_mgr_set_mime_types (MooLangMgr* mgr, - const char* lang_id, - const char* mime); -void _moo_lang_mgr_set_globs (MooLangMgr* mgr, - const char* lang_id, - const char* globs); -const char *_moo_lang_mgr_get_config (MooLangMgr* mgr, - const char* lang_id); -void _moo_lang_mgr_set_config (MooLangMgr* mgr, - const char* lang_id, - const char* config); -void _moo_lang_mgr_update_config (MooLangMgr* mgr, - MooEditConfig* config, - const char* lang_id); -void _moo_lang_mgr_save_config (MooLangMgr* mgr); +GSList *_moo_lang_mgr_get_mime_types (MooLangMgr *mgr, + const char *lang_id); +void _moo_lang_mgr_set_mime_types (MooLangMgr *mgr, + const char *lang_id, + const char *mime); +void _moo_lang_mgr_set_globs (MooLangMgr *mgr, + const char *lang_id, + const char *globs); +const char *_moo_lang_mgr_get_config (MooLangMgr *mgr, + const char *lang_id); +void _moo_lang_mgr_set_config (MooLangMgr *mgr, + const char *lang_id, + const char *config); +void _moo_lang_mgr_update_config (MooLangMgr *mgr, + MooEditConfig *config, + const char *lang_id); +void _moo_lang_mgr_save_config (MooLangMgr *mgr); G_END_DECLS diff --git a/moo/mooedit/moolinemark.c b/moo/mooedit/moolinemark.c index bebfe377..06437d32 100644 --- a/moo/mooedit/moolinemark.c +++ b/moo/mooedit/moolinemark.c @@ -27,6 +27,7 @@ struct MooLineMarkPrivate { GdkColor background; + GdkGC *background_gc; char *stock_id; GdkPixbuf *pixbuf; @@ -62,6 +63,7 @@ static void moo_line_mark_get_property (GObject *object, GParamSpec *pspec); static void moo_line_mark_changed (MooLineMark *mark); +static void update_background_gc (MooLineMark *mark); static void update_pixbuf (MooLineMark *mark); static void moo_line_mark_deleted_real (MooLineMark *mark); @@ -194,6 +196,8 @@ moo_line_mark_finalize (GObject *object) if (mark->priv->pixbuf) g_object_unref (mark->priv->pixbuf); + if (mark->priv->background_gc) + g_object_unref (mark->priv->background_gc); g_free (mark->priv->stock_id); g_free (mark->priv->markup); @@ -328,6 +332,8 @@ moo_line_mark_set_background_gdk (MooLineMark *mark, } } + update_background_gc (mark); + if (notify_set || notify_bg) { g_object_freeze_notify (G_OBJECT (mark)); @@ -553,6 +559,59 @@ moo_line_mark_get_pixbuf (MooLineMark *mark) } +static void +update_background_gc (MooLineMark *mark) +{ + GHashTable *cache; + GdkGC *gc; + + if (!mark->priv->realized || !mark->priv->background_set) + { + if (mark->priv->background_gc) + g_object_unref (mark->priv->background_gc); + mark->priv->background_gc = NULL; + return; + } + + g_assert (mark->priv->widget != NULL); + g_return_if_fail (GTK_IS_WIDGET (mark->priv->widget)); + g_return_if_fail (GTK_WIDGET_REALIZED (mark->priv->widget)); + + cache = g_object_get_data (G_OBJECT (mark->priv->widget), + "moo-line-mark-colors"); + + if (!cache) + { + cache = g_hash_table_new_full ((GHashFunc) gdk_color_hash, + (GEqualFunc) gdk_color_equal, + (GDestroyNotify) gdk_color_free, + g_object_unref); + g_object_set_data_full (G_OBJECT (mark->priv->widget), + "moo-line-mark-colors", cache, + (GDestroyNotify) g_hash_table_destroy); + } + + gc = g_hash_table_lookup (cache, &mark->priv->background); + + if (!gc) + { + GdkColormap *colormap; + + colormap = gtk_widget_get_colormap (mark->priv->widget); + g_return_if_fail (colormap != NULL); + + gc = gdk_gc_new (mark->priv->widget->window); + gdk_colormap_alloc_color (colormap, + &mark->priv->background, + TRUE, TRUE); + gdk_gc_set_foreground (gc, &mark->priv->background); + g_hash_table_insert (cache, gdk_color_copy (&mark->priv->background), gc); + } + + mark->priv->background_gc = g_object_ref (gc); +} + + static void update_pixbuf (MooLineMark *mark) { @@ -606,6 +665,7 @@ _moo_line_mark_realize (MooLineMark *mark, mark->priv->realized = TRUE; mark->priv->widget = widget; + update_background_gc (mark); update_pixbuf (mark); } @@ -619,6 +679,10 @@ _moo_line_mark_unrealize (MooLineMark *mark) mark->priv->realized = FALSE; mark->priv->widget = NULL; + if (mark->priv->background_gc) + g_object_unref (mark->priv->background_gc); + mark->priv->background_gc = NULL; + if (mark->priv->pixbuf && mark->priv->stock_id) { g_object_unref (mark->priv->pixbuf); @@ -627,11 +691,11 @@ _moo_line_mark_unrealize (MooLineMark *mark) } -const GdkColor * -moo_line_mark_get_background(MooLineMark *mark) +GdkGC * +moo_line_mark_get_background_gc (MooLineMark *mark) { g_return_val_if_fail (MOO_IS_LINE_MARK (mark), NULL); - return mark->priv->background_set ? &mark->priv->background : NULL; + return mark->priv->background_gc; } diff --git a/moo/mooedit/moolinemark.h b/moo/mooedit/moolinemark.h index 36b21637..229f5843 100644 --- a/moo/mooedit/moolinemark.h +++ b/moo/mooedit/moolinemark.h @@ -86,7 +86,7 @@ void moo_line_mark_set_markup (MooLineMark *mark, const char *moo_line_mark_get_stock_id (MooLineMark *mark); GdkPixbuf *moo_line_mark_get_pixbuf (MooLineMark *mark); const char *moo_line_mark_get_markup (MooLineMark *mark); -const GdkColor *moo_line_mark_get_background (MooLineMark *mark); +GdkGC *moo_line_mark_get_background_gc (MooLineMark *mark); G_END_DECLS diff --git a/moo/mooedit/mootextbtree.c b/moo/mooedit/mootextbtree.c index 9fb10f38..d56f325f 100644 --- a/moo/mooedit/mootextbtree.c +++ b/moo/mooedit/mootextbtree.c @@ -333,7 +333,7 @@ merge_nodes (BTNode *parent, guint first) MOO_ELMCPY (node->u.children + node->n_children, next->u.children, next->n_children); - for (i = node->n_children; i < (guint) node->n_children + (guint) next->n_children; ++i) + for (i = node->n_children; i < node->n_children + next->n_children; ++i) node->u.children[i]->parent = node; node->n_children += next->n_children; diff --git a/moo/mooedit/mootextview-input.c b/moo/mooedit/mootextview-input.c index e857357c..6f666b93 100644 --- a/moo/mooedit/mootextview-input.c +++ b/moo/mooedit/mootextview-input.c @@ -457,7 +457,7 @@ _moo_text_view_update_text_cursor (MooTextView *view, static void set_invisible_cursor (GdkWindow *window) { - GdkDisplay *display = gdk_window_get_display (window); + GdkDisplay *display = gdk_drawable_get_display (window); GdkCursor *cursor = gdk_cursor_new_for_display (display, GDK_BLANK_CURSOR); gdk_window_set_cursor (window, cursor); gdk_cursor_unref (cursor); @@ -550,7 +550,7 @@ left_window_click (GtkTextView *text_view, MooTextView *view = MOO_TEXT_VIEW (text_view); *line_numbers = FALSE; - window_width = gdk_window_get_width (event->window); + gdk_drawable_get_size (event->window, &window_width, NULL); if (view->priv->lm.show_icons && event->x >= 0 && event->x < view->priv->lm.icon_width) { @@ -1136,9 +1136,9 @@ start_drag_scroll (MooTextView *view) { if (!view->priv->dnd.scroll_timeout) view->priv->dnd.scroll_timeout = - g_timeout_add (SCROLL_TIMEOUT, - (GSourceFunc)drag_scroll_timeout_func, - view); + gdk_threads_add_timeout (SCROLL_TIMEOUT, + (GSourceFunc)drag_scroll_timeout_func, + view); drag_scroll_timeout_func (view); } @@ -1163,8 +1163,8 @@ drag_scroll_timeout_func (MooTextView *view) GtkTextBuffer *buffer; GtkTextWindowType win_type; - g_return_val_if_fail (view->priv->dnd.type == MOO_TEXT_VIEW_DRAG_SELECT || - view->priv->dnd.type == MOO_TEXT_VIEW_DRAG_SELECT_LINES, FALSE); + g_assert (view->priv->dnd.type == MOO_TEXT_VIEW_DRAG_SELECT || + view->priv->dnd.type == MOO_TEXT_VIEW_DRAG_SELECT_LINES); text_view = GTK_TEXT_VIEW (view); buffer = gtk_text_view_get_buffer (text_view); diff --git a/moo/mooedit/mootextview-private.h b/moo/mooedit/mootextview-private.h index a1ff97d8..272d2146 100644 --- a/moo/mooedit/mootextview-private.h +++ b/moo/mooedit/mootextview-private.h @@ -110,7 +110,7 @@ struct MooTextViewPrivate { guint tab_width; gboolean color_settings[MOO_TEXT_VIEW_N_COLORS]; char *colors[MOO_TEXT_VIEW_N_COLORS]; - GdkColor *gcs[MOO_TEXT_VIEW_N_COLORS]; + GdkGC *gcs[MOO_TEXT_VIEW_N_COLORS]; guint right_margin_offset; int right_margin_pixel_offset; MooDrawWsFlags draw_whitespace; diff --git a/moo/mooedit/mootextview.c b/moo/mooedit/mootextview.c index 37645be5..e4cd0e9a 100644 --- a/moo/mooedit/mootextview.c +++ b/moo/mooedit/mootextview.c @@ -1651,11 +1651,11 @@ moo_text_view_move_cursor (MooTextView *view, mview = MOO_TEXT_VIEW (view); mview->priv->move_cursor_idle = - g_idle_add_full (G_PRIORITY_HIGH_IDLE + 9, /* between gtktextview's first validate priority and - * GTK_PRIORITY_RESIZE */ - (GSourceFunc) do_move_cursor, - g_memdup (&scroll, sizeof scroll), - g_free); + gdk_threads_add_idle_full (G_PRIORITY_HIGH_IDLE + 9, /* between gtktextview's first validate priority and + * GTK_PRIORITY_RESIZE */ + (GSourceFunc) do_move_cursor, + g_memdup (&scroll, sizeof scroll), + g_free); } } @@ -2154,7 +2154,7 @@ invalidate_gcs (MooTextView *view) for (i = 0; i < MOO_TEXT_VIEW_N_COLORS; ++i) { if (view->priv->gcs[i]) - gdk_color_free(view->priv->gcs[i]); + g_object_unref (view->priv->gcs[i]); view->priv->gcs[i] = NULL; } } @@ -2165,6 +2165,7 @@ update_gc (MooTextView *view, { GdkColor color; GtkWidget *widget = GTK_WIDGET (view); + GdkColormap *colormap; GdkWindow *window; if (!GTK_WIDGET_REALIZED (widget)) @@ -2176,7 +2177,7 @@ update_gc (MooTextView *view, { if (view->priv->gcs[color_num]) { - gdk_color_free(view->priv->gcs[color_num]); + g_object_unref (view->priv->gcs[color_num]); view->priv->gcs[color_num] = NULL; } @@ -2186,6 +2187,9 @@ update_gc (MooTextView *view, if (view->priv->gcs[color_num]) return; + colormap = gtk_widget_get_colormap (widget); + g_return_if_fail (colormap != NULL); + window = gtk_text_view_get_window (GTK_TEXT_VIEW (view), GTK_TEXT_WINDOW_TEXT); g_return_if_fail (window != NULL); @@ -2198,6 +2202,11 @@ update_gc (MooTextView *view, view->priv->colors[color_num]); color = widget->style->bg[GTK_STATE_NORMAL]; } + else if (!gdk_colormap_alloc_color (colormap, &color, FALSE, TRUE)) + { + g_warning ("failed to allocate color"); + color = widget->style->bg[GTK_STATE_NORMAL]; + } } else { @@ -2205,7 +2214,9 @@ update_gc (MooTextView *view, } if (!view->priv->gcs[color_num]) - view->priv->gcs[color_num] = gdk_color_copy(&color); + view->priv->gcs[color_num] = gdk_gc_new (window); + + gdk_gc_set_foreground (view->priv->gcs[color_num], &color); } static void @@ -2221,21 +2232,16 @@ moo_text_view_draw_right_margin (GtkTextView *text_view, GdkEventExpose *event) { int x, y; - cairo_t *cr; MooTextView *view = MOO_TEXT_VIEW (text_view); update_right_margin (view); - y = gdk_window_get_height(event->window); + gdk_drawable_get_size (event->window, NULL, &y); x = view->priv->right_margin_pixel_offset + gtk_text_view_get_left_margin (text_view); if (text_view->hadjustment) x -= text_view->hadjustment->value; - - cr = gdk_cairo_create(event->window); - gdk_cairo_set_source_color(cr, view->priv->gcs[MOO_TEXT_VIEW_COLOR_RIGHT_MARGIN]); - cairo_rectangle(cr, x, 0, 1, y); - cairo_fill(cr); - cairo_destroy(cr); + gdk_draw_rectangle (event->window, view->priv->gcs[MOO_TEXT_VIEW_COLOR_RIGHT_MARGIN], + TRUE, x, 0, 1, y); } static void @@ -2267,7 +2273,6 @@ moo_text_view_draw_current_line (GtkTextView *text_view, int y, height; int win_y; int margin; - cairo_t *cr; gtk_text_buffer_get_iter_at_mark (text_view->buffer, &cur, @@ -2299,15 +2304,13 @@ moo_text_view_draw_current_line (GtkTextView *text_view, else margin = gtk_text_view_get_left_margin (text_view); - cr = gdk_cairo_create (event->window); - cairo_set_source_rgb(cr, 0.1, 0.1, 0.1); - gdk_cairo_set_source_color(cr, MOO_TEXT_VIEW(text_view)->priv->gcs[MOO_TEXT_VIEW_COLOR_CURRENT_LINE]); - cairo_rectangle(cr, redraw_rect.x + MAX(0, margin - 1), - win_y, - redraw_rect.width, - height); - cairo_fill(cr); - cairo_destroy(cr); + gdk_draw_rectangle (event->window, + MOO_TEXT_VIEW(text_view)->priv->gcs[MOO_TEXT_VIEW_COLOR_CURRENT_LINE], + TRUE, + redraw_rect.x + MAX (0, margin - 1), + win_y, + redraw_rect.width, + height); } @@ -2526,9 +2529,9 @@ highlight_updated (GtkTextView *text_view, if (!view->priv->update_idle) view->priv->update_idle = - g_idle_add_full (G_PRIORITY_HIGH_IDLE, - (GSourceFunc) invalidate_rectangle, - view, NULL); + gdk_threads_add_idle_full (G_PRIORITY_HIGH_IDLE, + (GSourceFunc) invalidate_rectangle, + view, NULL); } else { @@ -2892,9 +2895,9 @@ buffer_changed (MooTextView *view) !view->priv->update_n_lines_idle) { view->priv->update_n_lines_idle = - g_idle_add_full (G_PRIORITY_HIGH, - (GSourceFunc) update_n_lines_idle, - view, NULL); + gdk_threads_add_idle_full (G_PRIORITY_HIGH, + (GSourceFunc) update_n_lines_idle, + view, NULL); } } @@ -2993,7 +2996,7 @@ draw_left_margin (MooTextView *view, text_view = GTK_TEXT_VIEW (view); buffer = gtk_text_view_get_buffer (text_view); - window_width = gdk_window_get_width (event->window); + gdk_drawable_get_size (event->window, &window_width, NULL); text_width = 0; mark_icon_width = 0; @@ -3103,7 +3106,6 @@ draw_marks_background (MooTextView *view, int line, window_width; GdkRectangle area; GtkTextIter iter; - cairo_t* cr = NULL; text_view = GTK_TEXT_VIEW (view); @@ -3113,7 +3115,7 @@ draw_marks_background (MooTextView *view, area.x, area.y, &area.x, &area.y); - window_width = gdk_window_get_width (event->window); + gdk_drawable_get_size (event->window, &window_width, NULL); window_width -= gtk_text_view_get_left_margin (text_view); gtk_text_view_get_line_at_y (text_view, &iter, area.y, NULL); @@ -3142,7 +3144,7 @@ draw_marks_background (MooTextView *view, if (TRUE) { MooLineMark *mark; - const GdkColor *color = NULL; + GdkGC *gc = NULL; GSList *marks = moo_text_buffer_get_line_marks_at_line (get_moo_buffer (view), line); if (marks) @@ -3152,26 +3154,25 @@ draw_marks_background (MooTextView *view, mark = marks->data; if (_moo_line_mark_get_pretty (mark)) - color = moo_line_mark_get_background (mark); + gc = moo_line_mark_get_background_gc (mark); - if (!color) + if (!gc) marks = g_slist_delete_link (marks, marks); else break; } /* XXX compose colors */ - if (color) + if (gc) { - if (!cr) - cr = gdk_cairo_create(event->window); - - gdk_cairo_set_source_color (cr, color); - cairo_rectangle(cr, gtk_text_view_get_left_margin(text_view), - y, - window_width, - height); - cairo_fill (cr); + gdk_gc_set_clip_rectangle (gc, &event->area); + gdk_draw_rectangle (event->window, + gc, + TRUE, + gtk_text_view_get_left_margin (text_view), + y, + window_width, + height); } } @@ -3181,9 +3182,6 @@ draw_marks_background (MooTextView *view, if (!text_iter_forward_visible_line (view, &iter, &line)) break; } - - if (cr) - cairo_destroy(cr); } @@ -3429,7 +3427,7 @@ invalidate_line (MooTextView *view, GTK_TEXT_WINDOW_LEFT); if (window) { - rect.width = gdk_window_get_width (window); + gdk_drawable_get_size (window, &rect.width, NULL); gdk_window_invalidate_rect (window, &rect, FALSE); } } @@ -3440,7 +3438,7 @@ invalidate_line (MooTextView *view, GTK_TEXT_WINDOW_TEXT); if (window) { - rect.width = gdk_window_get_width (window); + gdk_drawable_get_size (window, &rect.width, NULL); gdk_window_invalidate_rect (window, &rect, FALSE); } } diff --git a/moo/moofileview/Makefile.incl b/moo/moofileview/Makefile.incl index 44270a6a..deff547b 100644 --- a/moo/moofileview/Makefile.incl +++ b/moo/moofileview/Makefile.incl @@ -1,36 +1,36 @@ AM_CPPFLAGS += -Imoofileview -Imoofileview/glade moo_sources += \ - moofileview/moobookmarkmgr.cpp \ + moofileview/moobookmarkmgr.c \ moofileview/moobookmarkmgr.h \ - moofileview/moobookmarkview.cpp \ + moofileview/moobookmarkview.c \ moofileview/moobookmarkview.h \ - moofileview/moofile.cpp \ + moofileview/moofile.c \ moofileview/moofile.h \ moofileview/moofile-private.h \ - moofileview/moofileentry.cpp \ + moofileview/moofileentry.c \ moofileview/moofileentry.h \ - moofileview/moofilesystem.cpp \ + moofileview/moofilesystem.c \ moofileview/moofilesystem.h \ - moofileview/moofileview.cpp \ + moofileview/moofileview.c \ moofileview/moofileview.h \ moofileview/moofileview-accels.h \ moofileview/moofileview-aux.h \ - moofileview/moofileview-dialogs.cpp \ + moofileview/moofileview-dialogs.c \ moofileview/moofileview-dialogs.h \ moofileview/moofileview-impl.h \ moofileview/moofileview-private.h \ - moofileview/moofileview-tools.cpp \ + moofileview/moofileview-tools.c \ moofileview/moofileview-tools.h \ moofileview/moofolder-private.h \ - moofileview/moofolder.cpp \ + moofileview/moofolder.c \ moofileview/moofolder.h \ - moofileview/moofoldermodel.cpp \ + moofileview/moofoldermodel.c \ moofileview/moofoldermodel.h \ moofileview/moofoldermodel-private.h \ - moofileview/mooiconview.cpp \ + moofileview/mooiconview.c \ moofileview/mooiconview.h \ - moofileview/mootreeview.cpp \ + moofileview/mootreeview.c \ moofileview/mootreeview.h EXTRA_DIST += \ diff --git a/moo/moofileview/moobookmarkmgr.cpp b/moo/moofileview/moobookmarkmgr.c similarity index 72% rename from moo/moofileview/moobookmarkmgr.cpp rename to moo/moofileview/moobookmarkmgr.c index e5dd36ae..27b1da97 100644 --- a/moo/moofileview/moobookmarkmgr.cpp +++ b/moo/moofileview/moobookmarkmgr.c @@ -31,35 +31,20 @@ #include #endif #include -#include #include -using namespace moo; - #define COLUMN_BOOKMARK MOO_BOOKMARK_MGR_COLUMN_BOOKMARK -struct UserInfo -{ - g::ObjectRawPtr user; - gobj_raw_ptr xml; - gobj_raw_ptr actions; - gstr path; - guint user_id = 0; - guint merge_id = 0; - std::vector bm_actions; +struct _MooBookmarkMgrPrivate { + GtkListStore *store; + GSList *users; + GtkWidget *editor; + gboolean loading; + guint last_user_id; + guint update_idle; }; -typedef std::shared_ptr UserInfoPtr; - -struct MooBookmarkMgrPrivate -{ - gtk::ListStorePtr store; - std::vector users; - gtk::WidgetPtr editor; - bool loading = false; - guint last_user_id = 0; - guint update_idle = 0; -}; +typedef struct _UserInfo UserInfo; static void moo_bookmark_mgr_finalize (GObject *object); @@ -71,11 +56,10 @@ static void moo_bookmark_mgr_load (MooBookmarkMgr *mgr); static void moo_bookmark_mgr_save (MooBookmarkMgr *mgr); static void mgr_remove_user (MooBookmarkMgr *mgr, - UserInfo &info); + UserInfo *info); static gboolean mgr_update_menus (MooBookmarkMgr *mgr); static MooBookmark *_moo_bookmark_copy (MooBookmark *bookmark); -static void _moo_bookmark_free (MooBookmark *bookmark); MOO_DEFINE_BOXED_TYPE_C (MooBookmark, _moo_bookmark) @@ -122,39 +106,46 @@ _moo_bookmark_mgr_class_init (MooBookmarkMgrClass *klass) static void _moo_bookmark_mgr_init (MooBookmarkMgr *mgr) { - mgr->priv = new MooBookmarkMgrPrivate(); + mgr->priv = g_new0 (MooBookmarkMgrPrivate, 1); - mgr->priv->store = gtk::ListStore::create ({ MOO_TYPE_BOOKMARK }); + mgr->priv->store = gtk_list_store_new (1, MOO_TYPE_BOOKMARK); - mgr->priv->store->connect_swapped ("row-changed", G_CALLBACK (emit_changed), mgr); - mgr->priv->store->connect_swapped ("rows-reordered", G_CALLBACK (emit_changed), mgr); - mgr->priv->store->connect_swapped ("row-inserted", G_CALLBACK (emit_changed), mgr); - mgr->priv->store->connect_swapped ("row-deleted", G_CALLBACK (emit_changed), mgr); + g_signal_connect_swapped (mgr->priv->store, "row-changed", + G_CALLBACK (emit_changed), mgr); + g_signal_connect_swapped (mgr->priv->store, "rows-reordered", + G_CALLBACK (emit_changed), mgr); + g_signal_connect_swapped (mgr->priv->store, "row-inserted", + G_CALLBACK (emit_changed), mgr); + g_signal_connect_swapped (mgr->priv->store, "row-deleted", + G_CALLBACK (emit_changed), mgr); } static void moo_bookmark_mgr_finalize (GObject *object) { + GSList *l, *users; MooBookmarkMgr *mgr = MOO_BOOKMARK_MGR (object); + g_object_unref (mgr->priv->store); + if (mgr->priv->update_idle) g_source_remove (mgr->priv->update_idle); if (mgr->priv->editor) { - mgr->priv->editor->destroy (); - mgr->priv->editor = nullptr; + gtk_widget_destroy (mgr->priv->editor); + g_object_unref (mgr->priv->editor); } - std::vector users = mgr->priv->users; - for (const auto& u: users) - mgr_remove_user (mgr, *u); - g_assert (mgr->priv->users.empty()); - users.clear (); + users = g_slist_copy (mgr->priv->users); + for (l = users; l != NULL; l = l->next) + mgr_remove_user (mgr, l->data); + g_assert (mgr->priv->users == NULL); + g_slist_free (users); - delete mgr->priv; - mgr->priv = nullptr; + g_free (mgr->priv); + mgr->priv = NULL; G_OBJECT_CLASS (_moo_bookmark_mgr_parent_class)->finalize (object); } @@ -173,21 +164,24 @@ moo_bookmark_mgr_changed (MooBookmarkMgr *mgr) if (!mgr->priv->loading) moo_bookmark_mgr_save (mgr); if (!mgr->priv->update_idle) - mgr->priv->update_idle = g_idle_add ((GSourceFunc) mgr_update_menus, mgr); + mgr->priv->update_idle = gdk_threads_add_idle ((GSourceFunc) mgr_update_menus, mgr); } void -_moo_bookmark_mgr_add (MooBookmarkMgr *mgr, objp bookmark) +_moo_bookmark_mgr_add (MooBookmarkMgr *mgr, + MooBookmark *bookmark) { + GtkTreeIter iter; + g_return_if_fail (MOO_IS_BOOKMARK_MGR (mgr)); - g_return_if_fail (bookmark != nullptr); + g_return_if_fail (bookmark != NULL); /* XXX validate bookmark */ - GtkTreeIter iter; - mgr->priv->store->append (iter); - mgr->priv->store->set (iter, COLUMN_BOOKMARK, bookmark.release()); + gtk_list_store_append (mgr->priv->store, &iter); + gtk_list_store_set (mgr->priv->store, &iter, + COLUMN_BOOKMARK, bookmark, -1); } @@ -196,54 +190,78 @@ moo_bookmark_mgr_add_separator (MooBookmarkMgr *mgr) { GtkTreeIter iter; g_return_if_fail (MOO_IS_BOOKMARK_MGR (mgr)); - mgr->priv->store->append (iter); + gtk_list_store_append (mgr->priv->store, &iter); } MooBookmarkMgr * _moo_bookmark_mgr_new (void) { - auto mgr = create_gobj (); - moo_bookmark_mgr_load (mgr.gobj ()); - return mgr.release (); + MooBookmarkMgr *mgr = MOO_BOOKMARK_MGR (g_object_new (MOO_TYPE_BOOKMARK_MGR, (const char*) NULL)); + moo_bookmark_mgr_load (mgr); + return mgr; } -gtk::TreeModelPtr +GtkTreeModel * _moo_bookmark_mgr_get_model (MooBookmarkMgr *mgr) { - g_return_val_if_fail (MOO_IS_BOOKMARK_MGR (mgr), nullptr); - return mgr->priv->store; + g_return_val_if_fail (MOO_IS_BOOKMARK_MGR (mgr), NULL); + return GTK_TREE_MODEL (mgr->priv->store); } -MooBookmark::MooBookmark (const char* label, - const char* path, - const char* icon) - : path (path, mem_transfer::make_copy) - , display_path (path ? g::filename_display_name (path) : gstr::null) - , label(label, mem_transfer::make_copy) - , icon_stock_id(icon, mem_transfer::make_copy) +MooBookmark* +_moo_bookmark_new (const char *label, + const char *path, + const char *icon) { -} + MooBookmark *bookmark; -MooBookmark::~MooBookmark () -{ + bookmark = g_new0 (MooBookmark, 1); + + bookmark->path = g_strdup (path); + bookmark->display_path = path ? g_filename_display_name (path) : NULL; + bookmark->label = g_strdup (label); + bookmark->icon_stock_id = g_strdup (icon); + + return bookmark; } static MooBookmark* _moo_bookmark_copy (MooBookmark *bookmark) { + MooBookmark *copy; + g_return_val_if_fail (bookmark != NULL, NULL); - return new MooBookmark (*bookmark); + + copy = g_new0 (MooBookmark, 1); + + copy->path = g_strdup (bookmark->path); + copy->display_path = g_strdup (bookmark->display_path); + copy->label = g_strdup (bookmark->label); + copy->icon_stock_id = g_strdup (bookmark->icon_stock_id); + if (bookmark->pixbuf) + copy->pixbuf = g_object_ref (bookmark->pixbuf); + + return copy; } -static void +void _moo_bookmark_free (MooBookmark *bookmark) { - delete bookmark; + if (bookmark) + { + g_free (bookmark->path); + g_free (bookmark->display_path); + g_free (bookmark->label); + g_free (bookmark->icon_stock_id); + if (bookmark->pixbuf) + g_object_unref (bookmark->pixbuf); + g_free (bookmark); + } } @@ -271,14 +289,17 @@ static void _moo_bookmark_set_display_path (MooBookmark *bookmark, const char *display_path) { + char *path; g_return_if_fail (bookmark != NULL); g_return_if_fail (display_path != NULL); - gstr path = g::filename_from_utf8 (display_path); - g_return_if_fail (!path.empty()); + path = g_filename_from_utf8 (display_path, -1, NULL, NULL, NULL); + g_return_if_fail (path != NULL); + g_free (bookmark->path); + g_free (bookmark->display_path); bookmark->path = path; - bookmark->display_path.set (display_path); + bookmark->display_path = g_strdup (display_path); } @@ -314,9 +335,11 @@ moo_bookmark_mgr_load (MooBookmarkMgr *mgr) if (!strcmp (node->name, ELEMENT_BOOKMARK)) { + MooBookmark *bookmark; const char *label = moo_markup_get_prop (node, PROP_LABEL); const char *icon = moo_markup_get_prop (node, PROP_ICON); const char *path_utf8 = moo_markup_get_content (node); + char *path; if (!path_utf8 || !path_utf8[0]) { @@ -324,16 +347,19 @@ moo_bookmark_mgr_load (MooBookmarkMgr *mgr) continue; } - gstr path = g::filename_from_utf8 (path_utf8); + path = g_filename_from_utf8 (path_utf8, -1, NULL, NULL, NULL); - if (path.empty()) + if (!path) { g_warning ("could not convert '%s' to filename encoding", path_utf8); continue; } - auto bookmark = objp::make (label ? label : path_utf8, path, icon); - _moo_bookmark_mgr_add (mgr, std::move (bookmark)); + bookmark = _moo_bookmark_new (label ? label : path_utf8, path, icon); + _moo_bookmark_mgr_add (mgr, bookmark); + + _moo_bookmark_free (bookmark); + g_free (path); } else if (!strcmp (node->name, ELEMENT_SEPARATOR)) { @@ -354,19 +380,20 @@ moo_bookmark_mgr_save (MooBookmarkMgr *mgr) { MooMarkupNode *xml; MooMarkupNode *root; + GtkTreeModel *model; + GtkTreeIter iter; xml = moo_prefs_get_markup (MOO_PREFS_RC); g_return_if_fail (xml != NULL); + model = GTK_TREE_MODEL (mgr->priv->store); + root = moo_markup_get_element (xml, BOOKMARKS_ROOT); if (root) moo_markup_delete_node (root); - gtk::ListStore& model = *mgr->priv->store; - - GtkTreeIter iter; - if (!model.get_iter_first (iter)) + if (!gtk_tree_model_get_iter_first (model, &iter)) return; root = moo_markup_create_element (xml, BOOKMARKS_ROOT); @@ -374,10 +401,10 @@ moo_bookmark_mgr_save (MooBookmarkMgr *mgr) do { - objp bookmark; + MooBookmark *bookmark = NULL; MooMarkupNode *elm; - model.get (iter, COLUMN_BOOKMARK, bookmark); + gtk_tree_model_get (model, &iter, COLUMN_BOOKMARK, &bookmark, -1); if (!bookmark) { @@ -389,10 +416,12 @@ moo_bookmark_mgr_save (MooBookmarkMgr *mgr) elm = moo_markup_create_text_element (root, ELEMENT_BOOKMARK, bookmark->display_path); moo_markup_set_prop (elm, PROP_LABEL, bookmark->label); - if (!bookmark->icon_stock_id.empty()) + if (bookmark->icon_stock_id) moo_markup_set_prop (elm, PROP_ICON, bookmark->icon_stock_id); + + _moo_bookmark_free (bookmark); } - while (model.iter_next (iter)); + while (gtk_tree_model_iter_next (model, &iter)); } @@ -400,31 +429,53 @@ moo_bookmark_mgr_save (MooBookmarkMgr *mgr) /* Bookmarks menu */ -static UserInfoPtr +struct _UserInfo { + GObject *user; + MooUiXml *xml; + MooActionCollection *actions; + char *path; + guint user_id; + guint merge_id; + GSList *bm_actions; +}; + +static UserInfo* user_info_new (GObject *user, MooActionCollection *actions, MooUiXml *xml, const char *path, guint user_id) { + UserInfo *info; + g_return_val_if_fail (G_IS_OBJECT (user), NULL); g_return_val_if_fail (MOO_IS_ACTION_COLLECTION (actions), NULL); g_return_val_if_fail (MOO_IS_UI_XML (xml), NULL); g_return_val_if_fail (path, NULL); g_return_val_if_fail (user_id > 0, NULL); - UserInfoPtr info = std::make_shared (); - + info = g_new0 (UserInfo, 1); info->user = user; info->actions = actions; info->xml = xml; - info->path.set (path); + info->path = g_strdup (path); info->user_id = user_id; return info; } +static void +user_info_free (UserInfo *info) +{ + if (info) + { + g_free (info->path); + g_free (info); + } +} + + static void item_activated (GtkAction *action, MooBookmarkMgr *mgr) @@ -435,7 +486,7 @@ item_activated (GtkAction *action, g_return_if_fail (GTK_IS_ACTION (action)); g_return_if_fail (MOO_IS_BOOKMARK_MGR (mgr)); - bookmark = reinterpret_cast (g_object_get_data (G_OBJECT (action), "moo-bookmark")); + bookmark = g_object_get_data (G_OBJECT (action), "moo-bookmark"); user = g_object_get_data (G_OBJECT (action), "moo-bookmark-user"); g_return_if_fail (bookmark != NULL && user != NULL); @@ -446,71 +497,82 @@ item_activated (GtkAction *action, static void make_menu (MooBookmarkMgr *mgr, - UserInfo &info) + UserInfo *info) { - gtk::TreeModel& model = *mgr->priv->store; + GtkTreeModel *model = GTK_TREE_MODEL (mgr->priv->store); GtkTreeIter iter; + GString *markup; GtkActionGroup *group; - if (!model.get_iter_first (iter)) + if (!gtk_tree_model_get_iter_first (model, &iter)) return; - info.merge_id = moo_ui_xml_new_merge_id (info.xml); - - strbuilder markup; + info->merge_id = moo_ui_xml_new_merge_id (info->xml); + markup = g_string_new (NULL); - group = moo_action_collection_get_group (info.actions, NULL); + group = moo_action_collection_get_group (info->actions, NULL); do { - objp bookmark; + MooBookmark *bookmark = NULL; + GtkAction *action; + char *action_id; - model.get (iter, COLUMN_BOOKMARK, bookmark); + gtk_tree_model_get (model, &iter, COLUMN_BOOKMARK, &bookmark, -1); if (!bookmark) { - markup.append (""); + g_string_append (markup, ""); continue; } - gstr action_id = gstr::printf ("MooBookmarkAction-%p", bookmark.get ()); + action_id = g_strdup_printf ("MooBookmarkAction-%p", (gpointer) bookmark); - gtk::ActionPtr action = wrap( - moo_action_group_add_action (group, action_id, - "label", bookmark->label.empty () ? bookmark->label.get () : bookmark->display_path.get (), - "stock-id", bookmark->icon_stock_id.get (), - "tooltip", bookmark->display_path.get (), - "no-accel", TRUE, - nullptr)); - action->set_data ("moo-bookmark", - bookmark.release (), - (GDestroyNotify) _moo_bookmark_free); - action->set_data ("moo-bookmark-user", info.user); - action->connect ("activate", G_CALLBACK (item_activated), mgr); + action = moo_action_group_add_action (group, action_id, + "label", bookmark->label ? bookmark->label : bookmark->display_path, + "stock-id", bookmark->icon_stock_id, + "tooltip", bookmark->display_path, + "no-accel", TRUE, + NULL); + g_object_ref (action); + g_object_set_data_full (G_OBJECT (action), "moo-bookmark", + bookmark, (GDestroyNotify) _moo_bookmark_free); + g_object_set_data (G_OBJECT (action), "moo-bookmark-user", info->user); + g_signal_connect (action, "activate", G_CALLBACK (item_activated), mgr); - info.bm_actions.push_back (action); + info->bm_actions = g_slist_prepend (info->bm_actions, action); - markup.append_printf ("", action_id); + g_string_append_printf (markup, "", action_id); + + g_free (action_id); } - while (model.iter_next (iter)); + while (gtk_tree_model_iter_next (model, &iter)); - moo_ui_xml_insert_markup (info.xml, info.merge_id, - info.path, -1, markup.get ()); + moo_ui_xml_insert_markup (info->xml, info->merge_id, + info->path, -1, markup->str); + g_string_free (markup, TRUE); } static void -destroy_menu (UserInfo& info) +destroy_menu (UserInfo *info) { - for (const auto& action : info.bm_actions) - moo_action_collection_remove_action (info.actions, action.gobj ()); + GSList *l; - info.bm_actions.clear (); - - if (info.merge_id > 0) + for (l = info->bm_actions; l != NULL; l = l->next) { - moo_ui_xml_remove_ui (info.xml, info.merge_id); - info.merge_id = 0; + GtkAction *action = l->data; + moo_action_collection_remove_action (info->actions, action); + g_object_unref (action); + } + + g_slist_free (info->bm_actions); + info->bm_actions = NULL; + + if (info->merge_id > 0) + { + moo_ui_xml_remove_ui (info->xml, info->merge_id); + info->merge_id = 0; } } @@ -518,17 +580,23 @@ destroy_menu (UserInfo& info) static gboolean mgr_update_menus (MooBookmarkMgr *mgr) { + GSList *l; + GtkTreeIter first; + GtkTreeModel *model = GTK_TREE_MODEL (mgr->priv->store); + gboolean empty; + mgr->priv->update_idle = 0; - GtkTreeIter first; - bool empty = !mgr->priv->store->get_iter_first (first); + empty = !gtk_tree_model_get_iter_first (model, &first); - for (const auto& u : mgr->priv->users) + for (l = mgr->priv->users; l != NULL; l = l->next) { - destroy_menu (*u); + UserInfo *info = l->data; + + destroy_menu (info); if (!empty) - make_menu (mgr, *u); + make_menu (mgr, info); } return FALSE; @@ -542,27 +610,29 @@ _moo_bookmark_mgr_add_user (MooBookmarkMgr *mgr, MooUiXml *xml, const char *path) { + UserInfo *info; + g_return_if_fail (MOO_IS_BOOKMARK_MGR (mgr)); g_return_if_fail (G_IS_OBJECT (user)); g_return_if_fail (MOO_IS_ACTION_COLLECTION (actions)); g_return_if_fail (MOO_IS_UI_XML (xml)); g_return_if_fail (path != NULL); - UserInfoPtr info = user_info_new (G_OBJECT (user), actions, xml, path, - ++mgr->priv->last_user_id); - g_return_if_fail (info != nullptr); - mgr->priv->users.push_back (info); + info = user_info_new (user, actions, xml, path, + ++mgr->priv->last_user_id); + mgr->priv->users = g_slist_prepend (mgr->priv->users, info); - make_menu (mgr, *info); + make_menu (mgr, info); } static void mgr_remove_user (MooBookmarkMgr *mgr, - UserInfo &info) + UserInfo *info) { destroy_menu (info); - remove_if (mgr->priv->users, [&info] (const UserInfoPtr& p) { return p.get () == &info; }); + user_info_free (info); + mgr->priv->users = g_slist_remove (mgr->priv->users, info); } @@ -570,20 +640,25 @@ void _moo_bookmark_mgr_remove_user (MooBookmarkMgr *mgr, gpointer user) { + GSList *l, *infos = NULL; + g_return_if_fail (MOO_IS_BOOKMARK_MGR (mgr)); - std::vector to_remove; - - for (const auto& u : mgr->priv->users) + for (l = mgr->priv->users; l != NULL; l = l->next) { - if (u->user == user) - to_remove.push_back (u); + UserInfo *info = l->data; + + if (info->user == user) + infos = g_slist_prepend (infos, info); } - for (const auto& u : to_remove) + for (l = infos; l != NULL; l = l->next) { - mgr_remove_user (mgr, *u); + UserInfo *info = l->data; + mgr_remove_user (mgr, info); } + + g_slist_free (infos); } @@ -605,7 +680,7 @@ _moo_bookmark_mgr_remove_user (MooBookmarkMgr *mgr, // MooBookmark *bookmark = NULL; // GtkWidget *item, *icon; // -// model.get (&iter, COLUMN_BOOKMARK, &bookmark, -1); +// gtk_tree_model_get (model, &iter, COLUMN_BOOKMARK, &bookmark, -1); // // if (!bookmark) // { @@ -701,15 +776,15 @@ static void moo_bookmark_mgr_update_menu(GtkMenuShell *menu, /* Bookmark editor */ -static gtk::TreeModelPtr copy_bookmarks (gtk::ListStore& store); -static void copy_bookmarks_back (gtk::ListStore store, - gtk::TreeModel model); -static void init_editor_dialog (BkEditorXml *xml); -static void dialog_response (GtkWidget *dialog, - int response, - MooBookmarkMgr *mgr); -static void dialog_show (GtkWidget *dialog, - MooBookmarkMgr *mgr); +static GtkTreeModel *copy_bookmarks (GtkListStore *store); +static void copy_bookmarks_back (GtkListStore *store, + GtkTreeModel *model); +static void init_editor_dialog (BkEditorXml *xml); +static void dialog_response (GtkWidget *dialog, + int response, + MooBookmarkMgr *mgr); +static void dialog_show (GtkWidget *dialog, + MooBookmarkMgr *mgr); GtkWidget * _moo_bookmark_mgr_get_editor (MooBookmarkMgr *mgr) @@ -718,7 +793,7 @@ _moo_bookmark_mgr_get_editor (MooBookmarkMgr *mgr) BkEditorXml *xml; if (mgr->priv->editor) - return mgr->priv->editor.gobj (); + return mgr->priv->editor; xml = bk_editor_xml_new (); dialog = GTK_WIDGET (xml->BkEditor); @@ -734,7 +809,8 @@ _moo_bookmark_mgr_get_editor (MooBookmarkMgr *mgr) g_signal_connect (dialog, "show", G_CALLBACK (dialog_show), mgr); - mgr->priv->editor.set (dialog); + mgr->priv->editor = dialog; + g_object_ref_sink (dialog); return dialog; } @@ -744,10 +820,15 @@ static void dialog_show (GtkWidget *dialog, MooBookmarkMgr *mgr) { - BkEditorXml *xml = bk_editor_xml_get (dialog); + GtkTreeModel *model; + BkEditorXml *xml; + + xml = bk_editor_xml_get (dialog); g_return_if_fail (xml != NULL); - auto model = copy_bookmarks (*mgr->priv->store); - gtk_tree_view_set_model (xml->treeview, model.gobj ()); + + model = copy_bookmarks (mgr->priv->store); + gtk_tree_view_set_model (xml->treeview, model); + g_object_unref (model); } @@ -756,7 +837,10 @@ dialog_response (GtkWidget *dialog, int response, MooBookmarkMgr *mgr) { - BkEditorXml *xml = bk_editor_xml_get (dialog); + GtkTreeModel *model; + BkEditorXml *xml; + + xml = bk_editor_xml_get (dialog); g_return_if_fail (xml != NULL); if (response != GTK_RESPONSE_OK) @@ -765,48 +849,49 @@ dialog_response (GtkWidget *dialog, return; } - gtk::TreeModelPtr model = wrap (xml->treeview)->get_model (); - copy_bookmarks_back (*mgr->priv->store, *model); + model = gtk_tree_view_get_model (xml->treeview); + copy_bookmarks_back (mgr->priv->store, model); gtk_widget_hide (dialog); } -static bool -copy_value (gtk::TreeModel& src, - const GtkTreeIter& iter, - gtk::ListStore& dest) +static gboolean +copy_value (GtkTreeModel *src, + G_GNUC_UNUSED GtkTreePath *path, + GtkTreeIter *iter, + GtkListStore *dest) { - objp bookmark; - src.get (iter, COLUMN_BOOKMARK, bookmark); - GtkTreeIter dest_iter; - dest.append (dest_iter); - dest.set (dest_iter, COLUMN_BOOKMARK, bookmark); + MooBookmark *bookmark; - return false; + gtk_tree_model_get (src, iter, COLUMN_BOOKMARK, &bookmark, -1); + gtk_list_store_append (dest, &dest_iter); + gtk_list_store_set (dest, &dest_iter, COLUMN_BOOKMARK, bookmark, -1); + _moo_bookmark_free (bookmark); + + return FALSE; } -static gtk::TreeModelPtr -copy_bookmarks (gtk::ListStore& store) +static GtkTreeModel * +copy_bookmarks (GtkListStore *store) { - auto copy = gtk::ListStore::create ({ MOO_TYPE_BOOKMARK }); - - store.foreach ([&] (const GtkTreePath&, const GtkTreeIter& iter) - { - return copy_value (store, iter, *copy); - }); - - return copy; + GtkListStore *copy; + copy = gtk_list_store_new (1, MOO_TYPE_BOOKMARK); + gtk_tree_model_foreach (GTK_TREE_MODEL (store), + (GtkTreeModelForeachFunc) copy_value, + copy); + return GTK_TREE_MODEL (copy); } + static void -copy_bookmarks_back (gtk::ListStore store, gtk::TreeModel model) +copy_bookmarks_back (GtkListStore *store, + GtkTreeModel *model) { - store.clear (); - model.foreach ([&] (const GtkTreePath&, const GtkTreeIter& iter) - { - return copy_value (model, iter, store); - }); + gtk_list_store_clear (store); + gtk_tree_model_foreach (model, + (GtkTreeModelForeachFunc) copy_value, + store); } @@ -925,22 +1010,22 @@ init_editor_dialog (BkEditorXml *xml) } -static objp +static MooBookmark * get_bookmark (GtkTreeModel *model, GtkTreeIter *iter) { - objp bookmark; - gtk_tree_model_get (model, iter, COLUMN_BOOKMARK, bookmark.pp (), -1); + MooBookmark *bookmark = NULL; + gtk_tree_model_get (model, iter, COLUMN_BOOKMARK, &bookmark, -1); return bookmark; } static void -set_bookmark (GtkListStore* store, - GtkTreeIter* iter, - objp bookmark) +set_bookmark (GtkListStore *store, + GtkTreeIter *iter, + MooBookmark *bookmark) { - gtk_list_store_set (store, iter, COLUMN_BOOKMARK, bookmark.release(), -1); + gtk_list_store_set (store, iter, COLUMN_BOOKMARK, bookmark, -1); } @@ -950,7 +1035,7 @@ icon_data_func (G_GNUC_UNUSED GtkTreeViewColumn *column, GtkTreeModel *model, GtkTreeIter *iter) { - objp bookmark = get_bookmark (model, iter); + MooBookmark *bookmark = get_bookmark (model, iter); if (!bookmark) g_object_set (cell, @@ -963,6 +1048,8 @@ icon_data_func (G_GNUC_UNUSED GtkTreeViewColumn *column, "stock-id", bookmark->icon_stock_id, "stock-size", GTK_ICON_SIZE_MENU, NULL); + + _moo_bookmark_free (bookmark); } @@ -972,7 +1059,7 @@ label_data_func (G_GNUC_UNUSED GtkTreeViewColumn *column, GtkTreeModel *model, GtkTreeIter *iter) { - objp bookmark = get_bookmark (model, iter); + MooBookmark *bookmark = get_bookmark (model, iter); if (!bookmark) g_object_set (cell, @@ -984,6 +1071,8 @@ label_data_func (G_GNUC_UNUSED GtkTreeViewColumn *column, "text", bookmark->label, "editable", TRUE, NULL); + + _moo_bookmark_free (bookmark); } @@ -993,7 +1082,7 @@ path_data_func (G_GNUC_UNUSED GtkTreeViewColumn *column, GtkTreeModel *model, GtkTreeIter *iter) { - objp bookmark = get_bookmark (model, iter); + MooBookmark *bookmark = get_bookmark (model, iter); if (!bookmark) g_object_set (cell, @@ -1005,6 +1094,8 @@ path_data_func (G_GNUC_UNUSED GtkTreeViewColumn *column, "text", bookmark->display_path, "editable", TRUE, NULL); + + _moo_bookmark_free (bookmark); } @@ -1023,14 +1114,16 @@ selection_changed (GtkTreeSelection *selection, { GtkTreeIter iter; GtkTreeModel *model; + MooBookmark *bookmark; GList *rows = gtk_tree_selection_get_selected_rows (selection, &model); g_return_if_fail (rows != NULL); - gtk_tree_model_get_iter (model, &iter, reinterpret_cast (rows->data)); - objp bookmark = get_bookmark (model, &iter); + gtk_tree_model_get_iter (model, &iter, rows->data); + bookmark = get_bookmark (model, &iter); if (bookmark) { gtk_widget_set_sensitive (selected_hbox, TRUE); combo_update_icon (xml->icon_combo, xml); + _moo_bookmark_free (bookmark); } else { @@ -1051,17 +1144,17 @@ new_clicked (BkEditorXml *xml) GtkTreePath *path; GtkTreeViewColumn *column; GtkListStore *store; + MooBookmark *bookmark; store = GTK_LIST_STORE (gtk_tree_view_get_model (xml->treeview)); - { - auto bookmark = objp::make ("New bookmark", nullptr, MOO_STOCK_FOLDER); - gtk_list_store_append (store, &iter); - set_bookmark (store, &iter, std::move (bookmark)); - } + bookmark = _moo_bookmark_new ("New bookmark", NULL, + MOO_STOCK_FOLDER); + gtk_list_store_append (store, &iter); + set_bookmark (store, &iter, bookmark); - column = GTK_TREE_VIEW_COLUMN (g_object_get_data (G_OBJECT (xml->treeview), - "moo-bookmarks-label-column")); + column = g_object_get_data (G_OBJECT (xml->treeview), + "moo-bookmarks-label-column"); path = gtk_tree_model_get_path (GTK_TREE_MODEL (store), &iter); gtk_tree_view_set_cursor (xml->treeview, path, column, TRUE); @@ -1070,6 +1163,7 @@ new_clicked (BkEditorXml *xml) GINT_TO_POINTER (TRUE)); gtk_tree_path_free (path); + _moo_bookmark_free (bookmark); } @@ -1093,13 +1187,13 @@ delete_clicked (BkEditorXml *xml) for (l = paths; l != NULL; l = l->next) rows = g_list_prepend (rows, gtk_tree_row_reference_new (GTK_TREE_MODEL (store), - reinterpret_cast (l->data))); + l->data)); for (l = rows; l != NULL; l = l->next) { - if (gtk_tree_row_reference_valid (reinterpret_cast (l->data))) + if (gtk_tree_row_reference_valid (l->data)) { - path = gtk_tree_row_reference_get_path (reinterpret_cast (l->data)); + path = gtk_tree_row_reference_get_path (l->data); gtk_tree_model_get_iter (GTK_TREE_MODEL (store), &iter, path); gtk_list_store_remove (store, &iter); gtk_tree_path_free (path); @@ -1136,6 +1230,7 @@ label_edited (G_GNUC_UNUSED GtkCellRenderer *cell, GtkTreeIter iter; GtkTreePath *path; GtkListStore *store; + MooBookmark *bookmark; store = GTK_LIST_STORE (gtk_tree_view_get_model (xml->treeview)); @@ -1147,20 +1242,20 @@ label_edited (G_GNUC_UNUSED GtkCellRenderer *cell, return; } - { - objp bookmark = get_bookmark (GTK_TREE_MODEL (store), &iter); - g_return_if_fail (bookmark != nullptr); + bookmark = get_bookmark (GTK_TREE_MODEL (store), &iter); + g_return_if_fail (bookmark != NULL); - if (bookmark->label.empty () || bookmark->label == text) - { - bookmark->label.set (text); - set_bookmark (store, &iter, std::move (bookmark)); - g_object_set_data (G_OBJECT (store), - "moo-bookmarks-modified", - GINT_TO_POINTER (TRUE)); - } + if (!bookmark->label || strcmp (bookmark->label, text)) + { + g_free (bookmark->label); + bookmark->label = g_strdup (text); + set_bookmark (store, &iter, bookmark); + g_object_set_data (G_OBJECT (store), + "moo-bookmarks-modified", + GINT_TO_POINTER (TRUE)); } + _moo_bookmark_free (bookmark); gtk_tree_path_free (path); } @@ -1174,6 +1269,7 @@ path_edited (G_GNUC_UNUSED GtkCellRenderer *cell, GtkTreeIter iter; GtkTreePath *path; GtkListStore *store; + MooBookmark *bookmark; MooFileEntryCompletion *cmpl; store = GTK_LIST_STORE (gtk_tree_view_get_model (xml->treeview)); @@ -1186,23 +1282,22 @@ path_edited (G_GNUC_UNUSED GtkCellRenderer *cell, return; } - { - objp bookmark = get_bookmark (GTK_TREE_MODEL (store), &iter); - g_return_if_fail (bookmark != nullptr); + bookmark = get_bookmark (GTK_TREE_MODEL (store), &iter); + g_return_if_fail (bookmark != NULL); - if (bookmark->display_path != text) - { - _moo_bookmark_set_display_path (bookmark.get (), text); - set_bookmark (store, &iter, std::move (bookmark)); - g_object_set_data (G_OBJECT (store), - "moo-bookmarks-modified", - GINT_TO_POINTER (TRUE)); - } + if (!bookmark->display_path || strcmp (bookmark->display_path, text)) + { + _moo_bookmark_set_display_path (bookmark, text); + set_bookmark (store, &iter, bookmark); + g_object_set_data (G_OBJECT (store), + "moo-bookmarks-modified", + GINT_TO_POINTER (TRUE)); } + _moo_bookmark_free (bookmark); gtk_tree_path_free (path); - cmpl = MOO_FILE_ENTRY_COMPLETION (g_object_get_data (G_OBJECT (cell), "moo-file-entry-completion")); + cmpl = g_object_get_data (G_OBJECT (cell), "moo-file-entry-completion"); g_return_if_fail (cmpl != NULL); g_object_set (cmpl, "entry", NULL, NULL); } @@ -1213,7 +1308,7 @@ path_editing_started (GtkCellRenderer *cell, GtkCellEditable *editable) { MooFileEntryCompletion *cmpl = - MOO_FILE_ENTRY_COMPLETION (g_object_get_data (G_OBJECT (cell), "moo-file-entry-completion")); + g_object_get_data (G_OBJECT (cell), "moo-file-entry-completion"); g_return_if_fail (cmpl != NULL); g_return_if_fail (GTK_IS_ENTRY (editable)); @@ -1299,7 +1394,7 @@ static void fill_icon_store (GtkListStore *store, GtkStyle *style); static void icon_store_find_pixbuf (GtkListStore *store, GtkTreeIter *iter, - gobj_ref pixbuf); + GdkPixbuf *pixbuf); static void icon_store_find_stock (GtkListStore *store, GtkTreeIter *iter, const char *stock); @@ -1353,21 +1448,22 @@ combo_update_icon (GtkComboBox *combo, GtkTreeModel *model; GtkTreeIter iter; GList *rows; + MooBookmark *bookmark; GtkListStore *icon_store; selection = gtk_tree_view_get_selection (xml->treeview); rows = gtk_tree_selection_get_selected_rows (selection, &model); g_return_if_fail (rows != NULL && rows->next == NULL); - gtk_tree_model_get_iter (model, &iter, reinterpret_cast (rows->data)); - objp bookmark = get_bookmark (model, &iter); - g_return_if_fail (bookmark != nullptr); + gtk_tree_model_get_iter (model, &iter, rows->data); + bookmark = get_bookmark (model, &iter); + g_return_if_fail (bookmark != NULL); icon_store = GTK_LIST_STORE (gtk_combo_box_get_model (combo)); if (bookmark->pixbuf) - icon_store_find_pixbuf (icon_store, &iter, *bookmark->pixbuf); - else if (!bookmark->icon_stock_id.empty()) + icon_store_find_pixbuf (icon_store, &iter, bookmark->pixbuf); + else if (bookmark->icon_stock_id) icon_store_find_stock (icon_store, &iter, bookmark->icon_stock_id); else icon_store_find_empty (icon_store, &iter); @@ -1376,7 +1472,8 @@ combo_update_icon (GtkComboBox *combo, gtk_combo_box_set_active_iter (combo, &iter); g_signal_handlers_unblock_by_func (combo, (gpointer) icon_combo_changed, xml); - gtk_tree_path_free (reinterpret_cast (rows->data)); + _moo_bookmark_free (bookmark); + gtk_tree_path_free (rows->data); g_list_free (rows); } @@ -1437,14 +1534,14 @@ fill_icon_store (GtkListStore *store, { GtkStockItem item; - if (!gtk_style_lookup_icon_set (style, reinterpret_cast (l->data))) + if (!gtk_style_lookup_icon_set (style, l->data)) continue; gtk_list_store_append (store, &iter); gtk_list_store_set (store, &iter, ICON_COLUMN_STOCK, l->data, -1); - if (gtk_stock_lookup (reinterpret_cast (l->data), &item)) + if (gtk_stock_lookup (l->data, &item)) { char *label = g_strdup (item.label); char *und = strchr (label, '_'); @@ -1478,7 +1575,7 @@ fill_icon_store (GtkListStore *store, gtk_list_store_append (store, &iter); gtk_list_store_set (store, &iter, ICON_COLUMN_LABEL, "None", -1); - g_slist_foreach (stock_ids, (GFunc) extern_g_free, NULL); + g_slist_foreach (stock_ids, (GFunc) g_free, NULL); g_slist_free (stock_ids); } @@ -1491,35 +1588,45 @@ icon_combo_changed (GtkComboBox *combo, GtkTreeModel *model; GtkTreeIter iter, icon_iter; GList *rows; + MooBookmark *bookmark; GtkTreeModel *icon_model; + GdkPixbuf *pixbuf = NULL; + char *stock = NULL; selection = gtk_tree_view_get_selection (xml->treeview); rows = gtk_tree_selection_get_selected_rows (selection, &model); g_return_if_fail (rows != NULL && rows->next == NULL); - gtk_tree_model_get_iter (model, &iter, reinterpret_cast (rows->data)); - objp bookmark = get_bookmark (model, &iter); - g_return_if_fail (bookmark != nullptr); + gtk_tree_model_get_iter (model, &iter, rows->data); + bookmark = get_bookmark (model, &iter); + g_return_if_fail (bookmark != NULL); gtk_combo_box_get_active_iter (combo, &icon_iter); icon_model = gtk_combo_box_get_model (combo); - gobj_ptr pixbuf; - gtk_tree_model_get (icon_model, &icon_iter, ICON_COLUMN_PIXBUF, pixbuf.pp (), -1); + if (bookmark->pixbuf) + g_object_unref (bookmark->pixbuf); + bookmark->pixbuf = NULL; + g_free (bookmark->icon_stock_id); + bookmark->icon_stock_id = NULL; - bookmark->pixbuf = pixbuf; - bookmark->icon_stock_id.clear (); + gtk_tree_model_get (icon_model, &icon_iter, ICON_COLUMN_PIXBUF, + &pixbuf, -1); + + if (pixbuf) + bookmark->pixbuf = pixbuf; if (!pixbuf) { - gstrp stock; - gtk_tree_model_get (icon_model, &icon_iter, ICON_COLUMN_STOCK, stock.pp(), -1); - bookmark->icon_stock_id = std::move (stock); + gtk_tree_model_get (icon_model, &icon_iter, ICON_COLUMN_STOCK, + &stock, -1); + bookmark->icon_stock_id = stock; } - set_bookmark (GTK_LIST_STORE (model), &iter, std::move (bookmark)); + set_bookmark (GTK_LIST_STORE (model), &iter, bookmark); - gtk_tree_path_free (reinterpret_cast (rows->data)); + _moo_bookmark_free (bookmark); + gtk_tree_path_free (rows->data); g_list_free (rows); } @@ -1527,22 +1634,31 @@ icon_combo_changed (GtkComboBox *combo, static void icon_store_find_pixbuf (GtkListStore *store, GtkTreeIter *iter, - gobj_ref pixbuf) + GdkPixbuf *pixbuf) { GtkTreeModel *model = GTK_TREE_MODEL (store); + g_return_if_fail (GDK_IS_PIXBUF (pixbuf)); + if (gtk_tree_model_get_iter_first (model, iter)) do { - gobj_ptr pix; - gtk_tree_model_get (model, iter, ICON_COLUMN_PIXBUF, pix.pp (), -1); + GdkPixbuf *pix = NULL; + gtk_tree_model_get (model, iter, ICON_COLUMN_PIXBUF, &pix, -1); - if (pix == pixbuf.gobj()) + if (pix == pixbuf) + { + if (pix) + g_object_unref (pix); return; + } + + if (pix) + g_object_unref (pix); } while (gtk_tree_model_iter_next (model, iter)); gtk_list_store_append (store, iter); - gtk_list_store_set (store, iter, ICON_COLUMN_PIXBUF, pixbuf.gobj(), -1); + gtk_list_store_set (store, iter, ICON_COLUMN_PIXBUF, pixbuf, -1); } diff --git a/moo/moofileview/moobookmarkmgr.h b/moo/moofileview/moobookmarkmgr.h index e70b5a33..4d0ca927 100644 --- a/moo/moofileview/moobookmarkmgr.h +++ b/moo/moofileview/moobookmarkmgr.h @@ -1,7 +1,7 @@ /* * moobookmarkmgr.h * - * Copyright (C) 2004-2016 by Yevgen Muntyan + * Copyright (C) 2004-2010 by Yevgen Muntyan * * This file is part of medit. medit is free software; you can * redistribute it and/or modify it under the terms of the @@ -13,27 +13,17 @@ * License along with medit. If not, see . */ -#pragma once +#ifndef MOO_BOOKMARK_MGR_H +#define MOO_BOOKMARK_MGR_H #include #include -#ifdef __cplusplus -#include -#endif G_BEGIN_DECLS -typedef struct MooBookmarkMgr MooBookmarkMgr; - -MooBookmarkMgr *_moo_bookmark_mgr_new (void); - -G_END_DECLS - -#ifdef __cplusplus #define MOO_TYPE_BOOKMARK_MGR (_moo_bookmark_mgr_get_type ()) #define MOO_BOOKMARK_MGR(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), MOO_TYPE_BOOKMARK_MGR, MooBookmarkMgr)) -#define MOO_BOOKMARK_MGR_OPT(object) (moo::object_cast_opt (object)) #define MOO_BOOKMARK_MGR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), MOO_TYPE_BOOKMARK_MGR, MooBookmarkMgrClass)) #define MOO_IS_BOOKMARK_MGR(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), MOO_TYPE_BOOKMARK_MGR)) #define MOO_IS_BOOKMARK_MGR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), MOO_TYPE_BOOKMARK_MGR)) @@ -46,34 +36,26 @@ typedef enum { MOO_BOOKMARK_MGR_NUM_COLUMNS } MooBookmarkMgrModelColumn; -struct MooBookmark -{ - MooBookmark (const char* label, - const char* path, - const char* icon); - ~MooBookmark (); +typedef struct _MooBookmark MooBookmark; +typedef struct _MooBookmarkMgr MooBookmarkMgr; +typedef struct _MooBookmarkMgrPrivate MooBookmarkMgrPrivate; +typedef struct _MooBookmarkMgrClass MooBookmarkMgrClass; - MooBookmark (const MooBookmark&) = default; - MooBookmark& operator=(const MooBookmark&) = delete; - MooBookmark (MooBookmark&&); - MooBookmark& operator=(MooBookmark&&); - - g::gstr path; - g::gstr display_path; - g::gstr label; - g::gstr icon_stock_id; - moo::gobj_ptr pixbuf; +struct _MooBookmark { + char *path; + char *display_path; + char *label; + char *icon_stock_id; + GdkPixbuf *pixbuf; }; -struct MooBookmarkMgrPrivate; - -struct MooBookmarkMgr +struct _MooBookmarkMgr { GObject parent; MooBookmarkMgrPrivate *priv; }; -struct MooBookmarkMgrClass +struct _MooBookmarkMgrClass { GObjectClass parent_class; @@ -88,10 +70,16 @@ struct MooBookmarkMgrClass GType _moo_bookmark_get_type (void) G_GNUC_CONST; GType _moo_bookmark_mgr_get_type (void) G_GNUC_CONST; -moo::gtk::TreeModelPtr _moo_bookmark_mgr_get_model (MooBookmarkMgr *mgr); +MooBookmark *_moo_bookmark_new (const char *name, + const char *path, + const char *icon); +void _moo_bookmark_free (MooBookmark *bookmark); + +MooBookmarkMgr *_moo_bookmark_mgr_new (void); +GtkTreeModel *_moo_bookmark_mgr_get_model (MooBookmarkMgr *mgr); void _moo_bookmark_mgr_add (MooBookmarkMgr *mgr, - moo::objp bookmark); + MooBookmark *bookmark); GtkWidget *_moo_bookmark_mgr_get_editor(MooBookmarkMgr *mgr); @@ -103,8 +91,7 @@ void _moo_bookmark_mgr_add_user (MooBookmarkMgr *mgr, void _moo_bookmark_mgr_remove_user(MooBookmarkMgr *mgr, gpointer user); /* GObject* */ -namespace moo { -MOO_DEFINE_SIMPLE_GOBJ_CLASS(BookmarkMgr, g::Object, MooBookmarkMgr, MOO_TYPE_BOOKMARK_MGR); -} -#endif // __cplusplus +G_END_DECLS + +#endif /* MOO_BOOKMARK_MGR_H */ diff --git a/moo/moofileview/moobookmarkview.cpp b/moo/moofileview/moobookmarkview.c similarity index 68% rename from moo/moofileview/moobookmarkview.cpp rename to moo/moofileview/moobookmarkview.c index f28c2a82..99de5f5e 100644 --- a/moo/moofileview/moobookmarkview.cpp +++ b/moo/moofileview/moobookmarkview.c @@ -14,13 +14,10 @@ */ #include "moofileview/moobookmarkview.h" -#include "moocpp/moocpp.h" #include "marshals.h" #include #include -using namespace moo; - #define COLUMN_BOOKMARK MOO_BOOKMARK_MGR_COLUMN_BOOKMARK @@ -39,14 +36,14 @@ static void row_activated (GtkTreeView *treeview, GtkTreePath *path, GtkTreeViewColumn *column); -static void icon_data_func (gtk::TreeViewColumn column, - gtk::CellRenderer cell, - gtk::TreeModel model, - const GtkTreeIter& iter); -static void label_data_func (gtk::TreeViewColumn column, - gtk::CellRenderer cell, - gtk::TreeModel model, - const GtkTreeIter& iter); +static void icon_data_func (GtkTreeViewColumn *column, + GtkCellRenderer *cell, + GtkTreeModel *model, + GtkTreeIter *iter); +static void label_data_func (GtkTreeViewColumn *column, + GtkCellRenderer *cell, + GtkTreeModel *model, + GtkTreeIter *iter); /* MOO_TYPE_BOOKMARK_VIEW */ @@ -99,26 +96,33 @@ _moo_bookmark_view_class_init (MooBookmarkViewClass *klass) static void _moo_bookmark_view_init (MooBookmarkView *view) { - gtk::TreeView treeview = *GTK_TREE_VIEW (view); + GtkTreeView *treeview = GTK_TREE_VIEW (view); + GtkTreeViewColumn *column; + GtkCellRenderer *cell; + GtkTreeSelection *selection; - treeview.set_headers_visible (FALSE); + gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (view), FALSE); - GtkTreeSelection *selection = treeview.get_selection (); + selection = gtk_tree_view_get_selection (treeview); gtk_tree_selection_set_mode (selection, GTK_SELECTION_MULTIPLE); - gtk::TreeViewColumnPtr column = gtk::TreeViewColumn::create (); - treeview.append_column (*column); + column = gtk_tree_view_column_new (); + gtk_tree_view_append_column (treeview, column); /* Icon */ - gtk::CellRendererPtr cell = gtk::CellRendererPixbuf::create (); - column->pack_start (*cell, FALSE); - column->set_cell_data_func (*cell, icon_data_func); + cell = gtk_cell_renderer_pixbuf_new (); + gtk_tree_view_column_pack_start (column, cell, FALSE); + gtk_tree_view_column_set_cell_data_func (column, cell, + (GtkTreeCellDataFunc) icon_data_func, + NULL, NULL); /* Label */ - cell = gtk::CellRendererText::create (); - cell->set ("xpad", 6); - column->pack_start (*cell, FALSE); - column->set_cell_data_func (*cell, label_data_func); + cell = gtk_cell_renderer_text_new (); + g_object_set (cell, "xpad", 6, NULL); + gtk_tree_view_column_pack_start (column, cell, FALSE); + gtk_tree_view_column_set_cell_data_func (column, cell, + (GtkTreeCellDataFunc) label_data_func, + NULL, NULL); } @@ -147,7 +151,7 @@ moo_bookmark_view_set_property (GObject *object, switch (prop_id) { case PROP_MGR: - _moo_bookmark_view_set_mgr (view, MOO_BOOKMARK_MGR_OPT (g_value_get_object (value))); + _moo_bookmark_view_set_mgr (view, g_value_get_object (value)); break; default: @@ -203,30 +207,22 @@ _moo_bookmark_view_set_mgr (MooBookmarkView *view, view->mgr = mgr; gtk_tree_view_set_model (GTK_TREE_VIEW (view), - mgr ? _moo_bookmark_mgr_get_model (mgr).gobj () : NULL); + mgr ? _moo_bookmark_mgr_get_model (mgr) : NULL); g_object_notify (G_OBJECT (view), "mgr"); } -objp -get_bookmark (gtk::TreeModel model, - const GtkTreeIter& iter) -{ - objp bookmark; - model.get (iter, COLUMN_BOOKMARK, bookmark); - return bookmark; -} - -objp +static MooBookmark * get_bookmark (GtkTreeModel *model, GtkTreeIter *iter) { - g_return_val_if_fail (GTK_IS_TREE_MODEL (model), nullptr); - g_return_val_if_fail (iter != nullptr, nullptr); - return get_bookmark (*wrap (model), *iter); + MooBookmark *bookmark = NULL; + gtk_tree_model_get (model, iter, COLUMN_BOOKMARK, &bookmark, -1); + return bookmark; } + #if 0 static void set_bookmark (GtkListStore *store, @@ -239,39 +235,51 @@ set_bookmark (GtkListStore *store, static void -icon_data_func (gtk::TreeViewColumn, - gtk::CellRenderer cell, - gtk::TreeModel model, - const GtkTreeIter& iter) +icon_data_func (G_GNUC_UNUSED GtkTreeViewColumn *column, + GtkCellRenderer *cell, + GtkTreeModel *model, + GtkTreeIter *iter) { - objp bookmark = get_bookmark (model, iter); + MooBookmark *bookmark = get_bookmark (model, iter); if (!bookmark) - cell.set ("pixbuf", nullptr, - "stock-id", nullptr); + g_object_set (cell, + "pixbuf", NULL, + "stock-id", NULL, + NULL); else - cell.set ("pixbuf", bookmark->pixbuf, - "stock-id", bookmark->icon_stock_id, - "stock-size", GTK_ICON_SIZE_LARGE_TOOLBAR); + g_object_set (cell, + "pixbuf", bookmark->pixbuf, + "stock-id", bookmark->icon_stock_id, + "stock-size", GTK_ICON_SIZE_LARGE_TOOLBAR, + NULL); + + _moo_bookmark_free (bookmark); } static void -label_data_func (gtk::TreeViewColumn, - gtk::CellRenderer cell, - gtk::TreeModel model, - const GtkTreeIter& iter) +label_data_func (G_GNUC_UNUSED GtkTreeViewColumn *column, + GtkCellRenderer *cell, + GtkTreeModel *model, + GtkTreeIter *iter) { - objp bookmark = get_bookmark (model, iter); + MooBookmark *bookmark = get_bookmark (model, iter); if (!bookmark) - cell.set ("text", "-------"); + g_object_set (cell, + "text", "-------", + NULL); else - cell.set ("text", bookmark->label); + g_object_set (cell, + "text", bookmark->label, + NULL); + + _moo_bookmark_free (bookmark); } -static objp +static MooBookmark * _moo_bookmark_view_get_bookmark (MooBookmarkView *view, GtkTreePath *path) { @@ -296,7 +304,8 @@ row_activated (GtkTreeView *treeview, GtkTreePath *path, G_GNUC_UNUSED GtkTreeViewColumn *column) { - objp bookmark; + MooBookmark *bookmark; bookmark = _moo_bookmark_view_get_bookmark (MOO_BOOKMARK_VIEW (treeview), path); - g_signal_emit (treeview, signals[BOOKMARK_ACTIVATED], 0, bookmark.get ()); + g_signal_emit (treeview, signals[BOOKMARK_ACTIVATED], 0, bookmark); + _moo_bookmark_free (bookmark); } diff --git a/moo/moofileview/moofile.cpp b/moo/moofileview/moofile.c similarity index 98% rename from moo/moofileview/moofile.cpp rename to moo/moofileview/moofile.c index f2c8a589..e002d456 100644 --- a/moo/moofileview/moofile.cpp +++ b/moo/moofileview/moofile.c @@ -344,7 +344,7 @@ _moo_file_stat (MooFile *file, _moo_message ("file '%s' does not exist", display_name); g_free (display_name); }); - file->info = MOO_FILE_INFO_FLAGS_NONE; + file->info = 0; } else { @@ -355,7 +355,7 @@ _moo_file_stat (MooFile *file, g_free (display_name); }); file->info = MOO_FILE_INFO_IS_LOCKED | MOO_FILE_INFO_EXISTS; - file->flags = MOO_FILE_FLAGS_NONE; + file->flags = 0; } } else @@ -388,13 +388,13 @@ _moo_file_stat (MooFile *file, g_free (display_name); }); file->info = MOO_FILE_INFO_IS_LOCKED | MOO_FILE_INFO_EXISTS; - file->flags = MooFileFlags (0); + file->flags = 0; } } errno = 0; len = readlink (fullname, buf, 1024); - err.value = mgw_errno_value_t (errno); + err.value = errno; if (len == -1) { @@ -509,7 +509,7 @@ _moo_file_get_icon (const MooFile *file, g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL); icon.mime_type = file->mime_type; - icon.type = MooIconType (file->icon); + icon.type = file->icon; icon.emblem = get_icon_flags (file); return moo_file_icon_get_pixbuf (&icon, widget, size); } @@ -638,5 +638,5 @@ get_icon_flags (const MooFile *file) #if 0 (MOO_FILE_IS_LOCKED (file) ? MOO_ICON_EMBLEM_LOCK : 0) | #endif - (MOO_FILE_IS_LINK (file) ? MOO_ICON_EMBLEM_LINK : MOO_ICON_EMBLEM_NONE); + (MOO_FILE_IS_LINK (file) ? MOO_ICON_EMBLEM_LINK : 0); } diff --git a/moo/moofileview/moofile.h b/moo/moofileview/moofile.h index 696c8aee..7045b9c7 100644 --- a/moo/moofileview/moofile.h +++ b/moo/moofileview/moofile.h @@ -13,12 +13,10 @@ * License along with medit. If not, see . */ -#pragma once +#ifndef MOO_FILE_H +#define MOO_FILE_H #include -#ifdef __cplusplus -#include -#endif G_BEGIN_DECLS @@ -27,16 +25,14 @@ typedef struct _MooFile MooFile; typedef struct _MooFolder MooFolder; /* should be ordered TODO why? */ -typedef enum MooFileFlags { - MOO_FILE_FLAGS_NONE = 0, +typedef enum { MOO_FILE_HAS_STAT = 1 << 1, MOO_FILE_HAS_MIME_TYPE = 1 << 2, MOO_FILE_HAS_ICON = 1 << 3, MOO_FILE_ALL_FLAGS = (1 << 4) - 1 } MooFileFlags; -typedef enum MooFileInfo { - MOO_FILE_INFO_FLAGS_NONE = 0, +typedef enum { MOO_FILE_INFO_EXISTS = 1 << 0, MOO_FILE_INFO_IS_DIR = 1 << 1, MOO_FILE_INFO_IS_HIDDEN = 1 << 2, @@ -69,9 +65,4 @@ const char *_moo_file_display_name (const MooFile *file); G_END_DECLS -#ifdef __cplusplus - -MOO_DEFINE_FLAGS(MooFileFlags) -MOO_DEFINE_FLAGS(MooFileInfo) - -#endif // __cplusplus +#endif /* MOO_FILE_H */ diff --git a/moo/moofileview/moofileentry.cpp b/moo/moofileview/moofileentry.c similarity index 99% rename from moo/moofileview/moofileentry.cpp rename to moo/moofileview/moofileentry.c index c7bbc78e..ac583f5e 100644 --- a/moo/moofileview/moofileentry.cpp +++ b/moo/moofileview/moofileentry.c @@ -25,7 +25,6 @@ #include "mooutils/mooutils-debug.h" #include "mooutils/mooaccel.h" #include "mooutils/moocompat.h" -#include #include #include @@ -308,7 +307,7 @@ moo_file_entry_completion_set_property (GObject *object, switch (prop_id) { case PROP_ENTRY: - _moo_file_entry_completion_set_entry (cmpl, reinterpret_cast (g_value_get_object (value))); + _moo_file_entry_completion_set_entry (cmpl, g_value_get_object (value)); break; case PROP_ENABLE_COMPLETION: @@ -333,7 +332,7 @@ moo_file_entry_completion_set_property (GObject *object, break; case PROP_FILE_SYSTEM: - completion_set_file_system (cmpl, MOO_FILE_SYSTEM_OPT (g_value_get_object (value))); + completion_set_file_system (cmpl, g_value_get_object (value)); break; case PROP_CASE_SENSITIVE: @@ -1146,7 +1145,7 @@ folder_contents_changed (MooFileEntryCompletion *cmpl) { if (!cmpl->priv->resize_popup_idle) cmpl->priv->resize_popup_idle = - g_idle_add ((GSourceFunc) resize_popup_idle, cmpl); + gdk_threads_add_idle ((GSourceFunc) resize_popup_idle, cmpl); } static void @@ -1164,7 +1163,7 @@ completion_connect_folder (MooFileEntryCompletion *cmpl, completion_disconnect_folder (cmpl); - cmpl->priv->folder = MOO_FOLDER (g_object_ref (folder)); + cmpl->priv->folder = g_object_ref (folder); _moo_folder_filter_set_folder (MOO_FOLDER_FILTER (cmpl->priv->model), folder); g_signal_connect_swapped (folder, "files-added", @@ -1420,7 +1419,7 @@ completion_set_file_system (MooFileEntryCompletion *cmpl, g_object_unref (cmpl->priv->fs); if (fs) - cmpl->priv->fs = MOO_FILE_SYSTEM (g_object_ref (fs)); + cmpl->priv->fs = g_object_ref (fs); else cmpl->priv->fs = _moo_file_system_create (); @@ -1491,7 +1490,7 @@ completion_entry_key_press (GtkEntry *entry, g_return_val_if_fail (entry == cmpl->priv->entry, FALSE); if (cmpl->priv->enabled && - moo_accel_check_event (GTK_WIDGET (entry), event, GDK_Tab, GdkModifierType (0))) + moo_accel_check_event (GTK_WIDGET (entry), event, GDK_Tab, 0)) { completion_tab_key (cmpl); return TRUE; @@ -1639,7 +1638,12 @@ moo_file_entry_set_property (GObject *object, G_GNUC_UNUSED const GValue *value, GParamSpec *pspec) { - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + switch (prop_id) + { + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } } diff --git a/moo/moofileview/moofileentry.h b/moo/moofileview/moofileentry.h index 47e0bc94..af59cd67 100644 --- a/moo/moofileview/moofileentry.h +++ b/moo/moofileview/moofileentry.h @@ -13,13 +13,11 @@ * License along with medit. If not, see . */ -#pragma once +#ifndef MOO_FILE_ENTRY_H +#define MOO_FILE_ENTRY_H #include #include -#ifdef __cplusplus -#include -#endif G_BEGIN_DECLS @@ -88,9 +86,4 @@ char *_moo_file_entry_completion_get_path (MooFileEntryCompletion G_END_DECLS -#ifdef __cplusplus -namespace moo -{ -MOO_DEFINE_SIMPLE_GOBJ_CLASS(FileEntry, moo::Entry, MooFileEntry, MOO_TYPE_FILE_ENTRY); -} -#endif // __cplusplus +#endif /* MOO_FILE_ENTRY_H */ diff --git a/moo/moofileview/moofilesystem.cpp b/moo/moofileview/moofilesystem.c similarity index 98% rename from moo/moofileview/moofilesystem.cpp rename to moo/moofileview/moofilesystem.c index 1fa5df3d..19a1fe1e 100644 --- a/moo/moofileview/moofilesystem.cpp +++ b/moo/moofileview/moofilesystem.c @@ -1,7 +1,7 @@ /* - * moofilesystem.cpp + * moofilesystem.c * - * Copyright (C) 2004-2016 by Yevgen Muntyan + * Copyright (C) 2004-2010 by Yevgen Muntyan * * This file is part of medit. medit is free software; you can * redistribute it and/or modify it under the terms of the @@ -20,7 +20,6 @@ #include "mooutils/mooutils-fs.h" #include "mooutils/mooutils-mem.h" #include "mooutils/mooutils.h" -#include "mooutils/moofilewatch.h" #include "marshals.h" #include #include @@ -32,12 +31,13 @@ #include #endif -using namespace moo; - -template -static void DEBUG_MESSAGE (const char*, Args&& ...args) +#if 0 && MOO_DEBUG +#define DEBUG_MESSAGE g_message +#else +static void G_GNUC_PRINTF(1,2) DEBUG_MESSAGE (G_GNUC_UNUSED const char *format, ...) { } +#endif #define BROKEN_NAME "<" "????" ">" #define FOLDERS_CACHE_SIZE 10 @@ -49,7 +49,7 @@ typedef struct { struct _MooFileSystemPrivate { GHashTable *folders; - MooFileWatchPtr fam; + MooFileWatch *fam; FoldersCache cache; guint debug_timeout; }; @@ -180,7 +180,7 @@ add_folder_cache (MooFileSystem *fs, if (cache->queue->length > FOLDERS_CACHE_SIZE) { - MooFolderImpl *old = (MooFolderImpl*) g_queue_pop_tail (cache->queue); + MooFolderImpl *old = g_queue_pop_tail (cache->queue); g_hash_table_remove (cache->paths, old->path); DEBUG_MESSAGE ("%s: removing folder %s from cache", G_STRFUNC, old->path); _moo_folder_impl_free (old); @@ -261,8 +261,8 @@ moo_file_system_dispose (GObject *object) if (fs->priv->fam) { - fs->priv->fam->close(nullptr); - fs->priv->fam.reset(); + moo_file_watch_close (fs->priv->fam, NULL); + moo_file_watch_unref (fs->priv->fam); } if (fs->priv->debug_timeout) @@ -288,7 +288,7 @@ _moo_file_system_create (void) } else { - return object_ref (fs_instance); + return g_object_ref (fs_instance); } } @@ -410,7 +410,7 @@ _moo_file_system_get_absolute_path (MooFileSystem *fs, } -MooFileWatchPtr +MooFileWatch * _moo_file_system_get_file_watch (MooFileSystem *fs) { g_return_val_if_fail (MOO_IS_FILE_SYSTEM (fs), NULL); @@ -418,7 +418,7 @@ _moo_file_system_get_file_watch (MooFileSystem *fs) if (!fs->priv->fam) { GError *error = NULL; - fs->priv->fam = MooFileWatch::create(&error); + fs->priv->fam = moo_file_watch_new (&error); if (!fs->priv->fam) { g_warning ("moo_fam_open failed: %s", moo_error_message (error)); @@ -482,7 +482,7 @@ get_folder (MooFileSystem *fs, if (!norm_path) return NULL; - folder = (MooFolder*) g_hash_table_lookup (fs->priv->folders, norm_path); + folder = g_hash_table_lookup (fs->priv->folders, norm_path); if (folder) { @@ -491,7 +491,7 @@ get_folder (MooFileSystem *fs, goto out; } - impl = (MooFolderImpl*) g_hash_table_lookup (fs->priv->cache.paths, norm_path); + impl = g_hash_table_lookup (fs->priv->cache.paths, norm_path); if (impl) { diff --git a/moo/moofileview/moofilesystem.h b/moo/moofileview/moofilesystem.h index 49942c7d..5b3fc7c6 100644 --- a/moo/moofileview/moofilesystem.h +++ b/moo/moofileview/moofilesystem.h @@ -19,20 +19,19 @@ * from gtk/gtkfilesystem.h). */ -#pragma once +#ifndef MOO_FILE_SYSTEM_H +#define MOO_FILE_SYSTEM_H #include "moofileview/moofolder.h" -#include "mooutils/moofilewatch.h" +#include #include -#ifdef __cplusplus -#include -#endif + G_BEGIN_DECLS + #define MOO_TYPE_FILE_SYSTEM (_moo_file_system_get_type ()) #define MOO_FILE_SYSTEM(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), MOO_TYPE_FILE_SYSTEM, MooFileSystem)) -#define MOO_FILE_SYSTEM_OPT(object) (moo::object_cast_opt (object)) #define MOO_FILE_SYSTEM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), MOO_TYPE_FILE_SYSTEM, MooFileSystemClass)) #define MOO_IS_FILE_SYSTEM(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), MOO_TYPE_FILE_SYSTEM)) #define MOO_IS_FILE_SYSTEM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), MOO_TYPE_FILE_SYSTEM)) @@ -47,10 +46,6 @@ typedef enum { MOO_DELETE_TO_TRASH = 1 << 1 } MooDeleteFileFlags; -#ifdef __cplusplus -MOO_DEFINE_FLAGS (MooDeleteFileFlags); -#endif // __cplusplus - struct _MooFileSystem { GObject parent; @@ -145,15 +140,9 @@ char *_moo_file_system_get_absolute_path (MooFileSystem *fs, MooFileSystem *_moo_folder_get_file_system (MooFolder *folder); +MooFileWatch *_moo_file_system_get_file_watch (MooFileSystem *fs); + + G_END_DECLS -#ifdef __cplusplus - -namespace moo -{ -MOO_DEFINE_SIMPLE_GOBJ_CLASS(FileSystem, g::Object, MooFileSystem, MOO_TYPE_FILE_SYSTEM); -} - -MooFileWatchPtr _moo_file_system_get_file_watch(MooFileSystem *fs); - -#endif // __cplusplus +#endif /* MOO_FILE_SYSTEM_H */ diff --git a/moo/moofileview/moofileview-dialogs.cpp b/moo/moofileview/moofileview-dialogs.c similarity index 98% rename from moo/moofileview/moofileview-dialogs.cpp rename to moo/moofileview/moofileview-dialogs.c index 52d8f554..ebd406f5 100644 --- a/moo/moofileview/moofileview-dialogs.cpp +++ b/moo/moofileview/moofileview-dialogs.c @@ -24,7 +24,6 @@ #include "moofileview/moofileprops-gxml.h" #include "moofileview/moocreatefolder-gxml.h" #include "moofileview/moofileview-drop-gxml.h" -#include #include #include #include @@ -198,7 +197,7 @@ container_cleanup (GtkContainer *container) g_list_foreach (children, (GFunc) g_object_ref, NULL); while (children) { - gtk_container_remove (container, GTK_WIDGET (children->data)); + gtk_container_remove (container, children->data); g_object_unref (children->data); children = g_list_delete_link (children, children); } @@ -250,13 +249,13 @@ _moo_file_props_dialog_set_file (MooFilePropsDialog *dialog, g_free (text); gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5); gtk_table_attach (GTK_TABLE (dialog->table), label, 0, 1, i, i+1, - GTK_EXPAND | GTK_FILL, GtkAttachOptions (0), 0, 0); + GTK_EXPAND | GTK_FILL, 0, 0, 0); label = gtk_label_new (*(p++)); gtk_label_set_selectable (GTK_LABEL (label), TRUE); gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); gtk_table_attach (GTK_TABLE (dialog->table), label, 1, 2, i, i+1, - GTK_EXPAND | GTK_FILL, GtkAttachOptions (0), 0, 0); + GTK_EXPAND | GTK_FILL, 0, 0, 0); } gtk_widget_show_all (dialog->table); diff --git a/moo/moofileview/moofileview-impl.h b/moo/moofileview/moofileview-impl.h index d95ffd1b..d609f692 100644 --- a/moo/moofileview/moofileview-impl.h +++ b/moo/moofileview/moofileview-impl.h @@ -13,12 +13,12 @@ * License along with medit. If not, see . */ -#pragma once - #include #include -G_BEGIN_DECLS +#ifndef MOO_FILE_VIEW_IMPL_H +#define MOO_FILE_VIEW_IMPL_H + typedef struct MooFileViewPrivate MooFileViewPrivate; @@ -82,4 +82,5 @@ void _moo_file_view_drag_finish (MooFileView *filevie /* returns list of absolute paths, must be freed together with content */ GList *_moo_file_view_get_filenames (MooFileView *fileview); -G_END_DECLS + +#endif /* MOO_FILE_VIEW_IMPL_H */ diff --git a/moo/moofileview/moofileview-tools.cpp b/moo/moofileview/moofileview-tools.c similarity index 91% rename from moo/moofileview/moofileview-tools.cpp rename to moo/moofileview/moofileview-tools.c index 21cb6446..52e371fd 100644 --- a/moo/moofileview/moofileview-tools.cpp +++ b/moo/moofileview/moofileview-tools.c @@ -60,9 +60,9 @@ moo_file_view_tool_action_finalize (GObject *object) { ToolAction *action = (ToolAction*) object; - g_slist_foreach (action->extensions, (GFunc) extern_g_free, NULL); + g_slist_foreach (action->extensions, (GFunc) g_free, NULL); g_slist_free (action->extensions); - g_slist_foreach (action->mimetypes, (GFunc) extern_g_free, NULL); + g_slist_foreach (action->mimetypes, (GFunc) g_free, NULL); g_slist_free (action->mimetypes); g_free (action->command); @@ -78,10 +78,10 @@ run_command (const char *command_template, GError *error = NULL; GRegex *regex; - regex = g_regex_new ("%[fF]", GRegexCompileFlags (0), GRegexMatchFlags (0), NULL); + regex = g_regex_new ("%[fF]", 0, 0, NULL); g_return_if_fail (regex != NULL); - command = g_regex_replace_literal (regex, command_template, -1, 0, files, GRegexMatchFlags (0), &error); + command = g_regex_replace_literal (regex, command_template, -1, 0, files, 0, &error); if (!command) { @@ -163,7 +163,7 @@ tools_info_free (ToolsInfo *info) { if (info) { - g_slist_foreach (info->actions, (GFunc) extern_g_object_unref, NULL); + g_slist_foreach (info->actions, (GFunc) g_object_unref, NULL); g_slist_free (info->actions); g_free (info); } @@ -177,7 +177,7 @@ remove_old_tools (MooFileView *fileview, { ToolsInfo *info; - info = reinterpret_cast (g_object_get_data (G_OBJECT (fileview), "moo-file-view-tools-info")); + info = g_object_get_data (G_OBJECT (fileview), "moo-file-view-tools-info"); if (info) { @@ -185,7 +185,7 @@ remove_old_tools (MooFileView *fileview, while (info->actions) { - GtkAction *action = GTK_ACTION (info->actions->data); + GtkAction *action = info->actions->data; gtk_action_group_remove_action (group, action); g_object_unref (action); info->actions = g_slist_delete_link (info->actions, info->actions); @@ -346,7 +346,7 @@ _moo_file_view_tools_load (MooFileView *fileview) for (l = info->actions; l != NULL; l = l->next) { - GtkAction *action = GTK_ACTION (l->data); + GtkAction *action = l->data; char *markup; gtk_action_group_add_action (group, action); @@ -372,7 +372,7 @@ action_check_one (ToolAction *action, return TRUE; for (l = action->extensions; l != NULL; l = l->next) - if (_moo_glob_match_simple (reinterpret_cast (l->data), _moo_file_display_name (file))) + if (_moo_glob_match_simple (l->data, _moo_file_display_name (file))) return TRUE; mime = _moo_file_get_mime_type (file); @@ -382,7 +382,7 @@ action_check_one (ToolAction *action, return FALSE; for (l = action->mimetypes; l != NULL; l = l->next) - if (moo_mime_type_is_subclass (mime, reinterpret_cast (l->data))) + if (moo_mime_type_is_subclass (mime, l->data)) return TRUE; return FALSE; @@ -397,7 +397,7 @@ action_check (ToolAction *action, while (files) { - MooFile *f = reinterpret_cast (files->data); + MooFile *f = files->data; if (!MOO_FILE_EXISTS (f) || MOO_FILE_IS_DIR (f) || !action_check_one (action, f)) { @@ -419,7 +419,7 @@ _moo_file_view_tools_check (MooFileView *fileview) ToolsInfo *info; GSList *l; - info = reinterpret_cast (g_object_get_data (G_OBJECT (fileview), "moo-file-view-tools-info")); + info = g_object_get_data (G_OBJECT (fileview), "moo-file-view-tools-info"); if (!info) return; @@ -434,7 +434,7 @@ _moo_file_view_tools_check (MooFileView *fileview) } for (l = info->actions; l != NULL; l = l->next) - action_check (reinterpret_cast (l->data), files); + action_check (l->data, files); g_list_foreach (files, (GFunc) _moo_file_unref, NULL); g_list_free (files); diff --git a/moo/moofileview/moofileview.cpp b/moo/moofileview/moofileview.c similarity index 97% rename from moo/moofileview/moofileview.cpp rename to moo/moofileview/moofileview.c index 8325b1a6..f96137e4 100644 --- a/moo/moofileview/moofileview.cpp +++ b/moo/moofileview/moofileview.c @@ -42,13 +42,11 @@ #include "mooutils/mooatom.h" #include "mooutils/moolist.h" #include "mooutils/moocompat.h" -#include "moocpp/moocpp.h" #include "marshals.h" #include "mooutils/mooi18n.h" #include #include -using namespace moo; #ifndef __WIN32__ #define TYPEAHEAD_CASE_SENSITIVE_DEFAULT FALSE @@ -148,7 +146,7 @@ struct MooFileViewPrivate { MooUiXml *ui_xml; gboolean has_selection; - GtkWidget *props_dialog; + gpointer props_dialog; GtkTargetList *targets; GSList *drag_dest_widgets; @@ -397,7 +395,7 @@ static gboolean moo_file_view_drop_text (MooFileView *fileview, int x, int y, guint time, - gboolean *delete_); + gboolean *delete); static void file_list_selection_changed (MooFileView *file_view, @@ -897,7 +895,7 @@ moo_file_view_init (MooFileView *fileview) history_init (fileview); - fileview->priv->model = GTK_TREE_MODEL (g_object_new (MOO_TYPE_FOLDER_MODEL, nullptr)); + fileview->priv->model = g_object_new (MOO_TYPE_FOLDER_MODEL, (const char*) NULL); g_signal_connect_swapped (fileview->priv->model, "row-inserted", G_CALLBACK (file_added), fileview); fileview->priv->filter_model = @@ -1035,7 +1033,7 @@ moo_file_view_set_current_dir (MooFileView *fileview, if (fileview->priv->current_dir) g_object_unref (fileview->priv->current_dir); - fileview->priv->current_dir = MOO_FOLDER (g_object_ref (folder)); + fileview->priv->current_dir = g_object_ref (folder); _moo_folder_model_set_folder (MOO_FOLDER_MODEL (fileview->priv->model), folder); @@ -1469,7 +1467,7 @@ _moo_file_view_setup_button_drag_dest (MooFileView *fileview, g_object_set_data_full (G_OBJECT (button), "moo-fileview-signal", g_strdup (sig_name), g_free); - gtk_drag_dest_set (button, GtkDestDefaults (0), NULL, 0, + gtk_drag_dest_set (button, 0, NULL, 0, GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_LINK); gtk_drag_dest_set_target_list (button, fileview->priv->targets); fileview->priv->drag_dest_widgets = @@ -1486,12 +1484,11 @@ create_toolbar (MooFileView *fileview) { GtkToolbar *toolbar; - toolbar = GTK_TOOLBAR ( - moo_ui_xml_create_widget (fileview->priv->ui_xml, - MOO_UI_TOOLBAR, - "MooFileView/Toolbar", - fileview->priv->actions, - NULL)); + toolbar = moo_ui_xml_create_widget (fileview->priv->ui_xml, + MOO_UI_TOOLBAR, + "MooFileView/Toolbar", + fileview->priv->actions, + NULL); g_return_val_if_fail (toolbar != NULL, NULL); fileview->toolbar = GTK_WIDGET (toolbar); @@ -1781,7 +1778,7 @@ create_bookmark_view (MooFileView *fileview) // GDK_ACTION_ASK | GDK_ACTION_COPY | // GDK_ACTION_MOVE | GDK_ACTION_LINK); #endif - gtk_drag_dest_set (bkview, GtkDestDefaults (0), NULL, 0, + gtk_drag_dest_set (bkview, 0, NULL, 0, GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_LINK); gtk_drag_dest_set_target_list (bkview, fileview->priv->targets); @@ -2097,8 +2094,8 @@ history_init (MooFileView *fileview) static void history_clear (MooFileView *fileview) { - g_slist_foreach (fileview->priv->history->back, (GFunc) extern_g_free, NULL); - g_slist_foreach (fileview->priv->history->fwd, (GFunc) extern_g_free, NULL); + g_slist_foreach (fileview->priv->history->back, (GFunc) g_free, NULL); + g_slist_foreach (fileview->priv->history->fwd, (GFunc) g_free, NULL); g_slist_free (fileview->priv->history->back); g_slist_free (fileview->priv->history->fwd); fileview->priv->history->back = NULL; @@ -2130,14 +2127,14 @@ history_get (MooFileView *fileview, if (!hist->fwd) return NULL; else - return reinterpret_cast (hist->fwd->data); + return hist->fwd->data; } else { if (!hist->back) return NULL; else - return reinterpret_cast (hist->back->data); + return hist->back->data; } } @@ -2173,7 +2170,7 @@ history_go (MooFileView *fileview, push_to = &hist->fwd; } - tmp = reinterpret_cast ((*pop_from)->data); + tmp = (*pop_from)->data; *pop_from = g_slist_delete_link (*pop_from, *pop_from); *push_to = g_slist_prepend (*push_to, hist->current); hist->current = tmp; @@ -2209,7 +2206,7 @@ history_add (MooFileView *fileview, if (hist->fwd) { could_go_forward = TRUE; - g_slist_foreach (hist->fwd, (GFunc) extern_g_free, NULL); + g_slist_foreach (hist->fwd, (GFunc) g_free, NULL); g_slist_free (hist->fwd); hist->fwd = NULL; } @@ -2310,7 +2307,7 @@ moo_file_view_set_property (GObject *object, break; case PROP_BOOKMARK_MGR: - moo_file_view_set_bookmark_mgr (fileview, reinterpret_cast (g_value_get_object (value))); + moo_file_view_set_bookmark_mgr (fileview, g_value_get_object (value)); break; case PROP_SORT_CASE_SENSITIVE: @@ -2340,7 +2337,7 @@ moo_file_view_set_property (GObject *object, break; case PROP_VIEW_TYPE: - _moo_file_view_set_view_type (fileview, MooFileViewType (g_value_get_enum (value))); + _moo_file_view_set_view_type (fileview, g_value_get_enum (value)); break; default: @@ -2547,7 +2544,7 @@ clipboard_new (MooFolder *folder, g_return_val_if_fail (MOO_IS_FOLDER (folder), NULL); cb = g_new0 (Clipboard, 1); - cb->folder = MOO_FOLDER (g_object_ref (folder)); + cb->folder = g_object_ref (folder); cb->files = file_list_copy (files); cb->cut = cut != 0; @@ -2776,7 +2773,7 @@ file_view_paste_clipboard (MooFileView *fileview) GList *filenames; const char *destdir; - remote = MOO_FILE_VIEW (moo_selection_data_get_pointer (data, CLIPBOARD_ATOM)); + remote = moo_selection_data_get_pointer (data, CLIPBOARD_ATOM); g_return_if_fail (remote != NULL); cb = remote->priv->clipboard; @@ -2810,7 +2807,7 @@ file_view_paste_clipboard (MooFileView *fileview) copy_files (fileview, filenames, destdir); } - g_list_foreach (filenames, (GFunc) extern_g_free, NULL); + g_list_foreach (filenames, (GFunc) g_free, NULL); g_list_free (filenames); goto out; @@ -2840,7 +2837,7 @@ file_view_paste_clipboard (MooFileView *fileview) copy_files (fileview, filenames, destdir); g_strfreev (uris); - g_list_foreach (filenames, (GFunc) extern_g_free, NULL); + g_list_foreach (filenames, (GFunc) g_free, NULL); g_list_free (filenames); goto out; @@ -2870,7 +2867,7 @@ _moo_file_view_set_sort_case_sensitive (MooFileView *fileview, fileview->priv->sort_flags &= ~MOO_FOLDER_MODEL_SORT_CASE_SENSITIVE; _moo_folder_model_set_sort_flags (MOO_FOLDER_MODEL (fileview->priv->model), - MooFolderModelSortFlags (fileview->priv->sort_flags)); + fileview->priv->sort_flags); g_object_notify (G_OBJECT (fileview), "sort-case-sensitive"); } } @@ -2889,7 +2886,7 @@ _moo_file_view_set_sort_folders_first (MooFileView *fileview, fileview->priv->sort_flags &= ~MOO_FOLDER_MODEL_SORT_FOLDERS_FIRST; _moo_folder_model_set_sort_flags (MOO_FOLDER_MODEL (fileview->priv->model), - MooFolderModelSortFlags (fileview->priv->sort_flags)); + fileview->priv->sort_flags); g_object_notify (G_OBJECT (fileview), "sort-folders-first"); } } @@ -2935,7 +2932,7 @@ init_filter_combo (MooFileView *fileview) GtkFileFilter *filter; mgr = moo_filter_mgr_default (); - fileview->priv->filter_mgr = MOO_FILTER_MGR (g_object_ref (mgr)); + fileview->priv->filter_mgr = g_object_ref (mgr); block_filter_signals (fileview); @@ -3156,7 +3153,7 @@ prepend_file (GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data) { - FileList **list = reinterpret_cast (user_data); + FileList **list = user_data; MooFile *file = NULL; gtk_tree_model_get (model, iter, COLUMN_FILE, &file, -1); @@ -3447,7 +3444,7 @@ file_view_properties_dialog (MooFileView *fileview) G_CALLBACK (props_dialog_destroyed), fileview); } - _moo_file_props_dialog_set_file (MOO_FILE_PROPS_DIALOG (fileview->priv->props_dialog), + _moo_file_props_dialog_set_file (fileview->priv->props_dialog, files->data, fileview->priv->current_dir); gtk_window_present (GTK_WINDOW (fileview->priv->props_dialog)); @@ -3460,16 +3457,6 @@ file_view_properties_dialog (MooFileView *fileview) /* Popup menu */ -namespace { - -struct Data -{ - MooFileView *fileview; - GList *rows; -}; - -} // anonymous namespace - /* TODO */ static void menu_position_func (G_GNUC_UNUSED GtkMenu *menu, @@ -3479,7 +3466,11 @@ menu_position_func (G_GNUC_UNUSED GtkMenu *menu, gpointer user_data) { GdkWindow *window; - Data *data = reinterpret_cast (user_data); + + struct { + MooFileView *fileview; + GList *rows; + } *data = user_data; window = GTK_WIDGET(data->fileview)->window; gdk_window_get_origin (window, x, y); @@ -3495,13 +3486,16 @@ do_popup (MooFileView *fileview, GtkWidget *menu; FileList *files = NULL; GList *l; - Data position_data; + struct { + MooFileView *fileview; + GList *rows; + } position_data; for (l = selected; l != NULL; l = l->next) { GtkTreeIter iter; MooFile *file = NULL; - gtk_tree_model_get_iter (fileview->priv->filter_model, &iter, reinterpret_cast (l->data)); + gtk_tree_model_get_iter (fileview->priv->filter_model, &iter, l->data); gtk_tree_model_get (fileview->priv->filter_model, &iter, COLUMN_FILE, &file, -1); if (file) @@ -3679,7 +3673,7 @@ moo_file_view_set_bookmark_mgr (MooFileView *fileview, g_object_unref (fileview->priv->bookmark_mgr); } - fileview->priv->bookmark_mgr = MOO_BOOKMARK_MGR (g_object_ref (mgr)); + fileview->priv->bookmark_mgr = g_object_ref (mgr); _moo_bookmark_mgr_add_user (fileview->priv->bookmark_mgr, fileview, fileview->priv->actions, fileview->priv->ui_xml, "MooFileView/Toolbar/BookmarksMenu/Bookmarks"); @@ -3726,13 +3720,21 @@ view_files (MooFileView *fileview) static void add_bookmark (MooFileView *fileview) { + const char *path; + char *display_path; + MooBookmark *bookmark; + g_return_if_fail (fileview->priv->current_dir != NULL); - const char *path = _moo_folder_get_path (fileview->priv->current_dir); - gstr display_path = g::filename_display_name (path); + path = _moo_folder_get_path (fileview->priv->current_dir); + display_path = g_filename_display_name (path); + bookmark = _moo_bookmark_new (display_path, path, MOO_STOCK_FOLDER); - auto bookmark = objp::make (display_path, path, MOO_STOCK_FOLDER); - _moo_bookmark_mgr_add (fileview->priv->bookmark_mgr, std::move(bookmark)); + _moo_bookmark_mgr_add (fileview->priv->bookmark_mgr, + bookmark); + + _moo_bookmark_free (bookmark); + g_free (display_path); } @@ -3741,8 +3743,8 @@ edit_bookmarks (MooFileView *fileview) { GtkWidget *dialog; - dialog = GTK_WIDGET (g_object_get_data (G_OBJECT (fileview), - "moo-file-view-bookmarks-editor")); + dialog = g_object_get_data (G_OBJECT (fileview), + "moo-file-view-bookmarks-editor"); if (!dialog) { @@ -3777,7 +3779,7 @@ static void bookmark_activated (MooFileView *fileview, MooBookmark *bookmark) { - g_return_if_fail (bookmark != nullptr && !bookmark->path.empty()); + g_return_if_fail (bookmark != NULL && bookmark->path != NULL); moo_file_view_chdir_path (fileview, bookmark->path, NULL); } @@ -3927,7 +3929,7 @@ file_added (MooFileView *fileview) { if (fileview->priv->select_file && !fileview->priv->select_file_idle) fileview->priv->select_file_idle = - g_idle_add ((GSourceFunc) do_select_name, fileview); + gdk_threads_add_idle ((GSourceFunc) do_select_name, fileview); } @@ -4515,7 +4517,7 @@ moo_file_view_key_press (MooFileView *fileview, copy = gdk_event_copy ((GdkEvent*) event); g_object_unref (copy->key.window); - copy->key.window = GDK_WINDOW (g_object_ref (entry->window)); + copy->key.window = g_object_ref (entry->window); gtk_widget_grab_focus (entry); @@ -5022,7 +5024,7 @@ icon_drag_begin (MooFileView *fileview, } g_object_set_data_full (G_OBJECT (fileview), "moo-file-view-source-uris", - uris, (GDestroyNotify) extern_g_strfreev); + uris, (GDestroyNotify) g_strfreev); g_object_set_data_full (G_OBJECT (fileview), "moo-file-view-source-dir", g_object_ref (folder), g_object_unref); @@ -5040,7 +5042,7 @@ icon_drag_data_get (MooFileView *fileview, { char **uris; - uris = reinterpret_cast (g_object_get_data (G_OBJECT (fileview), "moo-file-view-source-uris")); + uris = g_object_get_data (G_OBJECT (fileview), "moo-file-view-source-uris"); g_return_if_fail (uris && *uris); gtk_selection_data_set_uris (data, uris); @@ -5159,9 +5161,9 @@ drop_open_timeout_func (MooFileView *fileview) if (++fileview->priv->drop_to.n_blinks > 1) fileview->priv->drop_to.timeout = - g_timeout_add (DROP_OPEN_BLINK_TIME, - (GSourceFunc) drop_open_timeout_func2, - fileview); + gdk_threads_add_timeout (DROP_OPEN_BLINK_TIME, + (GSourceFunc) drop_open_timeout_func2, + fileview); } else { @@ -5178,9 +5180,9 @@ drop_open_timeout_func (MooFileView *fileview) if (++fileview->priv->drop_to.n_blinks > 1) fileview->priv->drop_to.timeout = - g_timeout_add (DROP_OPEN_BLINK_TIME, - (GSourceFunc) drop_open_timeout_func2, - fileview); + gdk_threads_add_timeout (DROP_OPEN_BLINK_TIME, + (GSourceFunc) drop_open_timeout_func2, + fileview); } else { @@ -5195,9 +5197,9 @@ drop_open_timeout_func (MooFileView *fileview) if (!fileview->priv->drop_to.timeout) fileview->priv->drop_to.timeout = - g_timeout_add (DROP_OPEN_BLINK_TIME, - (GSourceFunc) drop_open_timeout_func, - fileview); + gdk_threads_add_timeout (DROP_OPEN_BLINK_TIME, + (GSourceFunc) drop_open_timeout_func, + fileview); return FALSE; } @@ -5340,7 +5342,7 @@ moo_file_view_drop_data_received (MooFileView *fileview, guint time) { gboolean success = FALSE; - gboolean delete_ = FALSE; + gboolean delete = FALSE; if (data->target == moo_atom_uri_list ()) { @@ -5365,18 +5367,18 @@ moo_file_view_drop_data_received (MooFileView *fileview, { char *text = (char*) gtk_selection_data_get_text (data); - delete_ = context->suggested_action & GDK_ACTION_MOVE; + delete = context->suggested_action & GDK_ACTION_MOVE; if (text) success = moo_file_view_drop_text (fileview, text, path, widget, - context, x, y, time, &delete_); + context, x, y, time, &delete); else g_critical ("oops"); g_free (text); } - _moo_file_view_drag_finish (fileview, context, success, delete_, time); + _moo_file_view_drag_finish (fileview, context, success, delete, time); return TRUE; } @@ -5478,7 +5480,7 @@ drag_motion (GtkWidget *widget, if (MOO_IS_ICON_VIEW (widget)) { current_dir = fileview->priv->current_dir; - source_dir = MOO_FOLDER (g_object_get_data (G_OBJECT (fileview), "moo-file-view-source-dir")); + source_dir = g_object_get_data (G_OBJECT (fileview), "moo-file-view-source-dir"); if (!current_dir) goto out; @@ -5514,7 +5516,7 @@ drag_motion (GtkWidget *widget, gdk_drag_status (context, context->actions & GDK_ACTION_MOVE ? GDK_ACTION_MOVE : context->suggested_action, time); else - gdk_drag_status (context, GdkDragAction (0), time); + gdk_drag_status (context, 0, time); if (highlight_target) { @@ -5544,9 +5546,9 @@ drag_motion (GtkWidget *widget, gtk_tree_row_reference_new (_moo_tree_view_get_model (widget), path); fileview->priv->drop_to.timeout = - g_timeout_add (DROP_OPEN_TIMEOUT, - (GSourceFunc) drop_open_timeout_func, - fileview); + gdk_threads_add_timeout (DROP_OPEN_TIMEOUT, + (GSourceFunc) drop_open_timeout_func, + fileview); fileview->priv->drop_to.x = abs_x; fileview->priv->drop_to.y = abs_y; @@ -5608,9 +5610,9 @@ button_drag_motion (MooFileView *fileview, fileview->priv->drop_to.button = button; fileview->priv->drop_to.timeout = - g_timeout_add (DROP_OPEN_TIMEOUT, - (GSourceFunc) drop_open_timeout_func, - fileview); + gdk_threads_add_timeout (DROP_OPEN_TIMEOUT, + (GSourceFunc) drop_open_timeout_func, + fileview); } gdk_drag_status (context, context->suggested_action, time); @@ -5641,7 +5643,7 @@ sync_dest_targets (MooFileView *fileview) fileview->priv->targets); for (l = fileview->priv->drag_dest_widgets; l != NULL; l = l->next) - gtk_drag_dest_set_target_list (GTK_WIDGET (l->data), fileview->priv->targets); + gtk_drag_dest_set_target_list (l->data, fileview->priv->targets); } @@ -5682,7 +5684,7 @@ run_command_on_files (MooFileView *fileview, argv[n_args] = NULL; for (i = 0, l = filenames; l != NULL; l = l->next, i++) - argv[n_first_args + i] = (char*) l->data; + argv[n_first_args + i] = l->data; if (!_moo_unix_spawn_async (argv, G_SPAWN_SEARCH_PATH, &error)) { @@ -5696,7 +5698,7 @@ run_command_on_files (MooFileView *fileview, !strcmp (destdir, _moo_folder_get_path (fileview->priv->current_dir)) && list_len == 1) { - char *basename = g_path_get_basename ((const char*) filenames->data); + char *basename = g_path_get_basename (filenames->data); if (basename) _moo_file_view_select_name (fileview, basename); @@ -5768,7 +5770,7 @@ copy_or_move_files (MooFileView *fileview, fileview->priv->current_dir && strcmp (destdir, _moo_folder_get_path (fileview->priv->current_dir)) == 0) { - char *basename = g_path_get_basename(reinterpret_cast (filenames->data)); + char *basename = g_path_get_basename (filenames->data); if (basename) _moo_file_view_select_name (fileview, basename); @@ -5808,7 +5810,7 @@ link_files (G_GNUC_UNUSED MooFileView *fileview, static void free_string_list (GList *list) { - g_list_foreach (list, (GFunc) extern_g_free, NULL); + g_list_foreach (list, (GFunc) g_free, NULL); g_list_free (list); } @@ -5823,11 +5825,11 @@ drop_item_activated (GObject *item, char *destdir; data = g_object_get_data (item, "moo-file-view-drop-action"); - filenames = reinterpret_cast (g_object_get_data (item, "moo-file-view-drop-files")); - destdir = reinterpret_cast (g_object_get_data (item, "moo-file-view-drop-dir")); + filenames = g_object_get_data (item, "moo-file-view-drop-files"); + destdir = g_object_get_data (item, "moo-file-view-drop-dir"); g_return_if_fail (filenames != NULL && destdir != NULL); - action = GdkDragAction (GPOINTER_TO_INT (data)); + action = GPOINTER_TO_INT (data); switch (action) { @@ -6075,7 +6077,7 @@ moo_file_view_drop_text (G_GNUC_UNUSED MooFileView *fileview, G_GNUC_UNUSED int x, G_GNUC_UNUSED int y, G_GNUC_UNUSED guint time, - G_GNUC_UNUSED gboolean *delete_) + G_GNUC_UNUSED gboolean *delete) { char *name = NULL; gboolean result = FALSE; @@ -6202,11 +6204,11 @@ bookmark_drag_motion (MooBookmarkView *bkview, cancel_drop_open (fileview); fileview->priv->drop_to.row = - gtk_tree_row_reference_new (_moo_tree_view_get_model (bkview), path); + gtk_tree_row_reference_new (_moo_tree_view_get_model (bkview), path); fileview->priv->drop_to.timeout = - g_timeout_add (DROP_OPEN_TIMEOUT, - (GSourceFunc) drop_open_timeout_func, - fileview); + gdk_threads_add_timeout (DROP_OPEN_TIMEOUT, + (GSourceFunc) drop_open_timeout_func, + fileview); fileview->priv->drop_to.x = cell_x; fileview->priv->drop_to.y = cell_y; fileview->priv->drop_to.cell = cell; diff --git a/moo/moofileview/moofileview.cmake b/moo/moofileview/moofileview.cmake index ba67713c..6bb618ba 100644 --- a/moo/moofileview/moofileview.cmake +++ b/moo/moofileview/moofileview.cmake @@ -1,35 +1,35 @@ SET(moofileview_sources moofileview/moofileview.cmake - moofileview/moobookmarkmgr.cpp + moofileview/moobookmarkmgr.c moofileview/moobookmarkmgr.h - moofileview/moobookmarkview.cpp + moofileview/moobookmarkview.c moofileview/moobookmarkview.h - moofileview/moofile.cpp + moofileview/moofile.c moofileview/moofile.h moofileview/moofile-private.h - moofileview/moofileentry.cpp + moofileview/moofileentry.c moofileview/moofileentry.h - moofileview/moofilesystem.cpp + moofileview/moofilesystem.c moofileview/moofilesystem.h - moofileview/moofileview.cpp + moofileview/moofileview.c moofileview/moofileview.h moofileview/moofileview-accels.h moofileview/moofileview-aux.h - moofileview/moofileview-dialogs.cpp + moofileview/moofileview-dialogs.c moofileview/moofileview-dialogs.h moofileview/moofileview-impl.h moofileview/moofileview-private.h - moofileview/moofileview-tools.cpp + moofileview/moofileview-tools.c moofileview/moofileview-tools.h moofileview/moofolder-private.h - moofileview/moofolder.cpp + moofileview/moofolder.c moofileview/moofolder.h - moofileview/moofoldermodel.cpp + moofileview/moofoldermodel.c moofileview/moofoldermodel.h moofileview/moofoldermodel-private.h - moofileview/mooiconview.cpp + moofileview/mooiconview.c moofileview/mooiconview.h - moofileview/mootreeview.cpp + moofileview/mootreeview.c moofileview/mootreeview.h ) diff --git a/moo/moofileview/moofolder-private.h b/moo/moofileview/moofolder-private.h index 48d0582c..e5991d38 100644 --- a/moo/moofileview/moofolder-private.h +++ b/moo/moofileview/moofolder-private.h @@ -13,17 +13,12 @@ * License along with medit. If not, see . */ -#pragma once +#ifndef MOO_FOLDER_PRIVATE_H +#define MOO_FOLDER_PRIVATE_H #include "moofileview/moofolder.h" #include "moofileview/moofile-private.h" #include "moofileview/moofilesystem.h" -#include "mooutils/moofilewatch.h" -#ifdef __cplusplus -#include -#endif - -using namespace moo; G_BEGIN_DECLS @@ -62,8 +57,7 @@ typedef struct { guint icons_counter; } Debug; -typedef enum Stage { - STAGE_NONE = 0, +typedef enum { STAGE_NAMES = 1, STAGE_STAT = 2, STAGE_MIME_TYPE = 3 @@ -85,7 +79,7 @@ struct _MooFolderImpl { double populate_timeout; Debug debug; GTimer *timer; - MooFileWatchPtr fam; + MooFileWatch *fam; guint fam_request; guint reload_idle; @@ -112,3 +106,5 @@ gsize _moo_folder_mem_usage (MooFolder *folder); G_END_DECLS + +#endif /* MOO_FOLDER_PRIVATE_H */ diff --git a/moo/moofileview/moofolder.cpp b/moo/moofileview/moofolder.c similarity index 93% rename from moo/moofileview/moofolder.cpp rename to moo/moofileview/moofolder.c index b2c3ea61..6a607a07 100644 --- a/moo/moofileview/moofolder.cpp +++ b/moo/moofileview/moofolder.c @@ -1,7 +1,7 @@ /* - * moofolder.cpp + * moofolder.c * - * Copyright (C) 2004-2016 by Yevgen Muntyan + * Copyright (C) 2004-2010 by Yevgen Muntyan * * This file is part of medit. medit is free software; you can * redistribute it and/or modify it under the terms of the @@ -21,8 +21,6 @@ #include "moofileview/moofolder-private.h" #include "mooutils/mooutils-fs.h" #include "mooutils/mooutils-misc.h" -#include "mooutils/moofilewatch.h" -#include "moocpp/moocpp.h" #include "marshals.h" #include #include @@ -48,8 +46,7 @@ G_STMT_START { \ #if 0 #define PRINT_TIMES g_print #else -template -static void PRINT_TIMES (const char*, Args&& ...) +static void G_GNUC_PRINTF(1,2) PRINT_TIMES (G_GNUC_UNUSED const char *format, ...) { } #endif @@ -155,8 +152,8 @@ moo_folder_impl_new (MooFileSystem *fs, impl = g_new0 (MooFolderImpl, 1); impl->deleted = FALSE; - impl->done = STAGE_NONE; - impl->wanted = STAGE_NONE; + impl->done = 0; + impl->wanted = 0; impl->fs = fs; impl->dir = dir; impl->files_copy = NULL; @@ -406,10 +403,10 @@ _moo_folder_set_wanted (MooFolder *folder, folder->impl->populate_func (folder->impl)) { folder->impl->populate_idle_id = - g_timeout_add_full (folder->impl->populate_priority, - folder->impl->populate_timeout, - folder->impl->populate_func, - folder->impl, NULL); + gdk_threads_add_timeout_full (folder->impl->populate_priority, + folder->impl->populate_timeout, + folder->impl->populate_func, + folder->impl, NULL); } g_object_unref (folder); @@ -545,7 +542,7 @@ get_stat_a_bit (MooFolderImpl *impl) while (!done) { GSList *changed = impl->files_copy; - MooFile *file = (MooFile*) changed->data; + MooFile *file = changed->data; impl->files_copy = g_slist_remove_link (impl->files_copy, impl->files_copy); if (!(file->flags & MOO_FILE_HAS_STAT)) @@ -614,19 +611,19 @@ get_stat_a_bit (MooFolderImpl *impl) TIMER_CLEAR (impl->timer); if (impl->populate_func (impl)) impl->populate_idle_id = - g_timeout_add_full (impl->populate_priority, - impl->populate_timeout, - impl->populate_func, - impl, NULL); + gdk_threads_add_timeout_full (impl->populate_priority, + impl->populate_timeout, + impl->populate_func, + impl, NULL); } else { TIMER_CLEAR (impl->timer); impl->populate_idle_id = - g_timeout_add_full (impl->populate_priority, - impl->populate_timeout, - impl->populate_func, - impl, NULL); + gdk_threads_add_timeout_full (impl->populate_priority, + impl->populate_timeout, + impl->populate_func, + impl, NULL); } } else @@ -662,7 +659,7 @@ get_icons_a_bit (MooFolderImpl *impl) while (!done) { GSList *changed = impl->files_copy; - MooFile *file = (MooFile*) changed->data; + MooFile *file = changed->data; impl->files_copy = g_slist_remove_link (impl->files_copy, changed); @@ -791,13 +788,13 @@ static void file_created (MooFolderImpl *folder, const char *name); static void -fam_callback (MooFileWatch& watch, - MooFileEvent* event, +fam_callback (MooFileWatch *watch, + MooFileEvent *event, gpointer data) { - MooFolderImpl *impl = (MooFolderImpl*) data; + MooFolderImpl *impl = data; - g_return_if_fail (&watch == &*impl->fam); + g_return_if_fail (watch == impl->fam); g_return_if_fail (event->monitor_id == impl->fam_request); switch (event->code) @@ -827,12 +824,12 @@ start_monitor (MooFolderImpl *impl) g_return_if_fail (!impl->deleted); g_return_if_fail (impl->fam_request == 0); impl->fam = _moo_file_system_get_file_watch (impl->fs); - g_return_if_fail (impl->fam != nullptr); + g_return_if_fail (impl->fam != NULL); impl->fam_request = - impl->fam->create_monitor (impl->path, - fam_callback, impl, - NULL, &error); + moo_file_watch_create_monitor (impl->fam, impl->path, + fam_callback, impl, + NULL, &error); if (!impl->fam_request) { @@ -849,7 +846,7 @@ stop_monitor (MooFolderImpl *impl) { if (impl->fam_request) { - impl->fam->cancel_monitor (impl->fam_request); + moo_file_watch_cancel_monitor (impl->fam, impl->fam_request); impl->fam = NULL; impl->fam_request = 0; } @@ -871,7 +868,7 @@ file_deleted (MooFolderImpl *impl, return; } - file = (MooFile*) g_hash_table_lookup (impl->files, name); + file = g_hash_table_lookup (impl->files, name); if (!file) return; _moo_file_ref (file); @@ -907,7 +904,7 @@ file_changed (MooFolderImpl *impl, if (!strcmp (name, impl->path)) { if (!impl->reload_idle) - impl->reload_idle = g_idle_add ((GSourceFunc) moo_folder_do_reload, impl); + impl->reload_idle = gdk_threads_add_idle ((GSourceFunc) moo_folder_do_reload, impl); } } @@ -962,7 +959,7 @@ _moo_folder_check_exists (MooFolder *folder, g_return_if_fail (MOO_IS_FOLDER (folder)); g_return_if_fail (name != NULL); - file = (MooFile*) g_hash_table_lookup (folder->impl->files, name); + file = g_hash_table_lookup (folder->impl->files, name); path = g_build_filename (folder->impl->path, name, NULL); exists = g_file_test (path, G_FILE_TEST_EXISTS); @@ -983,7 +980,7 @@ moo_folder_do_reload (MooFolderImpl *impl) GDir *dir; GError *error = NULL; const char *name; - GSList *new_ = NULL, *deleted = NULL, *l; + GSList *new = NULL, *deleted = NULL, *l; g_return_val_if_fail (!impl->deleted, FALSE); impl->reload_idle = 0; @@ -1003,17 +1000,17 @@ moo_folder_do_reload (MooFolderImpl *impl) while ((name = g_dir_read_name (dir))) g_hash_table_insert (files, g_strdup (name), NULL); - diff_hash_tables (files, impl->files, &new_, &deleted); + diff_hash_tables (files, impl->files, &new, &deleted); - for (l = new_; l != NULL; l = l->next) - file_created (impl, (const char*) l->data); + for (l = new; l != NULL; l = l->next) + file_created (impl, l->data); for (l = deleted; l != NULL; l = l->next) - file_deleted (impl, (const char*) l->data); + file_deleted (impl, l->data); - g_slist_foreach (new_, (GFunc) extern_g_free, NULL); - g_slist_foreach (deleted, (GFunc) extern_g_free, NULL); - g_slist_free (new_); + g_slist_foreach (new, (GFunc) g_free, NULL); + g_slist_foreach (deleted, (GFunc) g_free, NULL); + g_slist_free (new); g_slist_free (deleted); g_hash_table_destroy (files); g_dir_close (dir); @@ -1200,10 +1197,10 @@ check_unique (const char *key, G_GNUC_UNUSED gpointer whatever, gpointer user_data) { - struct Data { + struct { GSList *list; GHashTable *table2; - } *data = (Data*) user_data; + } *data = user_data; gpointer orig_key, value; if (!g_hash_table_lookup_extended (data->table2, key, &orig_key, &value)) diff --git a/moo/moofileview/moofoldermodel-private.h b/moo/moofileview/moofoldermodel-private.h index 856aa4d6..d62b4103 100644 --- a/moo/moofileview/moofoldermodel-private.h +++ b/moo/moofileview/moofoldermodel-private.h @@ -202,7 +202,7 @@ static MooFile *file_list_nth (FileList *flist, { MooFile *file; g_assert (0 <= index_ && index_ < flist->size); - file = (MooFile*) g_list_nth_data (flist->list, index_); + file = g_list_nth_data (flist->list, index_); g_assert (file != NULL); return file; } @@ -215,7 +215,7 @@ static int file_list_position (FileList *flist, GList *link; int position; g_assert (file != NULL); - link = (GList*) g_hash_table_lookup (flist->file_to_link, file); + link = g_hash_table_lookup (flist->file_to_link, file); g_assert (link != NULL); position = g_list_position (flist->list, link); g_assert (position >= 0); @@ -226,7 +226,7 @@ static int file_list_position (FileList *flist, static MooFile *file_list_find_name (FileList *flist, const char *name) { - return (MooFile*) g_hash_table_lookup (flist->name_to_file, name); + return g_hash_table_lookup (flist->name_to_file, name); } @@ -234,15 +234,15 @@ static MooFile *file_list_find_display_name (FileList *flist, const char *display_name) { - return (MooFile*) g_hash_table_lookup (flist->display_name_to_file, - display_name); + return g_hash_table_lookup (flist->display_name_to_file, + display_name); } static MooFile *file_list_first (FileList *flist) { if (flist->list) - return (MooFile*) flist->list->data; + return flist->list->data; else return NULL; } @@ -251,10 +251,10 @@ static MooFile *file_list_first (FileList *flist) static MooFile *file_list_next (FileList *flist, MooFile *file) { - GList *link = (GList*) g_hash_table_lookup (flist->file_to_link, file); + GList *link = g_hash_table_lookup (flist->file_to_link, file); g_assert (link != NULL); if (link->next) - return (MooFile*) link->next->data; + return link->next->data; else return NULL; } @@ -266,7 +266,7 @@ static GSList *file_list_get_slist (FileList *flist) GSList *slist = NULL; for (l = flist->list; l != NULL; l = l->next) - slist = g_slist_prepend (slist, _moo_file_ref ((MooFile*) l->data)); + slist = g_slist_prepend (slist, _moo_file_ref (l->data)); return g_slist_reverse (slist); } @@ -327,7 +327,7 @@ static GList *_list_find (FileList *flist, MooFile *file, int *index_) { - GList *link = (GList*) g_hash_table_lookup (flist->file_to_link, file); + GList *link = g_hash_table_lookup (flist->file_to_link, file); g_return_val_if_fail (link != NULL, NULL); *index_ = g_list_position (flist->list, link); g_return_val_if_fail (*index_ >= 0, NULL); @@ -418,7 +418,7 @@ static void _find_insert_position (GList *list, pos = 0; } - cmp = cmp_func (file, (MooFile*) left->data); + cmp = cmp_func (file, left->data); g_assert (cmp != 0); if (cmp < 0) @@ -438,7 +438,7 @@ static void _find_insert_position (GList *list, else if (list_len == 2) { g_assert (left->next != NULL); - cmp = cmp_func (file, (MooFile*) left->next->data); + cmp = cmp_func (file, left->next->data); g_assert (cmp != 0); if (cmp < 0) @@ -459,7 +459,7 @@ static void _find_insert_position (GList *list, right = g_list_nth (left, list_len / 2); g_assert (right != NULL); - cmp = cmp_func (file, (MooFile*) right->data); + cmp = cmp_func (file, right->data); g_assert (cmp != 0); if (cmp > 0) @@ -475,7 +475,7 @@ static void _find_insert_position (GList *list, right = g_list_nth (left, list_len / 2); g_assert (right != NULL); - cmp = cmp_func (file, (MooFile*) right->data); + cmp = cmp_func (file, right->data); g_assert (cmp != 0); if (cmp < 0) @@ -537,12 +537,12 @@ static int _compare_links (int *a, int *b, gpointer user_data) { - struct Data { + struct { MooFileCmp cmp_func; GList **links; - } *data = (Data*) user_data; + } *data = user_data; - return data->cmp_func ((MooFile*) data->links[*a]->data, (MooFile*) data->links[*b]->data); + return data->cmp_func (data->links[*a]->data, data->links[*b]->data); } diff --git a/moo/moofileview/moofoldermodel.cpp b/moo/moofileview/moofoldermodel.c similarity index 98% rename from moo/moofileview/moofoldermodel.cpp rename to moo/moofileview/moofoldermodel.c index d260eb30..47e18ddd 100644 --- a/moo/moofileview/moofoldermodel.cpp +++ b/moo/moofileview/moofoldermodel.c @@ -1,7 +1,7 @@ /* - * moofoldermodel.cpp + * moofoldermodel.c * - * Copyright (C) 2004-2016 by Yevgen Muntyan + * Copyright (C) 2004-2010 by Yevgen Muntyan * * This file is part of medit. medit is free software; you can * redistribute it and/or modify it under the terms of the @@ -74,7 +74,7 @@ _moo_folder_model_get_type (void) type = g_type_register_static (G_TYPE_OBJECT, "MooFolderModel", - &info, GTypeFlags(0)); + &info, 0); g_type_add_interface_static (type, GTK_TYPE_TREE_MODEL, &tree_model_info); } @@ -182,7 +182,7 @@ moo_folder_model_set_property (GObject *object, { case PROP_FOLDER: _moo_folder_model_set_folder (model, - (MooFolder*) g_value_get_object (value)); + g_value_get_object (value)); break; default: @@ -227,7 +227,7 @@ _moo_folder_model_set_folder (MooFolderModel *model, if (folder) { - model->priv->folder = (MooFolder*) g_object_ref (folder); + model->priv->folder = g_object_ref (folder); g_signal_connect_swapped (folder, "files_added", G_CALLBACK (moo_folder_model_add_files), @@ -533,7 +533,7 @@ G_STMT_START { \ static GtkTreeModelFlags moo_folder_model_get_flags (G_GNUC_UNUSED GtkTreeModel *tree_model) { - return GtkTreeModelFlags(GTK_TREE_MODEL_ITERS_PERSIST | GTK_TREE_MODEL_LIST_ONLY); + return GTK_TREE_MODEL_ITERS_PERSIST | GTK_TREE_MODEL_LIST_ONLY; } @@ -607,7 +607,7 @@ moo_folder_model_get_path (GtkTreeModel *tree_model, g_return_val_if_fail (ITER_MODEL (iter) == model, NULL); g_return_val_if_fail (ITER_FILE (iter) != NULL, NULL); - index = file_list_position (model->priv->files, (MooFile*) ITER_FILE (iter)); + index = file_list_position (model->priv->files, ITER_FILE (iter)); g_return_val_if_fail (index >= 0, NULL); return gtk_tree_path_new_from_indices (index, -1); @@ -645,7 +645,7 @@ moo_folder_model_iter_next (GtkTreeModel *tree_model, g_return_val_if_fail (ITER_MODEL (iter) == model, FALSE); g_return_val_if_fail (ITER_FILE (iter) != NULL, FALSE); - next = file_list_next (model->priv->files, (MooFile*) ITER_FILE (iter)); + next = file_list_next (model->priv->files, ITER_FILE (iter)); if (next) { diff --git a/moo/moofileview/mooiconview.cpp b/moo/moofileview/mooiconview.c similarity index 96% rename from moo/moofileview/mooiconview.cpp rename to moo/moofileview/mooiconview.c index b3b49bd9..97fd5683 100644 --- a/moo/moofileview/mooiconview.cpp +++ b/moo/moofileview/mooiconview.c @@ -19,7 +19,6 @@ #include "mooutils/mooutils-gobject.h" #include "mooutils/mooutils-misc.h" #include "mooutils/moocompat.h" -#include "moocpp/moocpp.h" #include #include #include @@ -410,9 +409,9 @@ _moo_icon_view_class_init (MooIconViewClass *klass) binding_set = gtk_binding_set_by_class (klass); - gtk_binding_entry_add_signal (binding_set, GDK_Return, GdkModifierType (0), "activate-item-at-cursor", 0); - gtk_binding_entry_add_signal (binding_set, GDK_ISO_Enter, GdkModifierType (0), "activate-item-at-cursor", 0); - gtk_binding_entry_add_signal (binding_set, GDK_KP_Enter, GdkModifierType (0), "activate-item-at-cursor", 0); + gtk_binding_entry_add_signal (binding_set, GDK_Return, 0, "activate-item-at-cursor", 0); + gtk_binding_entry_add_signal (binding_set, GDK_ISO_Enter, 0, "activate-item-at-cursor", 0); + gtk_binding_entry_add_signal (binding_set, GDK_KP_Enter, 0, "activate-item-at-cursor", 0); gtk_binding_entry_add_signal (binding_set, GDK_a, MOO_ACCEL_CTRL_MASK, "select-all", 0); add_move_binding (binding_set, GDK_Up, 0, @@ -463,15 +462,13 @@ static void add_move_binding (GtkBindingSet *binding_set, GtkMovementStep step, gint count) { - gtk_binding_entry_add_signal (binding_set, keyval, - GdkModifierType (modmask), + gtk_binding_entry_add_signal (binding_set, keyval, modmask, "move_cursor", 3, G_TYPE_ENUM, step, G_TYPE_INT, count, G_TYPE_BOOLEAN, FALSE); - gtk_binding_entry_add_signal (binding_set, keyval, - GdkModifierType(modmask | GDK_SHIFT_MASK), + gtk_binding_entry_add_signal (binding_set, keyval, modmask | GDK_SHIFT_MASK, "move_cursor", 3, G_TYPE_ENUM, step, G_TYPE_INT, count, @@ -480,15 +477,13 @@ static void add_move_binding (GtkBindingSet *binding_set, if (modmask & GDK_CONTROL_MASK) return; - gtk_binding_entry_add_signal (binding_set, keyval, - GDK_CONTROL_MASK, + gtk_binding_entry_add_signal (binding_set, keyval, GDK_CONTROL_MASK, "move_cursor", 3, G_TYPE_ENUM, step, G_TYPE_INT, count, G_TYPE_BOOLEAN, FALSE); - gtk_binding_entry_add_signal (binding_set, keyval, - GDK_CONTROL_MASK | GDK_SHIFT_MASK, + gtk_binding_entry_add_signal (binding_set, keyval, GDK_CONTROL_MASK | GDK_SHIFT_MASK, "move_cursor", 3, G_TYPE_ENUM, step, G_TYPE_INT, count, @@ -625,17 +620,17 @@ static void moo_icon_view_set_property (GObject *object, switch (prop_id) { case PROP_MODEL: - _moo_icon_view_set_model (view, reinterpret_cast (g_value_get_object (value))); + _moo_icon_view_set_model (view, g_value_get_object (value)); break; case PROP_PIXBUF_CELL: _moo_icon_view_set_cell (view, MOO_ICON_VIEW_CELL_PIXBUF, - GTK_CELL_RENDERER (g_value_get_object (value))); + g_value_get_object (value)); break; case PROP_TEXT_CELL: _moo_icon_view_set_cell (view, MOO_ICON_VIEW_CELL_TEXT, - GTK_CELL_RENDERER (g_value_get_object (value))); + g_value_get_object (value)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); @@ -1064,9 +1059,9 @@ moo_icon_view_invalidate_layout (MooIconView *view) { if (!view->priv->update_idle) view->priv->update_idle = - g_idle_add_full (G_PRIORITY_HIGH, - (GSourceFunc) moo_icon_view_update_layout, - view, NULL); + gdk_threads_add_idle_full (G_PRIORITY_HIGH, + (GSourceFunc) moo_icon_view_update_layout, + view, NULL); } @@ -1084,7 +1079,7 @@ destroy_layout (MooIconView *view) for (l = view->priv->layout->columns; l != NULL; l = l->next) { - Column *column = reinterpret_cast (l->data); + Column *column = l->data; gtk_tree_path_free (column->first); g_ptr_array_free (column->entries, TRUE); g_free (column); @@ -1157,7 +1152,7 @@ moo_icon_view_expose (GtkWidget *widget, GdkRegion *column_region; Column *column; - column = reinterpret_cast (l->data); + column = l->data; column_rect.x = column->offset; column_rect.y = 0; @@ -1263,7 +1258,7 @@ static void draw_entry (MooIconView *view, { GtkWidget *widget = GTK_WIDGET (view); GdkRectangle cell_area = *entry_rect; - GtkCellRendererState state = GtkCellRendererState (0); + GtkCellRendererState state = 0; GtkTreePath *cursor_path, *drop_path; gboolean selected, cursor, drop; @@ -1357,7 +1352,7 @@ static void cell_data_func (G_GNUC_UNUSED MooIconView *view, gpointer cell_info) { GSList *l; - CellInfo *info = reinterpret_cast (cell_info); + CellInfo *info = cell_info; static GValue value; for (l = info->attributes; l && l->next; l = l->next->next) @@ -1404,7 +1399,7 @@ static gboolean moo_icon_view_update_layout (MooIconView *view) for (l = layout->columns; l != NULL; l = l->next) { - Column *column = reinterpret_cast (l->data); + Column *column = l->data; gtk_tree_path_free (column->first); g_ptr_array_free (column->entries, TRUE); g_free (column); @@ -1521,7 +1516,7 @@ static void calculate_pixbuf_size (MooIconView *view) } if (view->priv->icon_size >= 0 && - gtk_icon_size_lookup (GtkIconSize (view->priv->icon_size), &width, &height)) + gtk_icon_size_lookup (view->priv->icon_size, &width, &height)) { set_pixbuf_size (view, width, height); return; @@ -1662,7 +1657,7 @@ static Column *find_column_by_path (MooIconView *view, for (l = view->priv->layout->columns; l != NULL; l = l->next) { - Column *column = reinterpret_cast (l->data); + Column *column = l->data; int first = path_get_index (column->first); if (first <= path_index && path_index < first + num_entries (column)) @@ -1801,7 +1796,7 @@ static void moo_icon_view_update_adjustment (MooIconView *view) } else { - Column *column = reinterpret_cast (link->data); + Column *column = link->data; view->priv->adjustment->lower = 0; view->priv->adjustment->upper = @@ -1870,7 +1865,7 @@ moo_icon_view_button_press (GtkWidget *widget, { MooIconView *view = MOO_ICON_VIEW (widget); GtkTreePath *path = NULL; - GdkModifierType mods = GdkModifierType (event->state & gtk_accelerator_get_default_mod_mask ()); + GdkModifierType mods = event->state & gtk_accelerator_get_default_mod_mask (); view->priv->button_pressed = 0; @@ -2044,7 +2039,7 @@ path_set_from_list (GList *list) while (list) { - GtkTreePath *path = reinterpret_cast (list->data); + GtkTreePath *path = list->data; g_tree_replace (tree, path, path); list = g_list_delete_link (list, list); } @@ -2314,7 +2309,7 @@ static int get_n_columns (MooIconView *view) static Column *get_nth_column (MooIconView *view, int n) { - return reinterpret_cast (g_slist_nth_data (view->priv->layout->columns, n)); + return g_slist_nth_data (view->priv->layout->columns, n); } static Column *column_next (MooIconView *view, @@ -2554,7 +2549,7 @@ static void move_cursor_home (MooIconView *view, gboolean extend_selection) { Column *column; - column = reinterpret_cast (view->priv->layout->columns->data); + column = view->priv->layout->columns->data; move_cursor_to_entry (view, column, 0, extend_selection); } @@ -2564,7 +2559,7 @@ static void move_cursor_end (MooIconView *view, gboolean extend_selection) { Column *column; - column = reinterpret_cast (g_slist_last (view->priv->layout->columns)->data); + column = g_slist_last (view->priv->layout->columns)->data; move_cursor_to_entry (view, column, num_entries (column) - 1, extend_selection); @@ -2652,7 +2647,7 @@ static Column *get_column_at_x (MooIconView *view, for (link = view->priv->layout->columns; link != NULL; link = link->next) { - Column *column = reinterpret_cast (link->data); + Column *column = link->data; if (column->offset <= x && x < column->offset + column->width) return column; } @@ -2856,7 +2851,7 @@ moo_icon_view_get_paths_in_rect (MooIconView *view, for (l = view->priv->layout->columns; l != NULL; l = l->next) { - Column *column = reinterpret_cast (l->data); + Column *column = l->data; if (column->offset + column->width <= real_rect.x) continue; @@ -2969,9 +2964,9 @@ selection_row_deleted (MooIconView *view) for (link = sel->selected; link != NULL; link = link->next) { - if (!gtk_tree_row_reference_valid (reinterpret_cast (link->data))) + if (!gtk_tree_row_reference_valid (link->data)) { - gtk_tree_row_reference_free (reinterpret_cast (link->data)); + gtk_tree_row_reference_free (link->data); sel->selected = g_slist_delete_link (sel->selected, link); selection_changed (view); return; @@ -3062,8 +3057,7 @@ _moo_icon_view_get_selected_path (MooIconView *view) if (!selection->selected) return NULL; - return gtk_tree_row_reference_get_path ( - reinterpret_cast (view->priv->selection->selected->data)); + return gtk_tree_row_reference_get_path (view->priv->selection->selected->data); } @@ -3109,20 +3103,20 @@ _moo_icon_view_selected_foreach (MooIconView *view, selection = view->priv->selection; for (l = selection->selected, selected = NULL; l != NULL; l = l->next) - selected = g_slist_prepend (selected, gtk_tree_row_reference_copy (reinterpret_cast (l->data))); + selected = g_slist_prepend (selected, gtk_tree_row_reference_copy (l->data)); selected = g_slist_reverse (selected); while (selected) { - if (gtk_tree_row_reference_valid (reinterpret_cast (selected->data))) + if (gtk_tree_row_reference_valid (selected->data)) { - path = gtk_tree_row_reference_get_path (reinterpret_cast (selected->data)); + path = gtk_tree_row_reference_get_path (selected->data); gtk_tree_model_get_iter (view->priv->model, &iter, path); func (view->priv->model, path, &iter, data); gtk_tree_path_free (path); } - gtk_tree_row_reference_free (reinterpret_cast (selected->data)); + gtk_tree_row_reference_free (selected->data); selected = g_slist_delete_link (selected, selected); } @@ -3220,7 +3214,7 @@ moo_icon_view_select_paths (MooIconView *view, /* XXX */ while (list) { - moo_icon_view_select_path (view, reinterpret_cast (list->data)); + moo_icon_view_select_path (view, list->data); list = list->next; } } @@ -3311,12 +3305,12 @@ moo_icon_view_unselect_path (MooIconView *view, for (link = selection->selected; link != NULL; link = link->next) { - g_assert (gtk_tree_row_reference_valid (reinterpret_cast (link->data))); - selected = gtk_tree_row_reference_get_path (reinterpret_cast (link->data)); + g_assert (gtk_tree_row_reference_valid (link->data)); + selected = gtk_tree_row_reference_get_path (link->data); if (!gtk_tree_path_compare (selected, path)) { - gtk_tree_row_reference_free (reinterpret_cast (link->data)); + gtk_tree_row_reference_free (link->data); gtk_tree_path_free (selected); selection->selected = g_slist_delete_link (selection->selected, link); @@ -3348,8 +3342,8 @@ _moo_icon_view_path_is_selected (MooIconView *view, for (link = selection->selected; link != NULL; link = link->next) { - g_assert (gtk_tree_row_reference_valid (reinterpret_cast (link->data))); - selected = gtk_tree_row_reference_get_path (reinterpret_cast (link->data)); + g_assert (gtk_tree_row_reference_valid (link->data)); + selected = gtk_tree_row_reference_get_path (link->data); if (!gtk_tree_path_compare (selected, path)) { @@ -3569,7 +3563,7 @@ _moo_icon_view_enable_drag_source (MooIconView *view, g_return_if_fail (MOO_IS_ICON_VIEW (view)); - gtk_drag_source_set (GTK_WIDGET (view), GdkModifierType (0), targets, n_targets, actions); + gtk_drag_source_set (GTK_WIDGET (view), 0, targets, n_targets, actions); info = view->priv->dnd_info; @@ -3696,7 +3690,7 @@ _moo_icon_view_enable_drag_dest (MooIconView *view, g_return_if_fail (MOO_IS_ICON_VIEW (view)); - gtk_drag_dest_set (GTK_WIDGET (view), GtkDestDefaults (0), targets, n_targets, actions); + gtk_drag_dest_set (GTK_WIDGET (view), 0, targets, n_targets, actions); info = view->priv->dnd_info; @@ -3853,7 +3847,7 @@ drag_scroll_timeout (MooIconView *view) { event = gdk_event_new (GDK_MOTION_NOTIFY); - event->motion.window = GDK_WINDOW (g_object_ref (widget->window)); + event->motion.window = g_object_ref (widget->window); event->motion.axes = NULL; gdk_window_get_pointer (widget->window, &x, &y, &mask); event->motion.x = x; @@ -3870,8 +3864,8 @@ drag_scroll_timeout (MooIconView *view) { event = gdk_event_new (GDK_DRAG_MOTION); - event->dnd.window = GDK_WINDOW(g_object_ref (toplevel->window)); - event->dnd.context = GDK_DRAG_CONTEXT (g_object_ref (info->drag_motion_context)); + event->dnd.window = g_object_ref (toplevel->window); + event->dnd.context = g_object_ref (info->drag_motion_context); gdk_window_get_position (toplevel->window, &x, &y); event->dnd.x_root = x; @@ -3912,9 +3906,9 @@ drag_scroll_check (MooIconView *view, drag_scroll_stop (view); else if (!view->priv->drag_scroll_timeout) view->priv->drag_scroll_timeout = - g_timeout_add (DRAG_SCROLL_TIMEOUT, - (GSourceFunc) drag_scroll_timeout, - view); + gdk_threads_add_timeout (DRAG_SCROLL_TIMEOUT, + (GSourceFunc) drag_scroll_timeout, + view); } @@ -3953,7 +3947,7 @@ moo_icon_view_drag_motion (GtkWidget *widget, g_object_unref (info->drag_motion_context); } - info->drag_motion_context = GDK_DRAG_CONTEXT (g_object_ref (context)); + info->drag_motion_context = g_object_ref (context); } if (!info->drag_dest_inside) diff --git a/moo/moofileview/mootreeview.cpp b/moo/moofileview/mootreeview.c similarity index 95% rename from moo/moofileview/mootreeview.cpp rename to moo/moofileview/mootreeview.c index b2ac2726..0a1d298f 100644 --- a/moo/moofileview/mootreeview.cpp +++ b/moo/moofileview/mootreeview.c @@ -176,7 +176,7 @@ moo_tree_view_set_property (GObject *object, switch (prop_id) { case PROP_MODEL: - _moo_tree_view_set_model (view, reinterpret_cast (g_value_get_object (value))); + _moo_tree_view_set_model (view, g_value_get_object (value)); break; default: @@ -211,9 +211,9 @@ _moo_tree_view_get_model (gpointer view) if (MOO_IS_TREE_VIEW (view)) return MOO_TREE_VIEW(view)->model; else if (GTK_IS_TREE_VIEW (view)) - return gtk_tree_view_get_model (GTK_TREE_VIEW (view)); + return gtk_tree_view_get_model (view); else if (MOO_IS_ICON_VIEW (view)) - return _moo_icon_view_get_model (MOO_ICON_VIEW (view)); + return _moo_icon_view_get_model (view); else g_return_val_if_reached (NULL); } @@ -302,7 +302,7 @@ find_child (MooTreeView *view, for (l = view->children; l != NULL; l = l->next) { - Child *child = reinterpret_cast (l->data); + Child *child = l->data; if (child->widget == real_view) return child; } @@ -348,7 +348,7 @@ child_new (MooTreeView *view, G_CALLBACK (child_button_press), child); child->parent = view; - child->widget = GTK_WIDGET (g_object_ref (widget)); + child->widget = g_object_ref (widget); return child; } @@ -593,12 +593,12 @@ _moo_tree_view_get_path_at_pos (gpointer view, } else if (GTK_IS_TREE_VIEW (view)) { - return gtk_tree_view_get_path_at_pos (GTK_TREE_VIEW (view), x, y, path, + return gtk_tree_view_get_path_at_pos (view, x, y, path, NULL, NULL, NULL); } else if (MOO_IS_ICON_VIEW (view)) { - return _moo_icon_view_get_path_at_pos (MOO_ICON_VIEW (view), x, y, path, + return _moo_icon_view_get_path_at_pos (view, x, y, path, NULL, NULL, NULL); } else @@ -689,10 +689,10 @@ _moo_tree_view_set_drag_dest_row (gpointer view, GtkTreePath *path) { if (GTK_IS_TREE_VIEW (view)) - gtk_tree_view_set_drag_dest_row (GTK_TREE_VIEW (view), path, + gtk_tree_view_set_drag_dest_row (view, path, GTK_TREE_VIEW_DROP_INTO_OR_AFTER); else if (MOO_IS_ICON_VIEW (view)) - _moo_icon_view_set_drag_dest_row (MOO_ICON_VIEW (view), path); + _moo_icon_view_set_drag_dest_row (view, path); else g_return_if_reached (); } @@ -706,9 +706,9 @@ _moo_tree_view_widget_to_abs_coords (gpointer view, int *absy) { if (GTK_IS_TREE_VIEW (view)) - gtk_tree_view_convert_widget_to_bin_window_coords (GTK_TREE_VIEW (view), wx, wy, absx, absy); + gtk_tree_view_convert_widget_to_bin_window_coords (view, wx, wy, absx, absy); else if (MOO_IS_ICON_VIEW (view)) - _moo_icon_view_widget_to_abs_coords (MOO_ICON_VIEW (view), wx, wy, absx, absy); + _moo_icon_view_widget_to_abs_coords (view, wx, wy, absx, absy); else g_return_if_reached (); } @@ -725,7 +725,7 @@ _moo_tree_view_abs_to_widget_coords (gpointer view, if (GTK_IS_TREE_VIEW (view)) gtk_tree_view_tree_to_widget_coords (view, absx, absy, wx, wy); else if (MOO_IS_ICON_VIEW (view)) - _moo_icon_view_abs_to_widget_coords (MOO_ICON_VIEW (view), absx, absy, wx, wy); + _moo_icon_view_abs_to_widget_coords (view, absx, absy, wx, wy); else g_return_if_reached (); } diff --git a/moo/mooglib/moo-glib.c b/moo/mooglib/moo-glib.c index c41d7072..4fe78088 100644 --- a/moo/mooglib/moo-glib.c +++ b/moo/mooglib/moo-glib.c @@ -21,8 +21,7 @@ const mgw_errno_t MGW_E_EXIST = { MGW_EEXIST }; static mgw_time_t convert_time_t (time_t t) { - mgw_time_t result; - result.value = t; + mgw_time_t result = { t }; return result; } @@ -35,13 +34,8 @@ static void convert_g_stat_buf (const GStatBuf* gbuf, MgwStatBuf* mbuf) mbuf->size = gbuf->st_size; -#ifdef _MSC_VER - mbuf->isreg = (gbuf->st_mode & _S_IFREG) != 0; - mbuf->isdir = (gbuf->st_mode & _S_IFDIR) != 0; -#else mbuf->isreg = S_ISREG (gbuf->st_mode); mbuf->isdir = S_ISDIR (gbuf->st_mode); -#endif #ifdef S_ISLNK mbuf->islnk = S_ISLNK (gbuf->st_mode); @@ -75,7 +69,6 @@ static void convert_g_stat_buf (const GStatBuf* gbuf, MgwStatBuf* mbuf) } -#ifndef _MSC_VER #define call_with_errno(err__, func__, rtype__, ...) \ ({ \ rtype__ result__; \ @@ -85,30 +78,6 @@ static void convert_g_stat_buf (const GStatBuf* gbuf, MgwStatBuf* mbuf) (err__)->value = errno; \ result__; \ }) -#else // _MSC_VER - -#define _call_with_errno(what__, result__) \ - errno = 0; \ - result__ = what__; \ - if (err != NULL) \ - err->value = errno; \ - -#define call_with_errno0(func__, result__) \ - _call_with_errno((func__)(), result__) - -#define call_with_errno1(func__, result__, a1__) \ - _call_with_errno((func__)((a1__)), result__) - -#define call_with_errno2(func__, result__, a1__, a2__) \ - _call_with_errno((func__)((a1__), (a2__)), result__) - -#define call_with_errno3(func__, result__, a1__, a2__, a3__) \ - _call_with_errno((func__)((a1__), (a2__), (a3__)), result__) - -#define call_with_errno4(func__, result__, a1__, a2__, a3__, a4__) \ - _call_with_errno((func__)((a1__), (a2__), (a3__), (a4__)), result__) - -#endif // _MSC_VER const char * @@ -128,8 +97,7 @@ int mgw_stat (const gchar *filename, MgwStatBuf *buf, mgw_errno_t *err) { GStatBuf gbuf = { 0 }; - int result; - call_with_errno2 (g_stat, result, filename, &gbuf); + int result = call_with_errno (err, g_stat, int, filename, &gbuf); convert_g_stat_buf (&gbuf, buf); return result; } @@ -138,8 +106,7 @@ int mgw_lstat (const gchar *filename, MgwStatBuf *buf, mgw_errno_t *err) { GStatBuf gbuf = { 0 }; - int result; - call_with_errno2 (g_lstat, result, filename, &gbuf); + int result = call_with_errno (err, g_lstat, int, filename, &gbuf); convert_g_stat_buf (&gbuf, buf); return result; } @@ -169,17 +136,14 @@ const struct tm * mgw_localtime_r (const mgw_time_t *timep, struct tm *result, mgw_errno_t *err) { time_t t = timep->value; - struct tm *ret; - call_with_errno2 (localtime_r, ret, &t, result); - return ret; + return call_with_errno (err, localtime_r, struct tm*, &t, result); } mgw_time_t mgw_time (mgw_time_t *t, mgw_errno_t *err) { time_t t1; - mgw_time_t result; - call_with_errno1 (time, result.value, &t1); + mgw_time_t result = { call_with_errno (err, time, time_t, &t1) }; if (t != NULL) t->value = t1; return result; @@ -189,26 +153,20 @@ mgw_time (mgw_time_t *t, mgw_errno_t *err) guint64 mgw_ascii_strtoull (const gchar *nptr, gchar **endptr, guint base, mgw_errno_t *err) { - guint64 result; - call_with_errno3 (g_ascii_strtoull, result, nptr, endptr, base); - return result; + return call_with_errno (err, g_ascii_strtoull, guint64, nptr, endptr, base); } gdouble mgw_ascii_strtod (const gchar *nptr, gchar **endptr, mgw_errno_t *err) { - double result; - call_with_errno2 (g_ascii_strtod, result, nptr, endptr); - return result; + return call_with_errno (err, g_ascii_strtod, double, nptr, endptr); } MGW_FILE * mgw_fopen (const char *filename, const char *mode, mgw_errno_t *err) { - FILE* result; - call_with_errno2 (g_fopen, result, filename, mode); - return (MGW_FILE*) result; + return (MGW_FILE*) call_with_errno (err, g_fopen, FILE*, filename, mode); } int mgw_fclose (MGW_FILE *file) @@ -219,9 +177,7 @@ int mgw_fclose (MGW_FILE *file) gsize mgw_fread(void *ptr, gsize size, gsize nmemb, MGW_FILE *stream, mgw_errno_t *err) { - gsize result; - call_with_errno4 (fread, result, ptr, size, nmemb, (FILE*) stream); - return result; + return call_with_errno (err, fread, gsize, ptr, size, nmemb, (FILE*) stream); } gsize @@ -246,8 +202,7 @@ mgw_fgets(char *s, int size, MGW_FILE *stream) MgwFd mgw_open (const char *filename, int flags, int mode) { - MgwFd fd; - fd.value = g_open (filename, flags, mode); + MgwFd fd = { g_open (filename, flags, mode) }; return fd; } @@ -289,41 +244,31 @@ mgw_perror (const char *s) int mgw_unlink (const char *path, mgw_errno_t *err) { - int result; - call_with_errno1 (g_unlink, result, path); - return result; + return call_with_errno (err, g_unlink, int, path); } int mgw_remove (const char *path, mgw_errno_t *err) { - int result; - call_with_errno1 (g_remove, result, path); - return result; + return call_with_errno (err, g_remove, int, path); } int mgw_rename (const char *oldpath, const char *newpath, mgw_errno_t *err) { - int result; - call_with_errno2 (g_rename, result, oldpath, newpath); - return result; + return call_with_errno (err, g_rename, int, oldpath, newpath); } int mgw_mkdir (const gchar *filename, int mode, mgw_errno_t *err) { - int result; - call_with_errno2 (g_mkdir, result, filename, mode); - return result; + return call_with_errno (err, g_mkdir, int, filename, mode); } int mgw_mkdir_with_parents (const gchar *pathname, gint mode, mgw_errno_t *err) { - int result; - call_with_errno2 (g_mkdir_with_parents, result, pathname, mode); - return result; + return call_with_errno (err, g_mkdir_with_parents, int, pathname, mode); } int diff --git a/moo/mooglib/moo-glib.h b/moo/mooglib/moo-glib.h index 9e31ef0e..8111d1f9 100644 --- a/moo/mooglib/moo-glib.h +++ b/moo/mooglib/moo-glib.h @@ -2,20 +2,9 @@ #include #include -#include G_BEGIN_DECLS -#undef MOO_BUILTIN_MOO_GLIB -#ifndef MOO_BUILD_FROM_MINGW -#define MOO_BUILTIN_MOO_GLIB 1 -#endif - -typedef struct mgw_errno_t mgw_errno_t; -typedef struct MGW_FILE MGW_FILE; -typedef struct MgwFd MgwFd; -typedef struct mgw_access_mode_t mgw_access_mode_t; - #ifndef __WIN32__ #define MGW_ERROR_IF_NOT_SHARED_LIBC #else @@ -23,6 +12,11 @@ typedef struct mgw_access_mode_t mgw_access_mode_t; #error "C libraries may not be shared between medit and glib" #endif +typedef struct mgw_errno_t mgw_errno_t; +typedef struct MGW_FILE MGW_FILE; +typedef struct MgwFd MgwFd; +typedef struct mgw_access_mode_t mgw_access_mode_t; + enum mgw_errno_value_t { MGW_ENOERROR = 0, @@ -49,7 +43,7 @@ struct MgwFd int value; }; -#if defined(__WIN32__) && !MOO_BUILTIN_MOO_GLIB +#ifdef __WIN32__ # ifdef MOO_GLIB_LIBRARY # define MOO_GLIB_VAR __declspec(dllexport) # else diff --git a/moo/moolua/moo-lua-api-util.cpp b/moo/moolua/moo-lua-api-util.cpp index 9b2f6de7..1e6f7eb2 100644 --- a/moo/moolua/moo-lua-api-util.cpp +++ b/moo/moolua/moo-lua-api-util.cpp @@ -1306,18 +1306,18 @@ moo_lua_get_arg_instance (lua_State *L, return moo_lua_get_arg_instance_opt (L, narg, param_name, type, null_ok); } -static std::vector -moo_lua_get_arg_instance_array(lua_State *L, - int narg, - const char *param_name, - GType type) +MooObjectArray * +moo_lua_get_arg_object_array (lua_State *L, + int narg, + const char *param_name, + GType type) { - CHECK_STACK(L); + CHECK_STACK (L); - if (!lua_istable(L, narg)) - moo_lua_arg_error(L, narg, param_name, - "table expected, got %s", - luaL_typename(L, narg)); + if (!lua_istable (L, narg)) + moo_lua_arg_error (L, narg, param_name, + "table expected, got %s", + luaL_typename (L, narg)); std::vector vec; size_t len = lua_objlen(L, narg); @@ -1325,60 +1325,32 @@ moo_lua_get_arg_instance_array(lua_State *L, lua_pushnil(L); while (lua_next(L, narg) != 0) { - if (!lua_isnumber(L, -2)) - moo_lua_arg_error(L, narg, param_name, - "list expected, got dict"); + if (!lua_isnumber (L, -2)) + moo_lua_arg_error (L, narg, param_name, + "list expected, got dict"); - gpointer instance = moo_lua_get_arg_instance(L, -1, NULL, type, FALSE); + gpointer instance = moo_lua_get_arg_instance (L, -1, NULL, type, FALSE); - int idx = luaL_checkint(L, -2); + int idx = luaL_checkint (L, -2); if (idx <= 0 || idx > (int) len) - moo_lua_arg_error(L, narg, param_name, - "list expected, got dict"); + moo_lua_arg_error (L, narg, param_name, + "list expected, got dict"); - if ((int) vec.size() < idx) - vec.resize(idx); + if ((int) vec.size () < idx) + vec.resize (idx); vec[idx - 1] = instance; - lua_pop(L, 1); + lua_pop (L, 1); } - return vec; -} - -MooObjectArray * -moo_lua_get_arg_object_array (lua_State *L, - int narg, - const char *param_name, - GType type) -{ - static std::vector vec = moo_lua_get_arg_instance_array(L, narg, param_name, type); - MooObjectArray *array = moo_object_array_new (); - moo_object_array_reserve (array, vec.size()); for (int i = 0, c = vec.size(); i < c; ++i) moo_object_array_append (array, G_OBJECT (vec[i])); return array; } -MooPtrArray* -moo_lua_get_arg_boxed_array(lua_State *L, - int narg, - const char *param_name, - GType type) -{ - static std::vector vec = moo_lua_get_arg_instance_array(L, narg, param_name, type); - - MooPtrArray *array = moo_ptr_array_new (); - moo_ptr_array_reserve (array, vec.size()); - for (int i = 0, c = vec.size(); i < c; ++i) - moo_ptr_array_append (array, g_boxed_copy (type, vec[i])); - - return array; -} - char ** moo_lua_get_arg_strv_opt (lua_State *L, int narg, diff --git a/moo/moolua/moo-lua-api-util.h b/moo/moolua/moo-lua-api-util.h index 3661dc90..4edb7f56 100644 --- a/moo/moolua/moo-lua-api-util.h +++ b/moo/moolua/moo-lua-api-util.h @@ -78,10 +78,6 @@ MooObjectArray *moo_lua_get_arg_object_array (lua_State *L, int narg, const char *param_name, GType type); -MooPtrArray *moo_lua_get_arg_boxed_array (lua_State *L, - int narg, - const char *param_name, - GType type); gboolean moo_lua_get_arg_bool_opt (lua_State *L, int narg, const char *param_name, diff --git a/moo/moolua/moo-lua-api.h b/moo/moolua/moo-lua-api.h index 04f75182..b6adeeeb 100644 --- a/moo/moolua/moo-lua-api.h +++ b/moo/moolua/moo-lua-api.h @@ -15,6 +15,7 @@ #include "mooutils/moohelp.h" #include "mooutils/moofileicon.h" #include "mooutils/moodialogs.h" +#include "mooutils/moofilewatch.h" #include "mooutils/moomenuaction.h" #include "mooutils/moomenutoolbutton.h" #include "mooutils/moonotebook.h" diff --git a/moo/moopython/codegen/argtypes.py b/moo/moopython/codegen/argtypes.py index 12b7960b..da77fe4e 100644 --- a/moo/moopython/codegen/argtypes.py +++ b/moo/moopython/codegen/argtypes.py @@ -412,14 +412,14 @@ class FileArg(ArgType): ' return Py_None;') class EnumArg(ArgType): - enum = (' if (pyg_enum_get_value(%(typecode)s, py_%(name)s, (int*)&%(name)s))\n' + enum = (' if (pyg_enum_get_value(%(typecode)s, py_%(name)s, (gpointer)&%(name)s))\n' ' return NULL;\n') def __init__(self, enumname, typecode): self.enumname = enumname self.typecode = typecode def write_param(self, ptype, pname, pdflt, pnull, info): if pdflt: - info.varlist.add(self.enumname, pname + ' = (' + self.enumname + ')' + pdflt) + info.varlist.add(self.enumname, pname + ' = ' + pdflt) else: info.varlist.add(self.enumname, pname) info.varlist.add('PyObject', '*py_' + pname + ' = NULL') @@ -432,14 +432,14 @@ class EnumArg(ArgType): info.codeafter.append(' return pyg_enum_from_gtype(%s, ret);' % self.typecode) class FlagsArg(ArgType): - flag = (' if (%(default)spyg_flags_get_value(%(typecode)s, py_%(name)s, (int*)&%(name)s))\n' + flag = (' if (%(default)spyg_flags_get_value(%(typecode)s, py_%(name)s, (gpointer)&%(name)s))\n' ' return NULL;\n') def __init__(self, flagname, typecode): self.flagname = flagname self.typecode = typecode def write_param(self, ptype, pname, pdflt, pnull, info): if pdflt: - info.varlist.add(self.flagname, pname + ' = (' + self.flagname + ')' + pdflt) + info.varlist.add(self.flagname, pname + ' = ' + pdflt) default = "py_%s && " % (pname,) else: info.varlist.add(self.flagname, pname) @@ -452,7 +452,7 @@ class FlagsArg(ArgType): info.add_parselist('O', ['&py_' + pname], [pname]) def write_return(self, ptype, ownsreturn, info): info.varlist.add('guint', 'ret') - info.codeafter.append(' return pyg_enum_from_gtype(%s, ret);' % self.typecode) + info.codeafter.append(' return pyg_flags_from_gtype(%s, ret);' % self.typecode) class ObjectArg(ArgType): # should change these checks to more typesafe versions that check diff --git a/moo/moopython/codegen/argtypes_m.py b/moo/moopython/codegen/argtypes_m.py index 6fc4c9e1..d960fafd 100644 --- a/moo/moopython/codegen/argtypes_m.py +++ b/moo/moopython/codegen/argtypes_m.py @@ -85,10 +85,11 @@ class ObjectArrayArg(ArgType): info.codeafter.append(' return _moo_object_array_to_pyobject ((MooObjectArray*) ret);') class BoxedArrayArg(ArgType): - def __init__(self, c_type, c_prefix, g_type): - self.c_type = c_type - self.c_prefix = c_prefix - self.g_type = g_type + def __init__(self, elm_c_type, elm_c_prefix, elm_g_type): + self.elm_c_type = elm_c_type + self.elm_c_prefix = elm_c_prefix + self.elm_g_type = elm_g_type + self.c_type = elm_c_type + 'Array' def write_param(self, ptype, pname, pdflt, pnull, info): if pdflt: @@ -98,22 +99,22 @@ class BoxedArrayArg(ArgType): info.varlist.add(self.c_type, '*' + pname) info.arglist.append(pname) if pnull: - info.add_parselist('O&', ['_moo_pyobject_to_boxed_array', '(MooPtrArray**) &' + pname], [pname]) + info.add_parselist('O&', ['_moo_pyobject_to_boxed_array', self.elm_g_type + ', (MooPtrArray**) &' + pname], [pname]) else: - info.add_parselist('O&', ['_moo_pyobject_to_boxed_array_no_null', '(MooPtrArray**) &' + pname], [pname]) - info.codeafter.append(' %s_free (%s);' % (self.c_prefix, pname)) + info.add_parselist('O&', ['_moo_pyobject_to_boxed_array_no_null', self.elm_g_type + ', (MooPtrArray**) &' + pname], [pname]) + info.codeafter.append(' _moo_boxed_array_free (%s, (MooPtrArray*) %s);' % (self.elm_g_type, pname)) def write_return(self, ptype, ownsreturn, info): if ownsreturn: # have to free result ... info.varlist.add(self.c_type, '*ret') info.varlist.add('PyObject', '*py_ret') - info.codeafter.append((' py_ret = _moo_boxed_array_to_pyobject ((MooPtrArray*) ret, %s);\n' + - ' %s_free (ret);\n' + - ' return py_ret;') % (self.g_type, self.c_prefix,)) + info.codeafter.append((' py_ret = _moo_boxed_array_to_pyobject (%s, (MooPtrArray*) ret);\n' + + ' _moo_boxed_array_free (%s, ret);\n' + + ' return py_ret;') % (self.elm_g_type, self.elm_g_type)) else: info.varlist.add(self.c_type, '*ret') - info.codeafter.append(' return _moo_boxed_array_to_pyobject ((MooPtrArray*) ret, %s);' % (self.g_type,)) + info.codeafter.append(' return _moo_boxed_array_to_pyobject (%s, (MooPtrArray*) ret);' % (self.elm_g_type,)) class NoRefObjectSListArg(ArgType): def write_return(self, ptype, ownsreturn, info): @@ -143,11 +144,7 @@ for typ, prefix in (('MooFileArray', 'moo_file_array'), ('MooEditViewArray', 'moo_edit_view_array'), ('MooEditTabArray', 'moo_edit_tab_array'), ('MooEditWindowArray', 'moo_edit_window_array'), + ('MooOpenInfoArray', 'moo_open_info_array'), ): arg = ObjectArrayArg(typ, prefix) matcher.register(typ + '*', arg) - -for typ, prefix, gtyp in (('MooOpenInfoArray', 'moo_open_info_array', 'MOO_TYPE_OPEN_INFO'), - ): - arg = BoxedArrayArg(typ, prefix, gtyp) - matcher.register(typ + '*', arg) diff --git a/moo/moopython/codegen/codegen.py b/moo/moopython/codegen/codegen.py index d0b94db7..8117f2a3 100644 --- a/moo/moopython/codegen/codegen.py +++ b/moo/moopython/codegen/codegen.py @@ -1438,13 +1438,13 @@ typedef intobjargproc ssizeobjargproc; self.fp.write('/* ---------- forward type declarations ---------- */\n') for obj in self.parser.boxes: if not self.overrides.is_type_ignored(obj.c_name): - self.fp.write('extern PyTypeObject G_GNUC_INTERNAL Py' + obj.c_name + '_Type;\n') + self.fp.write('PyTypeObject G_GNUC_INTERNAL Py' + obj.c_name + '_Type;\n') for obj in self.parser.objects: if not self.overrides.is_type_ignored(obj.c_name): - self.fp.write('extern PyTypeObject G_GNUC_INTERNAL Py' + obj.c_name + '_Type;\n') + self.fp.write('PyTypeObject G_GNUC_INTERNAL Py' + obj.c_name + '_Type;\n') for interface in self.parser.interfaces: if not self.overrides.is_type_ignored(interface.c_name): - self.fp.write('extern PyTypeObject G_GNUC_INTERNAL Py' + interface.c_name + '_Type;\n') + self.fp.write('PyTypeObject G_GNUC_INTERNAL Py' + interface.c_name + '_Type;\n') self.fp.write('\n') def write_body(self): diff --git a/moo/moopython/codegen/reversewrapper.py b/moo/moopython/codegen/reversewrapper.py index 9fabe558..55505b70 100644 --- a/moo/moopython/codegen/reversewrapper.py +++ b/moo/moopython/codegen/reversewrapper.py @@ -187,7 +187,7 @@ class ReverseWrapper(object): self.post_return_code.writeln("/* begin post-return code */") self.add_declaration("PyGILState_STATE __py_state;") - self.write_code(code="__py_state = (PyGILState_STATE) pyg_gil_state_ensure();", + self.write_code(code="__py_state = pyg_gil_state_ensure();", cleanup="pyg_gil_state_release(__py_state);") for param in self.parameters: diff --git a/moo/moopython/moopython-api.h b/moo/moopython/moopython-api.h index 7a2f6246..ea85497f 100644 --- a/moo/moopython/moopython-api.h +++ b/moo/moopython/moopython-api.h @@ -507,8 +507,12 @@ moo_python_api_init (void) argv[0] = g_strdup (""); } +#if PY_MINOR_VERSION >= 4 /* do not let python install signal handlers */ Py_InitializeEx (FALSE); +#else + Py_Initialize (); +#endif /* pygtk wants sys.argv */ PySys_SetArgv (argc, argv); diff --git a/moo/moopython/moopython-builtin.c b/moo/moopython/moopython-builtin.c index 0555f04c..2792fde0 100644 --- a/moo/moopython/moopython-builtin.c +++ b/moo/moopython/moopython-builtin.c @@ -20,9 +20,7 @@ #define NO_IMPORT_PYGOBJECT #define NO_IMPORT_PYGTK #include -G_BEGIN_DECLS #include -G_END_DECLS #include "mooedit/mooplugin-loader.h" #include "moopython/moopython-builtin.h" #include "moopython/moopython-api.h" @@ -71,7 +69,7 @@ _moo_python_builtin_init (void) return FALSE; } - pyg_disable_warning_redirections (); + reset_log_func (); if (!create_moo_module ()) { diff --git a/moo/moopython/moopython-pygtkmod.h b/moo/moopython/moopython-pygtkmod.h index a0859e46..5115629f 100644 --- a/moo/moopython/moopython-pygtkmod.h +++ b/moo/moopython/moopython-pygtkmod.h @@ -107,3 +107,17 @@ check_pygtk_version (const char *module, return TRUE; } + + +G_GNUC_UNUSED static void +reset_log_func (void) +{ +#ifdef pyg_disable_warning_redirections + if (check_pygtk_version ("gobject", 2, 12, 0)) + pyg_disable_warning_redirections (); + else + moo_reset_log_func (); +#else + moo_reset_log_func (); +#endif +} diff --git a/moo/moopython/moopython-utils.c b/moo/moopython/moopython-utils.c index 0ad2b728..39b33077 100644 --- a/moo/moopython/moopython-utils.c +++ b/moo/moopython/moopython-utils.c @@ -97,22 +97,6 @@ moo_get_pygobject_type (void) return type; } -static PyTypeObject * -moo_get_pygboxed_type(void) -{ - static PyTypeObject *type; - - if (G_UNLIKELY(!type)) - { - PyObject *module = PyImport_ImportModule("gobject"); - g_return_val_if_fail(module != NULL, NULL); - type = (PyTypeObject*) PyObject_GetAttrString(module, "GBoxed"); - g_return_val_if_fail(type != NULL, NULL); - } - - return type; -} - PyObject * _moo_strv_to_pyobject (char **strv) { @@ -280,7 +264,6 @@ _moo_pyobject_to_object_array (PyObject *obj, g_return_val_if_fail (item != NULL, FALSE); - // TODO: this doesn't check element types if (!pygobject_check (item, type)) { PyErr_SetString (PyExc_TypeError, @@ -309,93 +292,6 @@ _moo_pyobject_to_object_array_no_null (PyObject *obj, } -static MooPtrArray * -_moo_pyobject_to_boxed_array_no_check(PyObject *seq, - int len) -{ - int i; - MooPtrArray *ar; - - ar = moo_ptr_array_new(); - moo_ptr_array_reserve(ar, len); - - for (i = 0; i < len; ++i) - { - PyObject *item = PySequence_ITEM(seq, i); - gpointer elm = g_boxed_copy(((PyGBoxed*)item)->gtype, pyg_boxed_get(item, void)); - moo_ptr_array_append(ar, elm); - } - - return ar; -} - -int -_moo_pyobject_to_boxed_array (PyObject *obj, - MooPtrArray **dest) -{ - int len, i; - PyTypeObject *type; - - type = moo_get_pygboxed_type(); - g_return_val_if_fail(type != NULL, FALSE); - - if (obj == Py_None) - { - *dest = NULL; - return TRUE; - } - - if (!PySequence_Check(obj)) - { - PyErr_SetString(PyExc_TypeError, - "argument must be a sequence"); - return FALSE; - } - - len = PySequence_Size(obj); - - if (len < 0) - { - PyErr_SetString(PyExc_RuntimeError, - "got negative length of a sequence"); - return FALSE; - } - - for (i = 0; i < len; ++i) - { - PyObject *item = PySequence_ITEM(obj, i); - - g_return_val_if_fail(item != NULL, FALSE); - - // TODO: doesn't check types, will crash - if (!PyObject_TypeCheck(item, &PyGBoxed_Type)) - { - PyErr_SetString(PyExc_TypeError, - "argument must be a sequence of boxed objects"); - return FALSE; - } - } - - *dest = _moo_pyobject_to_boxed_array_no_check(obj, len); - - return TRUE; -} - -int -_moo_pyobject_to_boxed_array_no_null(PyObject* obj, - MooPtrArray **dest) -{ - if (obj == Py_None) - { - PyErr_SetString (PyExc_TypeError, - "argument must be a sequence, not None"); - return FALSE; - } - - return _moo_pyobject_to_boxed_array (obj, dest); -} - - PyObject *_moo_gvalue_to_pyobject (const GValue *val) { PyObject *obj; diff --git a/moo/moopython/moopython-utils.h b/moo/moopython/moopython-utils.h index 6810378e..6db66da5 100644 --- a/moo/moopython/moopython-utils.h +++ b/moo/moopython/moopython-utils.h @@ -41,11 +41,6 @@ int _moo_pyobject_to_object_array (PyObject *obj, int _moo_pyobject_to_object_array_no_null (PyObject *obj, MooObjectArray **dest); -int _moo_pyobject_to_boxed_array (PyObject *obj, - MooPtrArray **dest); -int _moo_pyobject_to_boxed_array_no_null (PyObject *obj, - MooPtrArray **dest); - PyObject *_moo_object_slist_to_pyobject (GSList *list); PyObject *_moo_string_slist_to_pyobject (GSList *list); PyObject *_moo_boxed_slist_to_pyobject (GSList *list, @@ -80,6 +75,26 @@ void moo_python_remove_path (const char *dir); #define return_ValueError(msg) return PyErr_SetString (PyExc_ValueError, msg), NULL #define return_ValueErrorInt(msg) return PyErr_SetString (PyExc_ValueError, msg), -1 + +#if PY_MINOR_VERSION < 4 +#define Py_InitializeEx(arg) Py_Initialize() + +#define Py_IncRef _moo_Py_IncRef +#define Py_DecRef _moo_Py_DecRef +inline static void +Py_IncRef (PyObject *obj) +{ + Py_XINCREF (obj); +} + +inline static void +Py_DecRef (PyObject *obj) +{ + Py_XDECREF (obj); +} +#endif + + G_END_DECLS #endif /* MOO_PYTHON_UTILS_H */ diff --git a/moo/moopython/moopython.cmake b/moo/moopython/moopython.cmake index 909ffb36..90a3f094 100644 --- a/moo/moopython/moopython.cmake +++ b/moo/moopython/moopython.cmake @@ -1,182 +1,167 @@ -set(PythonLibs_FIND_VERSION TRUE) -set(PythonLibs_FIND_VERSION_MAJOR 2) -find_package(PythonLibs REQUIRED) - -add_definitions(-DMOO_ENABLE_PYTHON=1) - -include_directories(${PYTHON_INCLUDE_DIR}) - -set(MOO_PYTHON_LIB_DIR ${CMAKE_INSTALL_PREFIX}/bin/Lib) - -set(PYGOBJECT_DEFS_DIR ${MOO_GTK_DIR}/share/pygobject/2.0/defs) -set(PYGTK_DEFS_DIR ${MOO_GTK_DIR}/share/pygtk/2.0/defs) -set(PYGTK_INCLUDE_DIR "${MOO_GTK_DIR}/include/pygtk-2.0") -include_directories(SYSTEM "${PYGTK_INCLUDE_DIR}") - -SET(moopython_sources - moopython/pygtk/moo-pygtk.c - moopython/pygtk/moo-pygtk.h -) - -SET(built_moopython_sources - moopython/pygtk/moo-mod.h -) - -set(gendefs_files - ${CMAKE_SOURCE_DIR}/api/gendefs.py - ${CMAKE_SOURCE_DIR}/api/mpi/__init__.py - ${CMAKE_SOURCE_DIR}/api/mpi/module.py - ${CMAKE_SOURCE_DIR}/api/mpi/defswriter.py -) - -set(moo_override_files - moopython/pygtk/mooutils.override - moopython/pygtk/moo.override -) - -set(moopython_extra_dist - ${moo_override_files} - moopython/pygtk/codebefore.c - moopython/pygtk/codeafter.c - moopython/pygtk/moo.py -) - -list(APPEND moopython_sources ${moo_override_files} moopython/pygtk/moo.py) - -list(APPEND built_moopython_sources - moopython/pygtk/moo-mod.cpp - moopython/pygtk/moo-mod.h -) - -if(WIN32) -set(codegen_platform --platform win32) -endif() - -list(APPEND built_moopython_sources moopython/pygtk/moo.defs) -add_custom_command(OUTPUT moopython/pygtk/moo.defs - COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_SOURCE_DIR}/getoutput.py moopython/pygtk/moo.defs - ${PYTHON_EXECUTABLE} ${CMAKE_SOURCE_DIR}/api/gendefs.py ${CMAKE_SOURCE_DIR}/api/moo.xml - DEPENDS ${gendefs_files} ${CMAKE_SOURCE_DIR}/api/moo.xml) - -set(codegen_files - moopython/codegen/codegen.py - moopython/codegen/argtypes.py - moopython/codegen/argtypes_m.py - moopython/codegen/reversewrapper.py -) - -set(codegen_script ${CMAKE_CURRENT_SOURCE_DIR}/moopython/codegen/codegen.py) -set(codegen ${PYTHON_EXECUTABLE} ${codegen_script} ${codegen_platform} - --codebefore ${CMAKE_CURRENT_SOURCE_DIR}/moopython/pygtk/codebefore.c - --codeafter ${CMAKE_CURRENT_SOURCE_DIR}/moopython/pygtk/codeafter.c -) - -add_custom_command(OUTPUT moopython/pygtk/moo-mod.cpp - COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_SOURCE_DIR}/getoutput.py moopython/pygtk/moo-mod.cpp - ${codegen} --prefix _moo - --load-types ${CMAKE_CURRENT_SOURCE_DIR}/moopython/codegen/argtypes_m.py - --register ${PYGOBJECT_DEFS_DIR}/gio-types.defs - --register ${PYGTK_DEFS_DIR}/gtk-types.defs - --register ${PYGTK_DEFS_DIR}/gdk-types.defs - --override ${CMAKE_CURRENT_SOURCE_DIR}/moopython/pygtk/moo.override - --outfilename moopython/pygtk/moo-mod.cpp - moopython/pygtk/moo.defs - MAIN_DEPENDENCY moopython/pygtk/moo.defs - DEPENDS ${moo_override_files} ${codegen_files} - moopython/pygtk/codebefore.c - moopython/pygtk/codeafter.c -) - -XML2H(moopython/pygtk/moo.py moopython/pygtk/moo-mod.h MOO_PY) -list(APPEND built_moopython_sources moopython/pygtk/moo-mod.h) - -set(moo_python_plugins - terminal - python -) - -list(APPEND moopython_sources ${codegen_files}) -set(moopython_codegen_group ${codegen_files}) -set(moopython_pygtk_group ${moopython_extra_dist} moopython/pygtk/moo-mod.h) -list(APPEND moopython_sources ${gendefs_files}) -set(moopython_api_group ${gendefs_files}) - -# set(moo_python_ini_in_in_files -# moopython/plugins/terminal.ini.in.in -# moopython/plugins/python.ini.in.in -# ) - -# set(moo_python_plugins -# moopython/plugins/terminal.py -# moopython/plugins/python.py -# ) - -set(moo_python_lib_files - moopython/plugins/lib/pyconsole.py - moopython/plugins/lib/insert_date_and_time.py -) - -set(moo_python_lib_medit_files - moopython/plugins/medit/__init__.py - moopython/plugins/medit/runpython.py -) - -list(APPEND moopython_extra_dist - ${moo_python_ini_in_in_files} - ${moo_python_plugins} - ${moo_python_lib_files} - ${moo_python_lib_medit_files} -) - -if(MOO_ENABLE_PYTHON) - foreach(plugin ${moo_python_plugins}) - configure_file(moopython/plugins/${plugin}.ini.in moopython/plugins/${plugin}.ini) -# add_custom_command(OUTPUT moopython/plugins/${plugin}.ini -# COMMAND ${INTLTOOL} ${CMAKE_CURRENT_BINARY_DIR}/moopython/plugins/${plugin}.ini.in -# ${CMAKE_CURRENT_BINARY_DIR}/moopython/plugins/${plugin}.ini -# MAIN_DEPENDENCY ${CMAKE_CURRENT_BINARY_DIR}/moopython/plugins/${plugin}.ini.in) - list(APPEND built_moopython_sources - ${CMAKE_CURRENT_BINARY_DIR}/moopython/plugins/${plugin}.ini - ) - install(FILES ${CMAKE_CURRENT_BINARY_DIR}/moopython/plugins/${plugin}.ini moopython/plugins/${plugin}.py - DESTINATION ${MOO_PYTHON_PLUGIN_DIR}) - endforeach() - - install(FILES ${moo_python_lib_files} DESTINATION ${MOO_PYTHON_LIB_DIR}) - install(FILES ${moo_python_lib_medit_files} DESTINATION ${MOO_PYTHON_LIB_DIR}/medit) -endif() - -list(APPEND moopython_sources - moopython/moopython-pygtkmod.h - moopython/moopython-builtin.h - moopython/moopython-builtin.c - moopython/moopython-api.h - moopython/moopython-loader.h - moopython/moopython-loader.c - moopython/moopython-utils.h - moopython/moopython-utils.c - moopython/moopython-tests.h - moopython/moopython-tests.c -) - -list(APPEND moopython_sources - moopython/medit-python.h - moopython/medit-python.c -) - -XML2H(moopython/medit-python-init.py moopython/medit-python-init.h MEDIT_PYTHON_INIT_PY) - -# EXTRA_DIST += \ -# $(moopython_sources) \ -# moopython/codegen/__init__.py \ -# moopython/codegen/argtypes.py \ -# moopython/codegen/argtypes_m.py \ -# moopython/codegen/codegen.py \ -# moopython/codegen/definitions.py \ -# moopython/codegen/defsparser.py \ -# moopython/codegen/docgen.py \ -# moopython/codegen/mergedefs.py \ -# moopython/codegen/mkskel.py \ -# moopython/codegen/override.py \ -# moopython/codegen/reversewrapper.py \ -# moopython/codegen/scmexpr.py +set(PythonLibs_FIND_VERSION TRUE) +set(PythonLibs_FIND_VERSION_MAJOR 2) +find_package(PythonLibs REQUIRED) + +add_definitions(-DMOO_ENABLE_PYTHON=1) +include_directories(${PYTHON_INCLUDE_DIRS}) + +SET(moopython_sources + moopython/pygtk/moo-pygtk.c + moopython/pygtk/moo-pygtk.h +) + +SET(built_moopython_sources + moopython/pygtk/moo-mod.h +) + +set(gendefs_files + ${CMAKE_SOURCE_DIR}/api/gendefs.py + ${CMAKE_SOURCE_DIR}/api/mpi/__init__.py + ${CMAKE_SOURCE_DIR}/api/mpi/module.py + ${CMAKE_SOURCE_DIR}/api/mpi/defswriter.py +) + +set(moo_override_files + moopython/pygtk/mooutils.override + moopython/pygtk/moopaned.override + moopython/pygtk/mooedit.override + moopython/pygtk/moo.override +) + +set(moopython_extra_dist + ${moo_override_files} + moopython/pygtk/codebefore.c + moopython/pygtk/codeafter.c + moopython/pygtk/moo.py +) + +list(APPEND built_moopython_sources + moopython/pygtk/moo-mod.c + moopython/pygtk/moo-mod.h +) + +if(WIN32) +set(codegen_platform --platform win32) +endif() + +list(APPEND built_moopython_sources moopython/pygtk/moo.defs) +add_custom_command(OUTPUT moopython/pygtk/moo.defs + COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_SOURCE_DIR}/getoutput.py moopython/pygtk/moo.defs + ${PYTHON_EXECUTABLE} ${CMAKE_SOURCE_DIR}/api/gendefs.py ${CMAKE_SOURCE_DIR}/api/moo.xml + DEPENDS ${gendefs_files} ${CMAKE_SOURCE_DIR}/api/moo.xml) + +set(codegen_files + moopython/codegen/codegen.py + moopython/codegen/argtypes.py + moopython/codegen/argtypes_m.py + moopython/codegen/reversewrapper.py +) + +set(codegen_script ${CMAKE_CURRENT_SOURCE_DIR}/moopython/codegen/codegen.py) +set(codegen ${PYTHON_EXECUTABLE} ${codegen_script} ${codegen_platform} + --codebefore ${CMAKE_CURRENT_SOURCE_DIR}/moopython/pygtk/codebefore.c + --codeafter ${CMAKE_CURRENT_SOURCE_DIR}/moopython/pygtk/codeafter.c +) + +add_custom_command(OUTPUT moopython/pygtk/moo-mod.c + COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_SOURCE_DIR}/getoutput.py moopython/pygtk/moo-mod.c + ${codegen} --prefix _moo + --load-types ${CMAKE_CURRENT_SOURCE_DIR}/moopython/codegen/argtypes_m.py + --register ${PYGOBJECT_DEFS_DIR}/gio-types.defs + --register ${PYGTK_DEFS_DIR}/gtk-types.defs + --register ${PYGTK_DEFS_DIR}/gdk-types.defs + --override ${CMAKE_CURRENT_SOURCE_DIR}/moopython/pygtk/moo.override + --outfilename moopython/pygtk/moo-mod.c + moopython/pygtk/moo.defs + MAIN_DEPENDENCY moopython/pygtk/moo.defs + DEPENDS ${moo_override_files} ${codegen_files} + moopython/pygtk/codebefore.c + moopython/pygtk/codeafter.c +) + +XML2H(moopython/pygtk/moo.py moopython/pygtk/moo-mod.h MOO_PY) + +set(moo_python_plugins + terminal + python +) + +# set(moo_python_ini_in_in_files +# moopython/plugins/terminal.ini.in.in +# moopython/plugins/python.ini.in.in +# ) + +# set(moo_python_plugins +# moopython/plugins/terminal.py +# moopython/plugins/python.py +# ) + +set(moo_python_lib_files + moopython/plugins/lib/pyconsole.py + moopython/plugins/lib/insert_date_and_time.py +) + +set(moo_python_lib_medit_files + moopython/plugins/medit/__init__.py + moopython/plugins/medit/runpython.py +) + +list(APPEND moopython_extra_dist + ${moo_python_ini_in_in_files} + ${moo_python_plugins} + ${moo_python_lib_files} + ${moo_python_lib_medit_files} +) + +if(MOO_ENABLE_PYTHON) + foreach(plugin ${moo_python_plugins}) + configure_file(moopython/plugins/${plugin}.ini.in moopython/plugins/${plugin}.ini) +# add_custom_command(OUTPUT moopython/plugins/${plugin}.ini +# COMMAND ${INTLTOOL} ${CMAKE_CURRENT_BINARY_DIR}/moopython/plugins/${plugin}.ini.in +# ${CMAKE_CURRENT_BINARY_DIR}/moopython/plugins/${plugin}.ini +# MAIN_DEPENDENCY ${CMAKE_CURRENT_BINARY_DIR}/moopython/plugins/${plugin}.ini.in) + list(APPEND built_moopython_sources + ${CMAKE_CURRENT_BINARY_DIR}/moopython/plugins/${plugin}.ini + ) + install(FILES ${CMAKE_CURRENT_BINARY_DIR}/moopython/plugins/${plugin}.ini moopython/plugins/${plugin}.py + DESTINATION ${MOO_PYTHON_PLUGIN_DIR}) + endforeach() + + install(FILES ${moo_python_lib_files} DESTINATION ${MOO_PYTHON_LIB_DIR}) + install(FILES ${moo_python_lib_medit_files} DESTINATION ${MOO_PYTHON_LIB_DIR}/medit) +endif() + +list(APPEND moopython_sources + moopython/moopython-pygtkmod.h + moopython/moopython-builtin.h + moopython/moopython-builtin.c + moopython/moopython-api.h + moopython/moopython-loader.h + moopython/moopython-loader.c + moopython/moopython-utils.h + moopython/moopython-utils.c + moopython/moopython-tests.h + moopython/moopython-tests.c +) + +list(APPEND moopython_sources + moopython/medit-python.h + moopython/medit-python.c +) + +XML2H(moopython/medit-python-init.py moopython/medit-python-init.h MEDIT_PYTHON_INIT_PY) + +# EXTRA_DIST += \ +# $(moopython_sources) \ +# moopython/codegen/__init__.py \ +# moopython/codegen/argtypes.py \ +# moopython/codegen/argtypes_m.py \ +# moopython/codegen/codegen.py \ +# moopython/codegen/definitions.py \ +# moopython/codegen/defsparser.py \ +# moopython/codegen/docgen.py \ +# moopython/codegen/mergedefs.py \ +# moopython/codegen/mkskel.py \ +# moopython/codegen/override.py \ +# moopython/codegen/reversewrapper.py \ +# moopython/codegen/scmexpr.py diff --git a/moo/moopython/pygtk/Makefile.incl b/moo/moopython/pygtk/Makefile.incl index 9169a18f..d388611e 100644 --- a/moo/moopython/pygtk/Makefile.incl +++ b/moo/moopython/pygtk/Makefile.incl @@ -13,6 +13,8 @@ gendefs_files = \ moo_override_files = \ moopython/pygtk/mooutils.override \ + moopython/pygtk/moopaned.override \ + moopython/pygtk/mooedit.override \ moopython/pygtk/moo.override EXTRA_DIST += \ diff --git a/moo/moopython/pygtk/moo-pygtk.c b/moo/moopython/pygtk/moo-pygtk.c index 0db1022d..5ce0af13 100644 --- a/moo/moopython/pygtk/moo-pygtk.c +++ b/moo/moopython/pygtk/moo-pygtk.c @@ -22,9 +22,7 @@ #include "moopython/pygtk/moo-pygtk.h" #include "moopython/moopython-utils.h" #include /* _PyGObjectAPI lives here */ -G_BEGIN_DECLS #include -G_END_DECLS #include #include "moopython/moopython-pygtkmod.h" #include diff --git a/moo/moopython/pygtk/moo.override b/moo/moopython/pygtk/moo.override index 2c8b86e8..cd465814 100644 --- a/moo/moopython/pygtk/moo.override +++ b/moo/moopython/pygtk/moo.override @@ -19,9 +19,7 @@ headers #define NO_IMPORT_PYGOBJECT #define NO_IMPORT_PYGTK #include -G_BEGIN_DECLS #include -G_END_DECLS #include "moopython/moopython-utils.h" #include "moopython/pygtk/moo-pygtk.h" @@ -42,6 +40,7 @@ G_END_DECLS #include "mooutils/moohelp.h" #include "mooutils/moofileicon.h" #include "mooutils/moodialogs.h" +#include "mooutils/moofilewatch.h" #include "mooutils/moomenuaction.h" #include "mooutils/moomenutoolbutton.h" #include "mooutils/moonotebook.h" @@ -65,7 +64,6 @@ G_END_DECLS #include "mooedit/mooeditfileinfo.h" #include "mooedit/mooedit-script.h" #include "mooedit/mooedittab.h" -#include "mooedit/mooeditfileinfo.h" #include "plugins/support/moocmdview.h" #include "plugins/support/mooeditwindowoutput.h" @@ -116,9 +114,9 @@ ignore-glob %% include mooutils.override %% -//include moopaned.override -//%% -//include mooedit.override -//%% +include moopaned.override +%% +include mooedit.override +%% // include mooapp.override // %% diff --git a/moo/moopython/pygtk/mooedit.override b/moo/moopython/pygtk/mooedit.override new file mode 100644 index 00000000..3403db5b --- /dev/null +++ b/moo/moopython/pygtk/mooedit.override @@ -0,0 +1,630 @@ +/* -%- lang: C; indent-width: 4; use-tabs: no; strip: yes -%- + * + * mooedit-pygtk.override + * + * Copyright (C) 2004-2010 by Yevgen Muntyan + * Copyright (C) 2008 by Daniel Poelzleithner + * + * This file is part of medit. medit 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. + * + * You should have received a copy of the GNU Lesser General Public + * License along with medit. If not, see . + */ + +%% +override moo_python_plugin_register varargs +static PyObject * +_wrap_moo_python_plugin_register (G_GNUC_UNUSED PyObject *self, PyObject *args) +{ + PyObject *plugin_type, *win_plugin_type = NULL, *doc_plugin_type = NULL; + + if (!PyArg_ParseTuple (args, "O|OO:plugin_register", &plugin_type, + &win_plugin_type, &doc_plugin_type)) + return NULL; + + if (!PyType_Check (plugin_type)) + return_TypeError ("argument must be a type"); + + if (win_plugin_type && win_plugin_type != Py_None && !PyType_Check (win_plugin_type)) + return_TypeError ("argument must be a type"); + + if (doc_plugin_type && doc_plugin_type != Py_None && !PyType_Check (doc_plugin_type)) + return_TypeError ("argument must be a type"); + + if (win_plugin_type == Py_None) + win_plugin_type = NULL; + if (doc_plugin_type == Py_None) + doc_plugin_type = NULL; + + return _moo_python_plugin_register (plugin_type, win_plugin_type, doc_plugin_type); +} +%% +override moo_plugin_list_methods noargs +static PyObject * +_wrap_moo_plugin_list_methods (PyGObject *self) +{ + PyObject *py_list; + GSList *list; + guint i; + + list = moo_plugin_list_methods (self->obj); + + if (!list) + return PyTuple_New (0); + + i = 0; + py_list = PyTuple_New (g_slist_length (list)); + + while (list) + { + PyTuple_SET_ITEM (py_list, i, PyString_FromString (list->data)); + g_free (list->data); + list = g_slist_delete_link (list, list); + i++; + } + + return py_list; +} +%% +override moo_list_plugins noargs +static PyObject * +_wrap_moo_list_plugins (G_GNUC_UNUSED PyGObject *self) +{ + PyObject *py_list; + GSList *list; + guint i; + + list = moo_list_plugins (); + + if (!list) + return PyTuple_New (0); + + i = 0; + py_list = PyTuple_New (g_slist_length (list)); + + while (list) + { + PyTuple_SET_ITEM (py_list, i, pygobject_new (list->data)); + list = g_slist_delete_link (list, list); + i++; + } + + return py_list; +} +%% +override moo_plugin_lookup_method kwargs +static PyObject * +_wrap_moo_plugin_lookup_method (PyGObject *self, PyObject *args, PyObject *kwargs) +{ + static char *kwlist[] = { (char*) "name", NULL }; + char *name; + + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s:MooPlugin.lookup_method", kwlist, &name)) + return NULL; + + return PyBool_FromLong (moo_plugin_lookup_method (MOO_PLUGIN(self->obj), name) != 0); + +} +%% +override moo_edit_window_list_docs noargs +static PyObject * +_wrap_moo_edit_window_list_docs (PyObject *self) +{ + GSList *list; + PyObject *result; + + list = moo_edit_window_list_docs (MOO_EDIT_WINDOW (pygobject_get (self))); + result = _moo_object_slist_to_pyobject (list); + + g_slist_free (list); + return result; +} +%% +override moo_editor_list_windows noargs +static PyObject * +_wrap_moo_editor_list_windows (PyObject *self) +{ + GSList *list; + PyObject *result; + + list = moo_editor_list_windows (MOO_EDITOR (pygobject_get (self))); + result = _moo_object_slist_to_pyobject (list); + + g_slist_free (list); + return result; +} +%% +override moo_editor_list_docs noargs +static PyObject * +_wrap_moo_editor_list_docs (PyObject *self) +{ + GSList *list; + PyObject *result; + + list = moo_editor_list_docs (MOO_EDITOR (pygobject_get (self))); + result = _moo_object_slist_to_pyobject (list); + + g_slist_free (list); + return result; +} +%% +override-attr MooLang.mime_types +static PyObject * +_wrap_moo_lang__get_mime_types (PyObject *self, G_GNUC_UNUSED void *closure) +{ + return moo_string_slist_to_pyobject (pyg_boxed_get (self, MooLang)->mime_types); +} +%% +override-attr MooLang.extensions +static PyObject * +_wrap_moo_lang__get_extensions (PyObject *self, G_GNUC_UNUSED void *closure) +{ + return moo_string_slist_to_pyobject (pyg_boxed_get (self, MooLang)->extensions); +} +%% +override moo_line_view_set_line_data varargs +static PyObject * +_wrap_moo_line_view_set_line_data (PyObject *self, PyObject *args) +{ + int line; + PyObject *py_data; + MooLineView *view; + GValue data; + + if (!PyArg_ParseTuple (args, "iO:LineView.set_line_data", &line, &py_data)) + return NULL; + + view = MOO_LINE_VIEW (pygobject_get (self)); + + data.g_type = 0; + g_value_init (&data, MOO_TYPE_PY_OBJECT); + + if (pyg_value_from_pyobject (&data, py_data)) + { + g_critical ("oops"); + return NULL; + } + + moo_line_view_set_line_data (view, line, &data); + g_value_unset (&data); + + return_None; +} +%% +override moo_line_view_get_line_data varargs +static PyObject * +_wrap_moo_line_view_get_line_data (PyObject *self, PyObject *args) +{ + int line; + MooLineView *view; + GValue data; + PyObject *obj; + + if (!PyArg_ParseTuple (args, "i:LineView.get_line_data", &line)) + return NULL; + + view = MOO_LINE_VIEW (pygobject_get (self)); + data.g_type = 0; + + if (!moo_line_view_get_line_data (view, line, &data)) + return_None; + + obj = pyg_value_as_pyobject (&data, FALSE); + + g_value_unset (&data); + return obj; +} +%% +override moo_text_search_forward varargs +static PyObject * +_wrap_moo_text_search_forward (G_GNUC_UNUSED PyObject *self, PyObject *args) +{ + PyObject *py_start, *py_flags, *py_end = Py_None; + char *str; + int flags; + const GtkTextIter *start, *end = NULL; + GtkTextIter match_start, match_end; + + if (!PyArg_ParseTuple(args, "OsO|O:search_forward", &py_start, &str, &py_flags, &py_end)) + return NULL; + + if (pyg_boxed_check (py_start, GTK_TYPE_TEXT_ITER)) + start = pyg_boxed_get (py_start, GtkTextIter); + else + return_TypeError ("start should be a GtkTextIter"); + + if (pyg_flags_get_value (MOO_TYPE_TEXT_SEARCH_FLAGS, py_flags, &flags)) + return NULL; + + if (pyg_boxed_check(py_end, GTK_TYPE_TEXT_ITER)) + end = pyg_boxed_get(py_end, GtkTextIter); + else if (py_end != Py_None) + return_TypeError ("end should be a GtkTextIter or None"); + + if (moo_text_search_forward (start, str, flags, &match_start, &match_end, end)) + { + PyObject *ret = PyTuple_New (2); + PyTuple_SET_ITEM (ret, 0, pyg_boxed_new (GTK_TYPE_TEXT_ITER, &match_start, TRUE, TRUE)); + PyTuple_SET_ITEM (ret, 1, pyg_boxed_new (GTK_TYPE_TEXT_ITER, &match_end, TRUE, TRUE)); + return ret; + } + else + { + return_None; + } +} +%% +override moo_text_search_backward varargs +static PyObject * +_wrap_moo_text_search_backward (G_GNUC_UNUSED PyObject *self, PyObject *args) +{ + PyObject *py_start, *py_flags, *py_end = Py_None; + char *str; + int flags; + const GtkTextIter *start, *end = NULL; + GtkTextIter match_start, match_end; + + if (!PyArg_ParseTuple (args, "OsO|O:search_backward", &py_start, &str, &py_flags, &py_end)) + return NULL; + + if (pyg_boxed_check (py_start, GTK_TYPE_TEXT_ITER)) + start = pyg_boxed_get (py_start, GtkTextIter); + else + return_TypeError ("start should be a GtkTextIter"); + + if (pyg_flags_get_value (MOO_TYPE_TEXT_SEARCH_FLAGS, py_flags, &flags)) + return NULL; + + if (pyg_boxed_check(py_end, GTK_TYPE_TEXT_ITER)) + end = pyg_boxed_get(py_end, GtkTextIter); + else if (py_end != Py_None) + return_TypeError ("end should be a GtkTextIter or None"); + + if (moo_text_search_backward (start, str, flags, &match_start, &match_end, end)) + { + PyObject *ret = PyTuple_New (2); + PyTuple_SET_ITEM (ret, 0, pyg_boxed_new (GTK_TYPE_TEXT_ITER, &match_start, TRUE, TRUE)); + PyTuple_SET_ITEM (ret, 1, pyg_boxed_new (GTK_TYPE_TEXT_ITER, &match_end, TRUE, TRUE)); + return ret; + } + else + { + return_None; + } +} +%% +override moo_text_buffer_get_line_marks_at_line varargs +static PyObject * +_wrap_moo_text_buffer_get_line_marks_at_line (PyGObject *self, PyObject *args) +{ + GSList *list; + PyObject *result; + int line; + + if (!PyArg_ParseTuple (args, "i", &line)) + return NULL; + + list = moo_text_buffer_get_line_marks_at_line (MOO_TEXT_BUFFER (pygobject_get (self)), line); + result = _moo_object_slist_to_pyobject (list); + + g_slist_free (list); + return result; +} +%% +override moo_text_buffer_get_line_marks_in_range varargs +static PyObject * +_wrap_moo_text_buffer_get_line_marks_in_range (PyGObject *self, PyObject *args) +{ + GSList *list; + PyObject *result; + int start, end; + + + if (!PyArg_ParseTuple (args, "ii", &start, &end)) + return NULL; + + list = moo_text_buffer_get_line_marks_in_range (MOO_TEXT_BUFFER (pygobject_get (self)), start, end); + result = _moo_object_slist_to_pyobject (list); + + g_slist_free (list); + return result; +} +%% +override moo_edit_class_add_action varargs +static PyObject * +_wrap_moo_edit_class_add_action (G_GNUC_UNUSED PyObject *self, PyObject *args) +{ + PyObject *py_type, *py_id, *py_action_type; + GType type, action_type; + MooEditClass *klass; + + if (PyTuple_GET_SIZE (args) < 3) + return_TypeError ("at least three arguments required"); + + py_type = PyTuple_GET_ITEM (args, 0); + py_id = PyTuple_GET_ITEM (args, 1); + py_action_type = PyTuple_GET_ITEM (args, 2); + + if (!(type = pyg_type_from_object (py_type))) + return NULL; + + if (!(action_type = pyg_type_from_object (py_action_type))) + return NULL; + + if (!g_type_is_a (type, MOO_TYPE_EDIT)) + return_TypeError ("type must be derived from MooEdit"); + + if (!g_type_is_a (action_type, MOO_TYPE_EDIT_ACTION)) + return_TypeError ("action_type must be derived from MooEditAction"); + + if (!PyString_Check (py_id)) + return_TypeError ("id must be a string"); + + klass = g_type_class_ref (type); + + moo_edit_class_new_action_type (klass, PyString_AS_STRING (py_id), action_type); + + g_type_class_unref (klass); + return_None; +} +%% +override moo_edit_class_remove_action kwargs +static PyObject * +_wrap_moo_edit_class_remove_action (G_GNUC_UNUSED PyObject *self, PyObject *args, PyObject *kwargs) +{ + static char *kwlist[] = { (char*) "class", (char*) "id", NULL }; + PyObject *py_type; + GType type; + const char *action_id; + MooEditClass *klass; + + if (!PyArg_ParseTupleAndKeywords (args, kwargs, "Os:window_class_remove_action", kwlist, &py_type, &action_id)) + return NULL; + + type = pyg_type_from_object (py_type); + + if (!type) + return NULL; + + if (!g_type_is_a (type, MOO_TYPE_EDIT)) + return_TypeError ("type must be derived from MooEdit"); + + klass = g_type_class_ref (type); + moo_edit_class_remove_action (klass, action_id); + g_type_class_unref (klass); + + return_None; +} +%% +override moo_lang_mgr_get_available_langs noargs +static PyObject * +_wrap_moo_lang_mgr_get_available_langs (PyGObject *self) +{ + GSList *list; + PyObject *result; + + list = moo_lang_mgr_get_available_langs (MOO_LANG_MGR (pygobject_get (self))); + result = _moo_object_slist_to_pyobject (list); + + g_slist_free (list); + return result; +} +%% +override moo_plugin_call_method varargs +static PyObject * +_wrap_moo_plugin_call_method (PyGObject *self, PyObject *args) +{ + const char *name; + MooPluginMeth *meth; + GValue *params = NULL; + GValue retval; + PyObject *ret = NULL; + guint i; + + if (!args || !PyTuple_GET_SIZE (args)) + return_TypeError ("Plugin.call_method takes at least 1 argument"); + + name = PyString_AsString (PyTuple_GET_ITEM (args, 0)); + + if (!name) + return NULL; + + meth = moo_plugin_lookup_method (self->obj, name); + + if (!meth) + { + PyErr_Format (PyExc_TypeError, "in Plugin.call_method: unknown method '%s'", name); + return NULL; + } + + if ((int) meth->n_params + 1 != PyTuple_GET_SIZE (args)) + { + PyErr_Format (PyExc_TypeError, "in Plugin.call_method: method '%s' takes " + "exactly %d arguments (%d given)", name, meth->n_params, + (int) PyTuple_GET_SIZE (args) - 1); + return NULL; + } + + if (meth->return_type != G_TYPE_NONE) + { + retval.g_type = 0; + g_value_init (&retval, meth->return_type); + } + + params = g_new0 (GValue, meth->n_params + 1); + g_value_init (params, G_OBJECT_TYPE (self->obj)); + g_value_set_object (params, self->obj); + + for (i = 0; i < meth->n_params; ++i) + { + g_value_init (¶ms[i+1], meth->param_types[i]); + + if (pyg_value_from_pyobject (¶ms[i+1], PyTuple_GET_ITEM (args, i+1))) + { + PyObject *ps = PyObject_Str (PyTuple_GET_ITEM (args, i+1)); + char *s = PyString_AsString (ps); + PyErr_Format(PyExc_TypeError, "could not convert object '%s' to type '%s'", + s ? s : "(unknown)", g_type_name (meth->param_types[i])); + Py_XDECREF (ps); + goto out; + } + } + + moo_plugin_call_methodv (params, name, &retval); + + if (meth->return_type != G_TYPE_NONE) + { + ret = pyg_value_as_pyobject (&retval, TRUE); + } + else + { + ret = Py_None; + Py_INCREF (ret); + } + +out: + if (meth->return_type != G_TYPE_NONE) + g_value_unset (&retval); + for (i = 0; i < meth->n_params + 1; ++i) + if (G_IS_VALUE (¶ms[i])) + g_value_unset (¶ms[i]); + g_free (params); + + return ret; +} +%% +override moo_command_context_set kwargs +static PyObject * +_wrap_moo_command_context_set (PyGObject *self, PyObject *args, PyObject *kwargs) +{ + static char *kwlist[] = { (char*) "name", (char*) "value", NULL }; + char *name; + PyObject *py_value; + GValue value; + + if (!PyArg_ParseTupleAndKeywords (args, kwargs, "sO:MooCommandContext.set", kwlist, + &name, &py_value)) + return NULL; + + if (py_value == Py_None) + return_TypeError ("MooCommandContext.set: value may not be None"); + + value.g_type = 0; + _moo_pyobject_to_gvalue (py_value, &value); + + moo_command_context_set (MOO_COMMAND_CONTEXT (self->obj), name, &value); + + g_value_unset (&value); + return_None; +} +%% +override moo_command_context_get kwargs +static PyObject * +_wrap_moo_command_context_get (PyGObject *self, PyObject *args, PyObject *kwargs) +{ + static char *kwlist[] = { (char*) "name", NULL }; + char *name; + PyObject *py_value; + GValue value; + + if (!PyArg_ParseTupleAndKeywords (args, kwargs, "s:MooCommandContext.get", + kwlist, &name)) + return NULL; + + value.g_type = 0; + + if (!moo_command_context_get (MOO_COMMAND_CONTEXT (self->obj), name, &value)) + return_None; + + py_value = _moo_gvalue_to_pyobject (&value); + g_assert (py_value || PyErr_Occurred ()); + + g_value_unset (&value); + return py_value; +} +%% +override moo_command_context_foreach varargs +static void +context_foreach_func (const char *name, + const GValue *value, + gpointer user_data) +{ + PyObject *py_value, *ret; + + struct { + PyObject *func; + PyObject *data; + gboolean error; + } *data = user_data; + + if (data->error) + return; + + py_value = pyg_value_as_pyobject (value, TRUE); + + if (!py_value) + { + data->error = TRUE; + return; + } + + PyTuple_SetItem (data->data, 0, PyString_FromString (name)); + PyTuple_SetItem (data->data, 1, py_value); + + ret = PyObject_CallObject (data->func, data->data); + + if (ret != NULL) + Py_DECREF (ret); + else + data->error = TRUE; +} + +static PyObject * +_wrap_moo_command_context_foreach (PyGObject *self, PyObject *args) +{ + int len, i; + PyObject *py_func, *py_data; + struct { + PyObject *func; + PyObject *data; + gboolean error; + } data; + + len = PyTuple_GET_SIZE (args); + + if (len == 0) + return_ValueError ("MooCommandContext.foreach: at least one argument is requred"); + + py_func = PyTuple_GET_ITEM (args, 0); + + if (!PyCallable_Check (py_func)) + return_TypeError ("MooCommandContext.foreach: argument must be callable"); + + py_data = PyTuple_New (len + 1); + + for (i = 1; i < len; ++i) + { + PyObject *item = PyTuple_GET_ITEM (args, i); + Py_INCREF (item); + PyTuple_SetItem (py_data, i + 1, item); + } + + data.func = py_func; + data.data = py_data; + data.error = FALSE; + + moo_command_context_foreach (MOO_COMMAND_CONTEXT (self->obj), + context_foreach_func, + &data); + + Py_DECREF (py_data); + + if (data.error) + return NULL; + + return_None; +} diff --git a/moo/moopython/pygtk/moopaned.override b/moo/moopython/pygtk/moopaned.override new file mode 100644 index 00000000..19c7d8df --- /dev/null +++ b/moo/moopython/pygtk/moopaned.override @@ -0,0 +1,46 @@ +/* -%- lang: C; indent-width: 4; use-tabs: no; strip: yes -%- + * + * moopaned.override + * + * Copyright (C) 2004-2010 by Yevgen Muntyan + * + * This file is part of medit. medit 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. + * + * You should have received a copy of the GNU Lesser General Public + * License along with medit. If not, see . + */ +%% +override moo_big_paned_find_pane kwargs +static PyObject * +_wrap_moo_big_paned_find_pane (PyGObject *self, PyObject *args, PyObject *kwargs) +{ + static char *kwlist[] = { (char*) "pane_widget", NULL }; + PyGObject *widget; + MooPaned *child; + PyObject *ret; + MooPane *pane; + + if (!PyArg_ParseTupleAndKeywords (args, kwargs, + "O!:MooBigPaned.find_pane", kwlist, + &PyGtkWidget_Type, &widget)) + return NULL; + + pane = moo_big_paned_find_pane (MOO_BIG_PANED (self->obj), GTK_WIDGET (widget->obj), &child); + + if (!pane) + { + Py_INCREF (Py_None); + return Py_None; + } + + ret = PyTuple_New (2); + PyTuple_SET_ITEM (ret, 0, pygobject_new (G_OBJECT (pane))); + PyTuple_SET_ITEM (ret, 1, pygobject_new (G_OBJECT (child))); + + return ret; +} +%% diff --git a/moo/moopython/pygtk/mooutils.override b/moo/moopython/pygtk/mooutils.override index 8ac48949..e4bcf64b 100644 --- a/moo/moopython/pygtk/mooutils.override +++ b/moo/moopython/pygtk/mooutils.override @@ -105,7 +105,7 @@ _wrap_moo_window_class_add_action (G_GNUC_UNUSED PyObject *self, PyObject *args) if (!PyCallable_Check (py_factory_func)) return_TypeError ("factory_func must be callable"); - klass = MOO_WINDOW_CLASS (g_type_class_ref (type)); + klass = g_type_class_ref (type); func_n_args = PyTuple_New (2); PyTuple_SET_ITEM (func_n_args, 0, py_factory_func); @@ -151,7 +151,7 @@ _wrap_moo_window_class_find_action (G_GNUC_UNUSED PyObject *self, PyObject *args if (!g_type_is_a (type, MOO_TYPE_WINDOW)) return_TypeError ("type must be derived from MooWindow"); - klass = MOO_WINDOW_CLASS (g_type_class_ref (type)); + klass = g_type_class_ref (type); ret = moo_window_class_find_action (klass, action_id); g_type_class_unref (klass); @@ -179,7 +179,7 @@ _wrap_moo_window_class_remove_action (G_GNUC_UNUSED PyObject *self, PyObject *ar if (!g_type_is_a (type, MOO_TYPE_WINDOW)) return_TypeError ("type must be derived from MooWindow"); - klass = MOO_WINDOW_CLASS (g_type_class_ref (type)); + klass = g_type_class_ref (type); moo_window_class_remove_action (klass, action_id); g_type_class_unref (klass); diff --git a/moo/mooutils/Makefile.incl b/moo/mooutils/Makefile.incl index ccb5f6bf..ceeb371d 100644 --- a/moo/mooutils/Makefile.incl +++ b/moo/mooutils/Makefile.incl @@ -7,128 +7,129 @@ moo_utils_enum_headers = \ moo_sources += \ $(moo_utils_enum_headers) \ mooutils/mooarray.h \ - mooutils/mooutils-thread.cpp \ + mooutils/mooutils-thread.c \ mooutils/mooutils-thread.h \ - mooutils/moohistorymgr.cpp \ + mooutils/moohistorymgr.c \ mooutils/moohistorymgr.h \ mooutils/moo-environ.h \ - mooutils/mooaccel.cpp \ + mooutils/mooaccel.c \ mooutils/mooaccel.h \ - mooutils/mooaccelbutton.cpp \ + mooutils/mooaccelbutton.c \ mooutils/mooaccelbutton.h \ - mooutils/mooaccelprefs.cpp \ + mooutils/mooaccelprefs.c \ mooutils/mooaccelprefs.h \ mooutils/mooaction-private.h \ - mooutils/mooaction.cpp \ + mooutils/mooaction.c \ mooutils/mooaction.h \ mooutils/mooactionbase-private.h\ - mooutils/mooactionbase.cpp \ + mooutils/mooactionbase.c \ mooutils/mooactionbase.h \ - mooutils/mooactioncollection.cpp\ + mooutils/mooactioncollection.c \ mooutils/mooactioncollection.h \ - mooutils/mooactionfactory.cpp \ + mooutils/mooactionfactory.c \ mooutils/mooactionfactory.h \ - mooutils/mooactiongroup.cpp \ + mooutils/mooactiongroup.c \ mooutils/mooactiongroup.h \ - mooutils/mooapp-ipc.cpp \ + mooutils/mooapp-ipc.c \ mooutils/mooapp-ipc.h \ - mooutils/mooappinput-common.cpp \ + mooutils/mooappinput-common.c \ mooutils/mooappinput.h \ mooutils/mooappinput-priv.h \ mooutils/mooatom.h \ - mooutils/moobigpaned.cpp \ + mooutils/moobigpaned.c \ mooutils/moobigpaned.h \ - mooutils/mooclosure.cpp \ + mooutils/mooclosure.c \ mooutils/mooclosure.h \ - mooutils/moocombo.cpp \ + mooutils/moocombo.c \ mooutils/moocombo.h \ mooutils/moocompat.h \ - mooutils/moodialogs.cpp \ - mooutils/mooeditops.cpp \ + mooutils/moodialogs.c \ + mooutils/mooeditops.c \ mooutils/mooeditops.h \ mooutils/mooencodings-data.h \ - mooutils/mooencodings.cpp \ + mooutils/mooencodings.c \ mooutils/mooencodings.h \ - mooutils/mooentry.cpp \ + mooutils/mooentry.c \ mooutils/mooentry.h \ - mooutils/moofiledialog.cpp \ - mooutils/moofileicon.cpp \ + mooutils/moofiledialog.c \ + mooutils/moofileicon.c \ mooutils/moofileicon.h \ - mooutils/moofilewatch.cpp \ + mooutils/moofilewatch.c \ mooutils/moofilewatch.h \ - mooutils/moofilewriter.cpp \ + mooutils/moofilewriter.c \ mooutils/moofilewriter.h \ mooutils/moofilewriter-private.h\ - mooutils/moofiltermgr.cpp \ + mooutils/moofiltermgr.c \ mooutils/moofiltermgr.h \ - mooutils/moofontsel.cpp \ + mooutils/moofontsel.c \ mooutils/moofontsel.h \ - mooutils/mooglade.cpp \ + mooutils/mooglade.c \ mooutils/mooglade.h \ - mooutils/moohelp.cpp \ + mooutils/moohelp.c \ mooutils/moohelp.h \ - mooutils/moohistorycombo.cpp \ + mooutils/moohistorycombo.c \ mooutils/moohistorycombo.h \ - mooutils/moohistorylist.cpp \ + mooutils/moohistorylist.c \ mooutils/moohistorylist.h \ - mooutils/mooi18n.cpp \ + mooutils/mooi18n.c \ mooutils/mooi18n.h \ mooutils/moolist.h \ - mooutils/moomarkup.cpp \ + mooutils/moomarkup.c \ mooutils/moomarkup.h \ - mooutils/moomenu.cpp \ + mooutils/moomenu.c \ mooutils/moomenu.h \ - mooutils/moomenuaction.cpp \ + mooutils/moomenuaction.c \ mooutils/moomenuaction.h \ - mooutils/moomenumgr.cpp \ + mooutils/moomenumgr.c \ mooutils/moomenumgr.h \ - mooutils/moomenutoolbutton.cpp \ + mooutils/moomenutoolbutton.c \ mooutils/moomenutoolbutton.h \ - mooutils/moo-mime.cpp \ + mooutils/moo-mime.c \ mooutils/moo-mime.h \ - mooutils/moonotebook.cpp \ + mooutils/moonotebook.c \ mooutils/moonotebook.h \ mooutils/mooonce.h \ - mooutils/moopane.cpp \ + mooutils/moopane.c \ mooutils/moopane.h \ - mooutils/moopaned.cpp \ + mooutils/moopaned.c \ mooutils/moopaned.h \ - mooutils/mooprefs.cpp \ + mooutils/mooprefs.c \ mooutils/mooprefs.h \ - mooutils/mooprefsdialog.cpp \ + mooutils/mooprefsdialog.c \ mooutils/mooprefsdialog.h \ - mooutils/mooprefspage.cpp \ + mooutils/mooprefspage.c \ mooutils/mooprefspage.h \ - mooutils/moospawn.cpp \ + mooutils/moospawn.c \ mooutils/moospawn.h \ - mooutils/moostock.cpp \ + mooutils/moostock.c \ mooutils/moostock.h \ mooutils/mootype-macros.h \ - mooutils/moouixml.cpp \ - mooutils/mooundo.cpp \ + mooutils/moouixml.c \ + mooutils/mooundo.c \ mooutils/mooundo.h \ mooutils/mooutils.h \ + mooutils/mooutils-cpp.h \ mooutils/mooutils-debug.h \ mooutils/mooutils-enums.c \ mooutils/mooutils-enums.h \ - mooutils/mooutils-file.cpp \ + mooutils/mooutils-file.c \ mooutils/mooutils-file.h \ - mooutils/mooutils-fs.cpp \ + mooutils/mooutils-fs.c \ mooutils/mooutils-fs.h \ mooutils/mooutils-gobject-private.h \ - mooutils/mooutils-gobject.cpp \ + mooutils/mooutils-gobject.c \ mooutils/mooutils-gobject.h \ mooutils/mooutils-macros.h \ mooutils/mooutils-mem.h \ mooutils/mooutils-messages.h \ - mooutils/mooutils-misc.cpp \ + mooutils/mooutils-misc.c \ mooutils/mooutils-misc.h \ - mooutils/mooutils-script.cpp \ + mooutils/mooutils-script.c \ mooutils/mooutils-script.h \ mooutils/mooutils-tests.h \ - mooutils/mooutils-treeview.cpp \ + mooutils/mooutils-treeview.c \ mooutils/mooutils-treeview.h \ - mooutils/moowindow.cpp \ + mooutils/moowindow.c \ mooutils/stock-file-24.h \ mooutils/stock-file-selector-24.h\ mooutils/stock-terminal-24.h @@ -165,10 +166,10 @@ mooutils_win32_sources = \ mooutils/mooappinput-win32.c mooutils_unix_sources = \ - mooutils/mooappinput-unix.cpp + mooutils/mooappinput-unix.c mooutils_unittest_sources = \ - mooutils/moo-test-utils.cpp \ + mooutils/moo-test-utils.c \ mooutils/moo-test-utils.h \ mooutils/moo-test-macros.h diff --git a/moo/mooutils/moo-mime.cpp b/moo/mooutils/moo-mime.c similarity index 100% rename from moo/mooutils/moo-mime.cpp rename to moo/mooutils/moo-mime.c diff --git a/moo/mooutils/moo-test-utils.cpp b/moo/mooutils/moo-test-utils.c similarity index 96% rename from moo/mooutils/moo-test-utils.cpp rename to moo/mooutils/moo-test-utils.c index b67eadc8..a3630a12 100644 --- a/moo/mooutils/moo-test-utils.cpp +++ b/moo/mooutils/moo-test-utils.c @@ -137,7 +137,7 @@ moo_test_suite_free (MooTestSuite *ts) GSList *l; for (l = ts->tests; l != NULL; l = l->next) { - MooTest *test = reinterpret_cast (l->data); + MooTest *test = l->data; g_slist_foreach (test->failed_asserts, (GFunc) test_assert_info_free, NULL); @@ -193,7 +193,7 @@ run_test (MooTest *test, for (l = test->failed_asserts, count = 1; l != NULL; l = l->next, count++) { - TestAssertInfo *ai = reinterpret_cast (l->data); + TestAssertInfo *ai = l->data; fprintf (stdout, " %d. %s", count, ai->file ? ai->file : ""); if (ai->line > -1) fprintf (stdout, ":%d", ai->line); @@ -228,7 +228,7 @@ run_suite (MooTestSuite *ts, passed = run_test (single_test, ts, opts) && passed; else for (l = ts->tests; l != NULL; l = l->next) - passed = run_test (reinterpret_cast (l->data), ts, opts) && passed; + passed = run_test (l->data, ts, opts) && passed; if (run && ts->cleanup_func) ts->cleanup_func (ts->data); @@ -260,7 +260,7 @@ find_test (const char *name, for (l = registry.test_suites; l != NULL; l = l->next) { - MooTestSuite *ts = reinterpret_cast (l->data); + MooTestSuite *ts = l->data; GSList *tl; if (strcmp (ts->name, suite_name) != 0) @@ -276,7 +276,7 @@ find_test (const char *name, for (tl = ts->tests; tl != NULL; tl = tl->next) { - MooTest *test = reinterpret_cast (tl->data); + MooTest *test = tl->data; if (strcmp (test->name, test_name) == 0) { *ts_p = ts; @@ -325,7 +325,7 @@ moo_test_run_tests (char **tests, { GSList *l; for (l = registry.test_suites; l != NULL; l = l->next) - run_suite (reinterpret_cast (l->data), NULL, opts); + run_suite (l->data, NULL, opts); } fprintf (stdout, "\n"); @@ -358,7 +358,7 @@ moo_test_cleanup (void) GError *error = NULL; for (l = registry.test_suites; l != NULL; l = l->next) - moo_test_suite_free (reinterpret_cast (l->data)); + moo_test_suite_free (l->data); g_free (registry.data_dir); registry.data_dir = NULL; @@ -560,7 +560,7 @@ add_func (gpointer key, G_GNUC_UNUSED gpointer value, GString *string) { - g_string_append (string, reinterpret_cast (key)); + g_string_append (string, key); g_string_append (string, "\n"); } diff --git a/moo/mooutils/moo-test-utils.h b/moo/mooutils/moo-test-utils.h index 10b408d9..2dea449c 100644 --- a/moo/mooutils/moo-test-utils.h +++ b/moo/mooutils/moo-test-utils.h @@ -13,7 +13,8 @@ * License along with medit. If not, see . */ -#pragma once +#ifndef MOO_TEST_UTILS_H +#define MOO_TEST_UTILS_H #include #include @@ -30,10 +31,9 @@ typedef struct { } MooTestEnv; typedef enum { - MOO_TEST_OPTIONS_NONE = 0, - MOO_TEST_LIST_ONLY = 1 << 0, - MOO_TEST_FATAL_ERROR = 1 << 1, - MOO_TEST_INSTALLED = 1 << 2 + MOO_TEST_LIST_ONLY = 1 << 0, + MOO_TEST_FATAL_ERROR = 1 << 1, + MOO_TEST_INSTALLED = 1 << 2 } MooTestOptions; typedef struct MooTestSuite MooTestSuite; @@ -90,10 +90,4 @@ gboolean moo_test_set_silent_messages (gboolean silent); G_END_DECLS -#ifdef __cplusplus - -#include - -MOO_DEFINE_FLAGS(MooTestOptions); - -#endif // __cplusplus +#endif /* MOO_TEST_UTILS_H */ diff --git a/moo/mooutils/mooaccel.cpp b/moo/mooutils/mooaccel.c similarity index 99% rename from moo/mooutils/mooaccel.cpp rename to moo/mooutils/mooaccel.c index 083ebbe4..42626476 100644 --- a/moo/mooutils/mooaccel.cpp +++ b/moo/mooutils/mooaccel.c @@ -17,7 +17,6 @@ #include "mooutils/mooprefs.h" #include "mooutils/mooutils-tests.h" #include "mooutils/moocompat.h" -#include "moocpp/moocpp.h" #include #include #include @@ -449,7 +448,7 @@ moo_keymap_translate_keyboard_state (GdkKeymap *keymap, GdkModifierType *consumed_modifiers_p) { guint keyval = 0; - GdkModifierType consumed_modifiers = GdkModifierType (0); + GdkModifierType consumed_modifiers = 0; gboolean retval = gdk_keymap_translate_keyboard_state (keymap, hardware_keycode, state, group, &keyval, effective_group, level, @@ -707,7 +706,7 @@ _moo_accel_parse (const char *accel, guint key = 0; gsize len; GdkModifierType mods = (GdkModifierType) 0; - const char *p; + char *p; g_return_val_if_fail (accel && accel[0], FALSE); @@ -1010,7 +1009,7 @@ delete_prefs_keys (void) GSList *keys = moo_prefs_list_keys (MOO_PREFS_RC); while (keys) { - char *key = reinterpret_cast (keys->data); + char *key = keys->data; if (g_str_has_prefix (key, "Shortcuts/Foobar/")) moo_prefs_delete_key (key); diff --git a/moo/mooutils/mooaccelbutton.cpp b/moo/mooutils/mooaccelbutton.c similarity index 100% rename from moo/mooutils/mooaccelbutton.cpp rename to moo/mooutils/mooaccelbutton.c diff --git a/moo/mooutils/mooaccelprefs.cpp b/moo/mooutils/mooaccelprefs.c similarity index 100% rename from moo/mooutils/mooaccelprefs.cpp rename to moo/mooutils/mooaccelprefs.c diff --git a/moo/mooutils/mooaction.cpp b/moo/mooutils/mooaction.c similarity index 99% rename from moo/mooutils/mooaction.cpp rename to moo/mooutils/mooaction.c index 8dbd15e3..d3823446 100644 --- a/moo/mooutils/mooaction.cpp +++ b/moo/mooutils/mooaction.c @@ -20,7 +20,6 @@ #include "mooutils/mooaction-private.h" #include "mooutils/mooactionbase-private.h" #include "mooutils/mooutils-gobject.h" -#include "mooutils/mooutils-messages.h" #include "mooutils/mooactiongroup.h" #include @@ -732,7 +731,7 @@ static void prop_changed (ToggleWatch *watch) { gboolean value, active, equal; - GObject* action; + gpointer action; g_object_get (MOO_OBJECT_PTR_GET (watch->parent.source), watch->pspec->name, &value, NULL); @@ -755,7 +754,7 @@ static void action_toggled (ToggleWatch *watch) { gboolean value, active, equal; - GObject* action; + gpointer action; g_object_get (MOO_OBJECT_PTR_GET (watch->parent.source), watch->pspec->name, &value, NULL); diff --git a/moo/mooutils/mooactionbase.cpp b/moo/mooutils/mooactionbase.c similarity index 100% rename from moo/mooutils/mooactionbase.cpp rename to moo/mooutils/mooactionbase.c diff --git a/moo/mooutils/mooactioncollection.cpp b/moo/mooutils/mooactioncollection.c similarity index 100% rename from moo/mooutils/mooactioncollection.cpp rename to moo/mooutils/mooactioncollection.c diff --git a/moo/mooutils/mooactionfactory.cpp b/moo/mooutils/mooactionfactory.c similarity index 100% rename from moo/mooutils/mooactionfactory.cpp rename to moo/mooutils/mooactionfactory.c diff --git a/moo/mooutils/mooactiongroup.cpp b/moo/mooutils/mooactiongroup.c similarity index 100% rename from moo/mooutils/mooactiongroup.cpp rename to moo/mooutils/mooactiongroup.c diff --git a/moo/mooutils/mooapp-ipc.cpp b/moo/mooutils/mooapp-ipc.c similarity index 100% rename from moo/mooutils/mooapp-ipc.cpp rename to moo/mooutils/mooapp-ipc.c diff --git a/moo/mooutils/mooappinput-common.cpp b/moo/mooutils/mooappinput-common.c similarity index 100% rename from moo/mooutils/mooappinput-common.cpp rename to moo/mooutils/mooappinput-common.c diff --git a/moo/mooutils/mooappinput-unix.cpp b/moo/mooutils/mooappinput-unix.c similarity index 98% rename from moo/mooutils/mooappinput-unix.cpp rename to moo/mooutils/mooappinput-unix.c index a74bf8ca..8a63a069 100644 --- a/moo/mooutils/mooappinput-unix.cpp +++ b/moo/mooutils/mooappinput-unix.c @@ -67,7 +67,7 @@ get_display_name (void) if (display_name && display_name[0]) { - const char *colon, *dot; + char *colon, *dot; if ((colon = strchr (display_name, ':')) && (dot = strrchr (display_name, '.')) && @@ -155,9 +155,9 @@ input_channel_start_io (int fd, *io_channel = g_io_channel_unix_new (fd); g_io_channel_set_encoding (*io_channel, NULL, NULL); - *io_watch = g_io_add_watch (*io_channel, - GIOCondition (G_IO_IN | G_IO_PRI | G_IO_HUP | G_IO_ERR), - io_func, data); + *io_watch = _moo_io_add_watch (*io_channel, + G_IO_IN | G_IO_PRI | G_IO_HUP | G_IO_ERR, + io_func, data); source = g_main_context_find_source_by_id (NULL, *io_watch); g_source_set_can_recurse (source, TRUE); @@ -283,7 +283,7 @@ _moo_app_input_broadcast (const char *header, for (l = _moo_app_input_instance->pipes; !my_name && l != NULL; l = l->next) { - InputChannel *ch = reinterpret_cast (l->data); + InputChannel *ch = l->data; const char *ch_name = _moo_app_input_channel_get_name (ch); if (ch_name && strcmp (ch_name, name) == 0) my_name = TRUE; diff --git a/moo/mooutils/mooappinput-win32.cpp b/moo/mooutils/mooappinput-win32.c similarity index 93% rename from moo/mooutils/mooappinput-win32.cpp rename to moo/mooutils/mooappinput-win32.c index ba3ce0aa..de2caa1f 100644 --- a/moo/mooutils/mooappinput-win32.cpp +++ b/moo/mooutils/mooappinput-win32.c @@ -86,7 +86,7 @@ listener_main (ListenerInfo *info) { HANDLE input; - _moo_message_async ("%s: started input listener for %s", G_STRLOC, info->pipe_name); + _moo_message_async ("%s: hi there", G_STRLOC); /* XXX unicode */ input = CreateNamedPipeA (info->pipe_name, @@ -110,7 +110,7 @@ listener_main (ListenerInfo *info) char c; DisconnectNamedPipe (input); - _moo_message_async ("%s: opening connection for %s", G_STRLOC, info->pipe_name); + _moo_message_async ("%s: opening connection", G_STRLOC); if (!ConnectNamedPipe (input, NULL)) { @@ -126,7 +126,7 @@ listener_main (ListenerInfo *info) } } - _moo_message_async ("%s: client connected to %s", G_STRLOC, info->pipe_name); + _moo_message_async ("%s: client connected", G_STRLOC); while (ReadFile (input, &c, 1, &bytes_read, NULL)) { @@ -136,13 +136,13 @@ listener_main (ListenerInfo *info) } else { - _moo_message_async ("%s: client disconnected from %s", G_STRLOC, info->pipe_name); + _moo_message_async ("%s: client disconnected", G_STRLOC); break; } } } - _moo_message_async ("%s: shutting down %s", G_STRLOC, info->pipe_name); + _moo_message_async ("%s: goodbye", G_STRLOC); CloseHandle (input); listener_info_free (info); @@ -290,9 +290,10 @@ _moo_app_input_send_msg (const char *name, /* XXX unicode */ pipe_handle = CreateFileA (pipe_name, GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); - if (pipe_handle == INVALID_HANDLE_VALUE) + if (!pipe_handle) { err_msg = g_win32_error_message (GetLastError ()); + g_warning ("could not open pipe '%s': %s", pipe_name, err_msg); goto out; } diff --git a/moo/mooutils/mooarray.h b/moo/mooutils/mooarray.h index 9ef118e4..97cbbe6a 100644 --- a/moo/mooutils/mooarray.h +++ b/moo/mooutils/mooarray.h @@ -14,7 +14,6 @@ struct ArrayType { \ \ ArrayType *array_type##_new (void); \ void array_type##_free (ArrayType *ar); \ -void array_type##_reserve (ArrayType *ar, gsize n); \ void array_type##_append (ArrayType *ar, ElmType *elm); \ void array_type##_take (ArrayType *ar, ElmType *elm); \ void array_type##_append_array (ArrayType *ar, ArrayType *ar2); \ @@ -79,13 +78,6 @@ array_type##_free (ArrayType *ar) \ } \ \ void \ -array_type##_reserve (ArrayType *ar, gsize n) \ -{ \ - g_return_if_fail (ar != NULL); \ - MOO_IP_ARRAY_RESERVE_EXACT (ElmType*, ar, elms, n); \ -} \ - \ -void \ array_type##_append (ArrayType *ar, ElmType *elm) \ { \ g_return_if_fail (ar != NULL && elm != NULL); \ @@ -189,7 +181,7 @@ array_type##_sort (ArrayType *ar, GCompareFunc func) \ \ g_qsort_with_data (ar->elms, ar->n_elms, sizeof (*ar->elms), \ array_type##_gcompare_data_func, \ - (gpointer) func); \ + func); \ } \ \ gssize array_type##_find (const ArrayType *ar, ElmType *elm) \ @@ -234,9 +226,7 @@ gssize array_type##_find (const ArrayType *ar, ElmType *elm) \ G_BEGIN_DECLS MOO_DECLARE_OBJECT_ARRAY_FULL (MooObjectArray, moo_object_array, GObject) -MOO_DECLARE_PTR_ARRAY_FULL (MooPtrArray, moo_ptr_array, void) - -void moo_boxed_array_free(MooPtrArray* ar, GType elm_type); +MOO_DECLARE_PTR_ARRAY_FULL (MooPtrArray, moo_ptr_array, gpointer) G_END_DECLS diff --git a/moo/mooutils/moobigpaned.cpp b/moo/mooutils/moobigpaned.c similarity index 99% rename from moo/mooutils/moobigpaned.cpp rename to moo/mooutils/moobigpaned.c index c8c9ed9a..ef686665 100644 --- a/moo/mooutils/moobigpaned.cpp +++ b/moo/mooutils/moobigpaned.c @@ -27,8 +27,10 @@ #include #include +#ifdef MOO_COMPILATION #include "mooutils-misc.h" #include "moocompat.h" +#endif typedef struct { GSList *order; /* ids */ @@ -1619,7 +1621,7 @@ config_free (MooBigPanedConfig *config) for (pos = 0; pos < 4; pos++) { - g_slist_foreach (config->paned[pos].order, (GFunc) extern_g_free, NULL); + g_slist_foreach (config->paned[pos].order, (GFunc) g_free, NULL); g_slist_free (config->paned[pos].order); g_free (config->paned[pos].active); } diff --git a/moo/mooutils/mooclosure.cpp b/moo/mooutils/mooclosure.c similarity index 100% rename from moo/mooutils/mooclosure.cpp rename to moo/mooutils/mooclosure.c diff --git a/moo/mooutils/moocombo.cpp b/moo/mooutils/moocombo.c similarity index 99% rename from moo/mooutils/moocombo.cpp rename to moo/mooutils/moocombo.c index 97899db6..a6d71cc6 100644 --- a/moo/mooutils/moocombo.cpp +++ b/moo/mooutils/moocombo.c @@ -21,7 +21,6 @@ #include "mooutils/moocombo.h" #include "mooutils/mooentry.h" #include "mooutils/moocompat.h" -#include #include #include #include @@ -221,7 +220,7 @@ moo_combo_class_init (MooComboClass *klass) signals[POPUP] = g_signal_new ("popup", G_OBJECT_CLASS_TYPE (klass), - G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, + (GSignalFlags) (G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION), G_STRUCT_OFFSET (MooComboClass, popup), NULL, NULL, _moo_marshal_VOID__VOID, @@ -230,7 +229,7 @@ moo_combo_class_init (MooComboClass *klass) signals[POPDOWN] = g_signal_new ("popdown", G_OBJECT_CLASS_TYPE (klass), - G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, + (GSignalFlags) (G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION), G_STRUCT_OFFSET (MooComboClass, popdown), NULL, NULL, _moo_marshal_VOID__VOID, diff --git a/moo/mooutils/moodialogs.cpp b/moo/mooutils/moodialogs.c similarity index 98% rename from moo/mooutils/moodialogs.cpp rename to moo/mooutils/moodialogs.c index 6be46d2e..e47e8079 100644 --- a/moo/mooutils/moodialogs.cpp +++ b/moo/mooutils/moodialogs.c @@ -39,7 +39,7 @@ create_message_dialog (GtkWindow *parent, type, message_dialog_buttons, "%s", text); - if (secondary_text && *secondary_text) + if (secondary_text) gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog), "%s", secondary_text); @@ -252,7 +252,7 @@ moo_message_dialog (GtkWidget *parent, moo_position_window_real (dialog, parent, FALSE, FALSE, 0, 0); - response = GtkResponseType (gtk_dialog_run (GTK_DIALOG (dialog))); + response = gtk_dialog_run (GTK_DIALOG (dialog)); gtk_widget_destroy (dialog); return response; @@ -526,7 +526,7 @@ configure_event (GtkWindow *window, PositionInfo *pinfo) { if (!pinfo->save_size_idle) - pinfo->save_size_idle = g_idle_add ((GSourceFunc) save_size, window); + pinfo->save_size_idle = gdk_threads_add_idle ((GSourceFunc) save_size, window); return FALSE; } diff --git a/moo/mooutils/mooeditops.cpp b/moo/mooutils/mooeditops.c similarity index 100% rename from moo/mooutils/mooeditops.cpp rename to moo/mooutils/mooeditops.c diff --git a/moo/mooutils/mooencodings-data.h b/moo/mooutils/mooencodings-data.h index bdfa79e9..836380eb 100644 --- a/moo/mooutils/mooencodings-data.h +++ b/moo/mooutils/mooencodings-data.h @@ -89,10 +89,6 @@ static const struct { // Label of an encoding menu item, remove the part before and including | { "UTF-8-BOM", NULL, N_("encoding label|UTF-8-BOM"), ENCODING_GROUP_UNICODE }, // Label of an encoding menu item, remove the part before and including | - { "UTF-32-BOM", NULL, N_("encoding label|UTF-32-BOM"), ENCODING_GROUP_UNICODE }, - // Label of an encoding menu item, remove the part before and including | - { "UTF-16-BOM", NULL, N_("encoding label|UTF-16-BOM"), ENCODING_GROUP_UNICODE }, - // Label of an encoding menu item, remove the part before and including | { "UTF-32", NULL, N_("encoding label|UTF-32"), ENCODING_GROUP_UNICODE }, // Label of an encoding menu item, remove the part before and including | { "UTF-16", NULL, N_("encoding label|UTF-16"), ENCODING_GROUP_UNICODE }, @@ -177,8 +173,6 @@ static const struct { const char *name; } moo_encoding_aliases[] = { {"UTF8", "UTF-8"}, - {"UTF16", "UTF-16"}, - {"UTF32", "UTF-32"}, {"646", "ASCII"}, {"C", "ASCII"}, diff --git a/moo/mooutils/mooencodings.cpp b/moo/mooutils/mooencodings.c similarity index 100% rename from moo/mooutils/mooencodings.cpp rename to moo/mooutils/mooencodings.c diff --git a/moo/mooutils/mooencodings.h b/moo/mooutils/mooencodings.h index 33690e0a..6df9166a 100644 --- a/moo/mooutils/mooencodings.h +++ b/moo/mooutils/mooencodings.h @@ -25,14 +25,12 @@ G_BEGIN_DECLS #define MOO_ENCODING_UTF8 "UTF-8" #define MOO_ENCODING_UTF16 "UTF-16" -#define MOO_ENCODING_UTF16_BOM "UTF-16-BOM" #define MOO_ENCODING_UTF16LE "UTF-16LE" #define MOO_ENCODING_UTF16BE "UTF-16BE" #define MOO_ENCODING_UTF16LE_BOM "UTF-16LE-BOM" #define MOO_ENCODING_UTF16BE_BOM "UTF-16BE-BOM" #define MOO_ENCODING_UTF32 "UTF-32" -#define MOO_ENCODING_UTF32_BOM "UTF-32-BOM" #define MOO_ENCODING_UTF32LE "UTF-32LE" #define MOO_ENCODING_UTF32BE "UTF-32BE" #define MOO_ENCODING_UTF32LE_BOM "UTF-32LE-BOM" @@ -45,7 +43,7 @@ typedef enum { void _moo_encodings_combo_init (GtkComboBox *combo, MooEncodingComboType type, - gboolean use_separators); + gboolean use_separators); void _moo_encodings_combo_set_enc (GtkComboBox *combo, const char *enc, MooEncodingComboType type); diff --git a/moo/mooutils/mooentry.cpp b/moo/mooutils/mooentry.c similarity index 97% rename from moo/mooutils/mooentry.cpp rename to moo/mooutils/mooentry.c index 481b0964..7af9e2a6 100644 --- a/moo/mooutils/mooentry.cpp +++ b/moo/mooutils/mooentry.c @@ -24,7 +24,6 @@ #include "mooutils/mooutils-gobject.h" #include "mooutils/mooeditops.h" #include "mooutils/mooi18n.h" -#include #include #include #include @@ -184,7 +183,7 @@ moo_entry_class_init (MooEntryClass *klass) klass->redo = moo_entry_redo; moo_entry_parent_class = g_type_class_peek_parent (klass); - parent_editable_iface = reinterpret_cast (g_type_interface_peek (moo_entry_parent_class, GTK_TYPE_EDITABLE)); + parent_editable_iface = g_type_interface_peek (moo_entry_parent_class, GTK_TYPE_EDITABLE); g_object_class_install_property (gobject_class, PROP_ENABLE_UNDO, @@ -232,7 +231,7 @@ moo_entry_class_init (MooEntryClass *klass) signals[UNDO] = g_signal_new ("undo", G_OBJECT_CLASS_TYPE (klass), - G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, + (GSignalFlags) (G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION), G_STRUCT_OFFSET (MooEntryClass, undo), NULL, NULL, _moo_marshal_VOID__VOID, @@ -244,7 +243,7 @@ moo_entry_class_init (MooEntryClass *klass) signals[REDO] = g_signal_new ("redo", G_OBJECT_CLASS_TYPE (klass), - G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, + (GSignalFlags) (G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION), G_STRUCT_OFFSET (MooEntryClass, redo), NULL, NULL, _moo_marshal_VOID__VOID, @@ -253,7 +252,7 @@ moo_entry_class_init (MooEntryClass *klass) signals[DELETE_TO_START] = _moo_signal_new_cb ("delete-to-start", G_OBJECT_CLASS_TYPE (klass), - G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, + (GSignalFlags) (G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION), G_CALLBACK (moo_entry_delete_to_start), NULL, NULL, _moo_marshal_VOID__VOID, @@ -352,7 +351,7 @@ moo_entry_get_property (GObject *object, break; case PROP_EMPTY: - g_value_set_boolean (value, gtk_entry_get_text_length (GTK_ENTRY (entry)) == 0); + g_value_set_boolean (value, GTK_ENTRY(entry)->text_length == 0); break; case PROP_USE_SPECIAL_CHARS_MENU: @@ -382,7 +381,8 @@ static void moo_entry_changed (GtkEditable *editable) { MooEntry *entry = MOO_ENTRY (editable); - gboolean empty = gtk_entry_get_text_length (GTK_ENTRY (editable)) == 0; + GtkEntry *gtkentry = GTK_ENTRY (editable); + gboolean empty = gtkentry->text_length == 0; if ((empty && !entry->priv->empty) || (!empty && entry->priv->empty)) @@ -632,7 +632,7 @@ moo_entry_do_insert_text (GtkEditable *editable, length = (int) strlen (text); if (*position < 0) - *position = gtk_entry_get_text_length (GTK_ENTRY (editable)); + *position = GTK_ENTRY(editable)->text_length; if (length > 0) { @@ -656,7 +656,7 @@ moo_entry_do_delete_text (GtkEditable *editable, if (end_pos < 0) { - end_pos = gtk_entry_get_text_length (GTK_ENTRY (editable)); + end_pos = GTK_ENTRY(editable)->text_length; } else if (start_pos > end_pos) { diff --git a/moo/mooutils/mooentry.h b/moo/mooutils/mooentry.h index 1c299ab9..20abe999 100644 --- a/moo/mooutils/mooentry.h +++ b/moo/mooutils/mooentry.h @@ -13,12 +13,10 @@ * License along with medit. If not, see . */ -#pragma once +#ifndef MOO_ENTRY_H +#define MOO_ENTRY_H #include -#ifdef __cplusplus -#include -#endif G_BEGIN_DECLS @@ -66,9 +64,4 @@ void moo_entry_set_use_special_chars_menu(MooEntry *entry, G_END_DECLS -#ifdef __cplusplus -namespace moo -{ -MOO_DEFINE_SIMPLE_GOBJ_CLASS(Entry, gtk::Entry, MooEntry, MOO_TYPE_ENTRY); -} -#endif // __cplusplus +#endif /* MOO_ENTRY_H */ diff --git a/moo/mooutils/moofiledialog-win32.cpp b/moo/mooutils/moofiledialog-win32.cpp deleted file mode 100644 index 88f59ce1..00000000 --- a/moo/mooutils/moofiledialog-win32.cpp +++ /dev/null @@ -1,437 +0,0 @@ -/* - * moofiledialog-win32.cpp - * - * Copyright (C) 2004-2016 by Yevgen Muntyan - * - * This file is part of medit. medit 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. - * - * You should have received a copy of the GNU Lesser General Public - * License along with medit. If not, see . - */ - -#include -#include -#include -#include -#include -#include -#include - -#include - -#include -#include -#include - -using namespace moo; - -#undef IGNORE -#define IGNORE(op) MOO_STMT_START { op; } MOO_STMT_END -#define CHECK(op) MOO_STMT_START { if (FAILED(hr = op)) goto err; } MOO_STMT_END - -template -void ReleaseAndNull(T*& p) -{ - if (p) - { - p->Release(); - p = nullptr; - } -} - -namespace ControlId { - -enum -{ - combo = 1, - combo_item1, - combo_item2, - combo_item3, -}; - -} // namespace ControlId - -namespace { - -class FileDialogCallback : public IFileDialogEvents, public IFileDialogControlEvents -{ -public: - FileDialogCallback() - : m_ref_count(1) - { - } - - MOO_DISABLE_COPY_OPS(FileDialogCallback); - -private: - ~FileDialogCallback() - { - } - -public: - IFACEMETHODIMP QueryInterface(REFIID riid, void** ppv) - { - static const QITAB qit[] = { - QITABENT(FileDialogCallback, IFileDialogEvents), - QITABENT(FileDialogCallback, IFileDialogControlEvents), - QITABENTMULTI(FileDialogCallback, IUnknown, IFileDialogEvents), - {nullptr}, - }; - return QISearch(this, qit, riid, ppv); - } - - IFACEMETHODIMP_(ULONG) AddRef() - { - return ++m_ref_count; - } - - IFACEMETHODIMP_(ULONG) Release() - { - int ret = --m_ref_count; - if (ret == 0) - delete this; - return ret; - } - - // IFileDialogEvents - IFACEMETHODIMP OnFileOk(IFileDialog *pfd) - { - return S_OK; // S_FALSE keeps the dialog up, return S_OK to allows it to dismiss - } - - IFACEMETHODIMP OnFolderChanging(IFileDialog *pDlg, IShellItem * /* psi */) - { - HookupHelper(pDlg); - return S_OK; - } - - IFACEMETHODIMP OnFolderChange(IFileDialog * /* pfd */) - { - return S_OK; - } - - IFACEMETHODIMP OnSelectionChange(IFileDialog *pfd) - { - return S_OK; - } - - IFACEMETHODIMP OnShareViolation(IFileDialog * /* pfd */, IShellItem * /* psi */, FDE_SHAREVIOLATION_RESPONSE * /* pResponse */) - { - return E_NOTIMPL; - } - - IFACEMETHODIMP OnTypeChange(IFileDialog * /* pfd */) - { - return E_NOTIMPL; - } - - IFACEMETHODIMP OnOverwrite(IFileDialog * /* pfd */, IShellItem * /* psi */, FDE_OVERWRITE_RESPONSE *pResponse) - { - *pResponse = FDEOR_DEFAULT; - return S_OK; - } - - // IFileDialogControlEvents - IFACEMETHODIMP OnItemSelected(IFileDialogCustomize * /* pfdc */, DWORD /* dwIDCtl */, DWORD /* dwIDItem */) - { - return S_OK; - } - - IFACEMETHODIMP OnButtonClicked(IFileDialogCustomize *pfdc, DWORD dwIDCtl) - { - return S_OK; - } - - IFACEMETHODIMP OnCheckButtonToggled(IFileDialogCustomize * /* pfdc */, DWORD /* dwIDCtl */, BOOL /* bChecked */) - { - return S_OK; - } - - IFACEMETHODIMP OnControlActivating(IFileDialogCustomize * /* pfdc */, DWORD /* dwIDCtl */) - { - return S_OK; - } - -private: - void HookupHelper(IFileDialog* pDlg) - { - HRESULT hr = NOERROR; - IOleWindow *pWindow = nullptr; - - CHECK(pDlg->QueryInterface(IID_PPV_ARGS(&pWindow))); - HWND hwnd_dialog = nullptr; - CHECK(pWindow->GetWindow(&hwnd_dialog)); - - if (hwnd_dialog) - m_helper.hookup(hwnd_dialog); - - err: - ReleaseAndNull(pWindow); - } - -private: - MooWinDialogHelper m_helper; - std::atomic m_ref_count; -}; - -class FileDialog -{ -protected: - FileDialog(HWND hwnd_parent, const gstr& start_folder, const gstr& start_name = gstr()) - : m_hwnd_parent(hwnd_parent) - , m_start_folder(start_folder) - , m_start_name(start_name) - { - } - - ~FileDialog() - { - } - - MOO_DISABLE_COPY_OPS(FileDialog); - - template - HRESULT show_dialog(const CLSID& clsid, IRealDialog** ppDlg) - { - HRESULT hr = NOERROR; - IRealDialog *pDlg = nullptr; - IFileDialogEvents *pfde = nullptr; - DWORD cookie = 0; - - CHECK(CoCreateInstance(clsid, nullptr, CLSCTX_ALL, IID_PPV_ARGS(&pDlg))); - - FILEOPENDIALOGOPTIONS fos = 0; - CHECK(pDlg->GetOptions(&fos)); - fos |= get_additional_dialog_options(); - CHECK(pDlg->SetOptions(fos)); - - IGNORE(set_start_folder(pDlg)); - IGNORE(set_start_basename(pDlg)); - - CHECK(customize_dialog(pDlg)); - - pfde = new FileDialogCallback(); - CHECK(pDlg->Advise(pfde, &cookie)); - - CHECK(pDlg->Show(m_hwnd_parent)); - - goto out; - -err: - ReleaseAndNull(pDlg); - -out: - if (cookie && pDlg) - pDlg->Unadvise(cookie); - - ReleaseAndNull(pfde); - - *ppDlg = pDlg; - return hr; - } - - virtual HRESULT customize_dialog(IFileDialog* pDlg) const { return S_OK; } - virtual FILEOPENDIALOGOPTIONS get_additional_dialog_options() const = 0; - -private: - HRESULT set_start_folder(IFileDialog* pDlg) - { - HRESULT hr = NOERROR; - IShellItem* pItem = nullptr; - WCHAR* pszPath = nullptr; - gerrp err; - - if (m_start_folder.empty()) - goto out; - - pszPath = reinterpret_cast(g_utf8_to_utf16(m_start_folder, -1, nullptr, nullptr, &err)); - - CHECK(SHCreateItemFromParsingName(pszPath, nullptr, IID_PPV_ARGS(&pItem))); - - CHECK(pDlg->SetFolder(pItem)); - -err: -out: - ReleaseAndNull(pItem); - g_free(pszPath); - return hr; - } - - HRESULT set_start_basename(IFileDialog* pDlg) - { - HRESULT hr = NOERROR; - WCHAR* pszPath = nullptr; - gerrp err; - - if (m_start_name.empty()) - goto out; - - pszPath = reinterpret_cast(g_utf8_to_utf16(m_start_name, -1, nullptr, nullptr, &err)); - CHECK(pDlg->SetFileName(pszPath)); - -err: -out: - g_free(pszPath); - return hr; - } - -private: - HWND m_hwnd_parent; - g::gstr m_start_folder; - g::gstr m_start_name; -}; - -class OpenFilesDialog : public FileDialog -{ -public: - OpenFilesDialog(HWND hwnd_parent, const gstr& start_folder) - : FileDialog(hwnd_parent, start_folder) - { - } - - ~OpenFilesDialog() - { - } - - gstrvec run() - { - HRESULT hr = NOERROR; - IFileOpenDialog *pDlg = nullptr; - IShellItemArray *pResults = nullptr; - IShellItem *psi = nullptr; - LPWSTR pszPath = nullptr; - std::vector filenames; - - CHECK(show_dialog(CLSID_FileOpenDialog, &pDlg)); - - CHECK(pDlg->GetResults(&pResults)); - - DWORD itemCount = 0; - CHECK(pResults->GetCount(&itemCount)); - - for (DWORD i = 0; i < itemCount; ++i) - { - CHECK(pResults->GetItemAt(i, &psi)); - CHECK(psi->GetDisplayName(SIGDN_FILESYSPATH, &pszPath)); - - gstr utf8_path = g::utf16_to_utf8(pszPath); - filenames.emplace_back(std::move(utf8_path)); - - CoTaskMemFree(pszPath); - pszPath = nullptr; - - ReleaseAndNull(psi); - } - - goto out; - -err: - filenames.clear(); - -out: - CoTaskMemFree(pszPath); - - ReleaseAndNull(psi); - ReleaseAndNull(pResults); - ReleaseAndNull(pDlg); - - return filenames; - } - -private: - FILEOPENDIALOGOPTIONS get_additional_dialog_options() const override - { - return FOS_NOCHANGEDIR | FOS_FORCEFILESYSTEM | FOS_ALLOWMULTISELECT; - } - - HRESULT customize_dialog(IFileOpenDialog* pDlg) - { - HRESULT hr = NOERROR; - //IFileDialogCustomize* pCustomize = nullptr; - //CHECK(pDlg->QueryInterface(IID_PPV_ARGS(&pCustomize))); - //CHECK(pCustomize->EnableOpenDropDown(ControlId::combo)); - //CHECK(pCustomize->AddControlItem(ControlId::combo, ControlId::combo_item1, L"Open")); - //CHECK(pCustomize->AddControlItem(ControlId::combo, ControlId::combo_item2, L"UTF-8")); - //CHECK(pCustomize->AddControlItem(ControlId::combo, ControlId::combo_item3, L"More...")); - //ReleaseAndNull(pCustomize); - return hr; - } -}; - -class SaveFileDialog : public FileDialog -{ -public: - SaveFileDialog(HWND hwnd_parent, const g::gstr& start_folder, const g::gstr& basename) - : FileDialog(hwnd_parent, start_folder, basename) - { - } - - ~SaveFileDialog() - { - } - - gstr run() - { - HRESULT hr = NOERROR; - IFileSaveDialog* pDlg = nullptr; - LPWSTR pszPath = nullptr; - IShellItem* psi = nullptr; - gstr path; - - CHECK(show_dialog(CLSID_FileSaveDialog, &pDlg)); - - CHECK(pDlg->GetResult(&psi)); - - CHECK(psi->GetDisplayName(SIGDN_FILESYSPATH, &pszPath)); - - path = g::utf16_to_utf8(pszPath); - - goto out; - -err: - path.clear(); - -out: - CoTaskMemFree(pszPath); - ReleaseAndNull(psi); - ReleaseAndNull(pDlg); - return path; - } - -private: - FILEOPENDIALOGOPTIONS get_additional_dialog_options() const override - { - return FOS_NOCHANGEDIR | FOS_FORCEFILESYSTEM; - } - - HRESULT customize_dialog(IFileSaveDialog* pDlg) - { - HRESULT hr = NOERROR; - //IFileDialogCustomize* pCustomize = nullptr; - //CHECK(pDlg->QueryInterface(IID_PPV_ARGS(&pCustomize))); - //CHECK(pCustomize->EnableOpenDropDown(ControlId::combo)); - //CHECK(pCustomize->AddControlItem(ControlId::combo, ControlId::combo_item1, L"Open")); - //CHECK(pCustomize->AddControlItem(ControlId::combo, ControlId::combo_item2, L"UTF-8")); - //CHECK(pCustomize->AddControlItem(ControlId::combo, ControlId::combo_item3, L"More...")); - //ReleaseAndNull(pCustomize); - return hr; - } -}; - -} // anonymous namespace - -std::vector moo_show_win32_file_open_dialog(HWND hwnd_parent, const gstr& start_folder) -{ - OpenFilesDialog dlg(hwnd_parent, start_folder); - return dlg.run(); -} - -g::gstr moo_show_win32_file_save_as_dialog(HWND hwnd_parent, const g::gstr& start_folder, const g::gstr& basename) -{ - SaveFileDialog dlg(hwnd_parent, start_folder, basename); - return dlg.run(); -} diff --git a/moo/mooutils/moofiledialog-win32.h b/moo/mooutils/moofiledialog-win32.h deleted file mode 100644 index 2fa8b8ea..00000000 --- a/moo/mooutils/moofiledialog-win32.h +++ /dev/null @@ -1,22 +0,0 @@ -/* - * moofiledialog-win32.h - * - * Copyright (C) 2004-2016 by Yevgen Muntyan - * - * This file is part of medit. medit 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. - * - * You should have received a copy of the GNU Lesser General Public - * License along with medit. If not, see . - */ - -#pragma once - -#include -#include - -g::gstrvec moo_show_win32_file_open_dialog(HWND hwnd_parent, const g::gstr& start_folder); -g::gstr moo_show_win32_file_save_as_dialog(HWND hwnd_parent, const g::gstr& start_folder, const g::gstr& basename); diff --git a/moo/mooutils/moofiledialog.cpp b/moo/mooutils/moofiledialog.c similarity index 92% rename from moo/mooutils/moofiledialog.cpp rename to moo/mooutils/moofiledialog.c index 5300dd79..1954c27d 100644 --- a/moo/mooutils/moofiledialog.cpp +++ b/moo/mooutils/moofiledialog.c @@ -30,7 +30,6 @@ #include #include -using namespace moo; struct _MooFileDialogPrivate { gboolean multiple; @@ -205,7 +204,7 @@ moo_file_dialog_get_property (GObject *object, static void string_slist_free (GSList *list) { - g_slist_foreach (list, (GFunc) extern_g_free, nullptr); + g_slist_foreach (list, (GFunc) g_free, NULL); g_slist_free (list); } @@ -264,15 +263,15 @@ moo_file_dialog_class_init (MooFileDialogClass *klass) g_object_class_install_property (gobject_class, PROP_TITLE, g_param_spec_string ("title", "title", "title", - nullptr, (GParamFlags) G_PARAM_READWRITE)); + NULL, (GParamFlags) G_PARAM_READWRITE)); g_object_class_install_property (gobject_class, PROP_CURRENT_FOLDER_URI, g_param_spec_string ("current-folder-uri", "current-folder-uri", - "current-folder-uri", nullptr, + "current-folder-uri", NULL, (GParamFlags) G_PARAM_READWRITE)); g_object_class_install_property (gobject_class, PROP_NAME, - g_param_spec_string ("name", "name", "name", nullptr, + g_param_spec_string ("name", "name", "name", NULL, (GParamFlags) G_PARAM_READWRITE)); g_object_class_install_property (gobject_class, PROP_PARENT, @@ -287,7 +286,7 @@ moo_file_dialog_class_init (MooFileDialogClass *klass) g_object_class_install_property (gobject_class, PROP_FILTER_MGR_ID, g_param_spec_string ("filter-mgr-id", "filter-mgr-id", "filter-mgr-id", - nullptr, (GParamFlags) G_PARAM_READWRITE)); + NULL, (GParamFlags) G_PARAM_READWRITE)); } @@ -299,10 +298,10 @@ GtkWidget *file_chooser_dialog_new (const char *title, const char *help_id) { GtkWidget *dialog = - gtk_file_chooser_dialog_new (title, nullptr, action, + gtk_file_chooser_dialog_new (title, NULL, action, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, okbtn, GTK_RESPONSE_OK, - nullptr); + NULL); gtk_dialog_set_alternative_button_order (GTK_DIALOG (dialog), GTK_RESPONSE_OK, @@ -336,22 +335,25 @@ moo_file_dialog (GtkWidget *parent, const char *title, const char *start_dir) { - static gstr filename; + static char *filename; MooFileDialog *dialog; - g::FilePtr start; - g::FilePtr file; + GFile *start; + GFile *file; - start = start_dir ? g::File::new_for_path (start_dir) : nullptr; + start = start_dir ? g_file_new_for_path (start_dir) : NULL; - dialog = moo_file_dialog_new (type, parent, FALSE, title, start->gobj(), start_name); - g_return_val_if_fail (dialog != nullptr, nullptr); + dialog = moo_file_dialog_new (type, parent, FALSE, title, start, start_name); + g_return_val_if_fail (dialog != NULL, NULL); moo_file_dialog_run (dialog); file = moo_file_dialog_get_file (dialog); - filename = file ? file->get_path() : gstr::null; + g_free (filename); + filename = file ? g_file_get_path (file) : NULL; + g_object_unref (file); + g_object_unref (start); g_object_unref (dialog); return filename; } @@ -361,8 +363,8 @@ static GtkWidget * moo_file_dialog_create_widget (MooFileDialog *dialog) { GtkFileChooserAction chooser_action; - GtkWidget *widget = nullptr; - GtkWidget *extra_box = nullptr; + GtkWidget *widget = NULL; + GtkWidget *extra_box = NULL; switch (dialog->priv->type) { @@ -397,7 +399,7 @@ moo_file_dialog_create_widget (MooFileDialog *dialog) default: g_critical ("incorrect dialog type specified"); - return nullptr; + return NULL; } gtk_dialog_set_default_response (GTK_DIALOG (widget), GTK_RESPONSE_OK); @@ -440,7 +442,7 @@ string_slist_to_strv (GSList *list) char **uris; if (!list) - return nullptr; + return NULL; len = g_slist_length (list); uris = g_new (char*, len + 1); @@ -448,7 +450,7 @@ string_slist_to_strv (GSList *list) for (i = 0; i < len; i++, list = list->next) uris[i] = g_strdup ((const char*) list->data); - uris[i] = nullptr; + uris[i] = NULL; return uris; } @@ -458,13 +460,13 @@ uri_list_to_files (GSList *list) MooFileArray *flocs; if (!list) - return nullptr; + return NULL; flocs = moo_file_array_new (); while (list) { - moo_file_array_take (flocs, g_file_new_for_uri (reinterpret_cast (list->data))); + moo_file_array_take (flocs, g_file_new_for_uri (list->data)); list = list->next; } @@ -512,13 +514,10 @@ uri_is_valid (G_GNUC_UNUSED const char *uri, #ifndef __WIN32__ return TRUE; #else - struct name_and_len - { + struct name { const char *name; guint len; - }; - - name_and_len names[] = { + } names[] = { { "con", 3 }, { "aux", 3 }, { "prn", 3 }, { "nul", 3 }, { "com1", 4 }, { "com2", 4 }, { "com3", 4 }, { "com4", 4 }, { "lpt1", 4 }, { "lpt2", 4 }, { "lpt3", 4 } @@ -528,7 +527,7 @@ uri_is_valid (G_GNUC_UNUSED const char *uri, const char *basename; gboolean invalid = FALSE; - if (!(filename = g_filename_from_uri (uri, nullptr, nullptr))) + if (!(filename = g_filename_from_uri (uri, NULL, NULL))) return TRUE; basename = strrchr (filename, '\\'); @@ -592,8 +591,8 @@ moo_file_dialog_run (MooFileDialog *dialog) g_return_val_if_fail (MOO_IS_FILE_DIALOG (dialog), FALSE); - set_uri (dialog, nullptr); - set_uris (dialog, nullptr); + set_uri (dialog, NULL); + set_uris (dialog, NULL); filechooser = moo_file_dialog_create_widget (dialog); @@ -637,19 +636,19 @@ moo_file_dialog_run (MooFileDialog *dialog) if (!uri_is_valid (uri, &msg)) { - moo_error_dialog (msg, nullptr, filechooser); + moo_error_dialog (msg, NULL, filechooser); g_free (uri); g_free (msg); continue; } - if ((filename = g_filename_from_uri (uri, nullptr, nullptr))) + if ((filename = g_filename_from_uri (uri, NULL, NULL))) { if (g_file_test (filename, G_FILE_TEST_EXISTS) && !g_file_test (filename, G_FILE_TEST_IS_REGULAR)) { moo_error_dialog (_("Selected file is not a regular file"), - nullptr, + NULL, filechooser); g_free (filename); g_free (uri); @@ -739,24 +738,24 @@ moo_file_dialog_set_extra_widget (MooFileDialog *dialog, } -g::FilePtr +GFile * moo_file_dialog_get_file (MooFileDialog *dialog) { - g_return_val_if_fail (MOO_IS_FILE_DIALOG (dialog), nullptr); - return dialog->priv->uri ? g::File::new_for_uri (dialog->priv->uri) : nullptr; + g_return_val_if_fail (MOO_IS_FILE_DIALOG (dialog), NULL); + return dialog->priv->uri ? g_file_new_for_uri (dialog->priv->uri) : NULL; } char * moo_file_dialog_get_uri (MooFileDialog *dialog) { - g_return_val_if_fail (MOO_IS_FILE_DIALOG (dialog), nullptr); + g_return_val_if_fail (MOO_IS_FILE_DIALOG (dialog), NULL); return g_strdup (dialog->priv->uri); } MooFileArray * moo_file_dialog_get_files (MooFileDialog *dialog) { - g_return_val_if_fail (MOO_IS_FILE_DIALOG (dialog), nullptr); + g_return_val_if_fail (MOO_IS_FILE_DIALOG (dialog), NULL); return uri_list_to_files (dialog->priv->uris); } @@ -770,7 +769,7 @@ moo_file_dialog_get_uris (MooFileDialog *dialog) const char * moo_file_dialog_get_encoding (MooFileDialog *dialog) { - g_return_val_if_fail (MOO_IS_FILE_DIALOG (dialog), nullptr); + g_return_val_if_fail (MOO_IS_FILE_DIALOG (dialog), NULL); return dialog->priv->encoding ? dialog->priv->encoding : MOO_ENCODING_UTF8; } @@ -783,21 +782,21 @@ moo_file_dialogp (GtkWidget *parent, const char *prefs_key, const char *alternate_prefs_key) { - const char *start = nullptr; - const char *filename = nullptr; + const char *start = NULL; + const char *filename = NULL; if (!title) title = "Choose File"; if (prefs_key) { - moo_prefs_create_key (prefs_key, MOO_PREFS_STATE, G_TYPE_STRING, nullptr); + moo_prefs_create_key (prefs_key, MOO_PREFS_STATE, G_TYPE_STRING, NULL); start = moo_prefs_get_string (prefs_key); } if (!start && alternate_prefs_key) { - moo_prefs_create_key (alternate_prefs_key, MOO_PREFS_STATE, G_TYPE_STRING, nullptr); + moo_prefs_create_key (alternate_prefs_key, MOO_PREFS_STATE, G_TYPE_STRING, NULL); start = moo_prefs_get_string (alternate_prefs_key); } @@ -806,7 +805,7 @@ moo_file_dialogp (GtkWidget *parent, if (filename && prefs_key) { char *new_start = g_path_get_dirname (filename); - moo_prefs_create_key (prefs_key, MOO_PREFS_STATE, G_TYPE_STRING, nullptr); + moo_prefs_create_key (prefs_key, MOO_PREFS_STATE, G_TYPE_STRING, NULL); moo_prefs_set_filename (prefs_key, new_start); g_free (new_start); } @@ -823,7 +822,7 @@ moo_file_dialog_new (MooFileDialogType type, GFile *start_loc, const char *start_name) { - char *start_dir_uri = nullptr; + char *start_dir_uri = NULL; MooFileDialog *dialog; if (start_loc) @@ -837,7 +836,7 @@ moo_file_dialog_new (MooFileDialogType type, "title", title, "current-folder-uri", start_dir_uri, "name", start_name, - nullptr)); + (const char*) NULL)); g_free (start_dir_uri); return dialog; @@ -849,7 +848,7 @@ moo_file_dialog_set_filter_mgr_id (MooFileDialog *dialog, const char *id) { g_return_if_fail (MOO_IS_FILE_DIALOG (dialog)); - g_object_set (dialog, "filter-mgr-id", id, nullptr); + g_object_set (dialog, "filter-mgr-id", id, NULL); } @@ -867,7 +866,7 @@ moo_file_dialog_set_remember_size (MooFileDialog *dialog, const char *prefs_key) { g_return_if_fail (MOO_IS_FILE_DIALOG (dialog)); - g_return_if_fail (prefs_key != nullptr); + g_return_if_fail (prefs_key != NULL); MOO_ASSIGN_STRING (dialog->priv->size_prefs_key, prefs_key); } @@ -883,6 +882,6 @@ moo_file_dialog_set_current_folder_uri (MooFileDialog *dialog, const char * moo_file_dialog_get_current_folder_uri (MooFileDialog *dialog) { - g_return_val_if_fail (MOO_IS_FILE_DIALOG (dialog), nullptr); + g_return_val_if_fail (MOO_IS_FILE_DIALOG (dialog), NULL); return dialog->priv->current_dir; } diff --git a/moo/mooutils/moofiledialog.h b/moo/mooutils/moofiledialog.h index e2b48ed6..9735d609 100644 --- a/moo/mooutils/moofiledialog.h +++ b/moo/mooutils/moofiledialog.h @@ -1,7 +1,7 @@ /* * moofiledialog.h * - * Copyright (C) 2004-2016 by Yevgen Muntyan + * Copyright (C) 2004-2010 by Yevgen Muntyan * * This file is part of medit. medit is free software; you can * redistribute it and/or modify it under the terms of the @@ -13,13 +13,11 @@ * License along with medit. If not, see . */ -#pragma once +#ifndef MOO_FILE_DIALOG_H +#define MOO_FILE_DIALOG_H #include #include -#ifdef __cplusplus -#include -#endif G_BEGIN_DECLS @@ -71,11 +69,7 @@ void moo_file_dialog_set_filter_mgr_id (MooFileDialog *dialog, const char *id); gboolean moo_file_dialog_run (MooFileDialog *dialog); -#ifdef __cplusplus -G_END_DECLS -g::FilePtr moo_file_dialog_get_file (MooFileDialog *dialog); -G_BEGIN_DECLS -#endif +GFile *moo_file_dialog_get_file (MooFileDialog *dialog); MooFileArray *moo_file_dialog_get_files (MooFileDialog *dialog); char *moo_file_dialog_get_uri (MooFileDialog *dialog); char **moo_file_dialog_get_uris (MooFileDialog *dialog); @@ -115,3 +109,5 @@ const char *moo_file_dialogp (GtkWidget *parent, G_END_DECLS + +#endif /* MOO_FILE_DIALOG_H */ diff --git a/moo/mooutils/moofileicon.cpp b/moo/mooutils/moofileicon.c similarity index 100% rename from moo/mooutils/moofileicon.cpp rename to moo/mooutils/moofileicon.c diff --git a/moo/mooutils/moofileicon.h b/moo/mooutils/moofileicon.h index a0612d4b..9bc0d873 100644 --- a/moo/mooutils/moofileicon.h +++ b/moo/mooutils/moofileicon.h @@ -22,7 +22,6 @@ G_BEGIN_DECLS typedef enum { - MOO_ICON_EMBLEM_NONE = 0, MOO_ICON_EMBLEM_LINK = 1 << 0 } MooIconEmblem; diff --git a/moo/mooutils/moofilewatch.cpp b/moo/mooutils/moofilewatch.c similarity index 72% rename from moo/mooutils/moofilewatch.cpp rename to moo/mooutils/moofilewatch.c index 1cd1d272..2cd2776d 100644 --- a/moo/mooutils/moofilewatch.cpp +++ b/moo/mooutils/moofilewatch.c @@ -40,11 +40,6 @@ #include "mooutils/mooutils-thread.h" #include "mooutils/moolist.h" -#include -#include - -using namespace g; -using namespace moo; #if 1 static void G_GNUC_PRINTF(1,2) DEBUG_PRINT (G_GNUC_UNUSED const char *format, ...) @@ -72,24 +67,22 @@ typedef struct { } Monitor; struct WatchFuncs { - gboolean (*start) (MooFileWatch& watch, + gboolean (*start) (MooFileWatch *watch, GError **error); - gboolean (*shutdown) (MooFileWatch& watch, + gboolean (*shutdown) (MooFileWatch *watch, GError **error); - gboolean (*start_monitor) (MooFileWatch& watch, - Monitor* monitor, - GError** error); - void (*stop_monitor) (MooFileWatch& watch, - Monitor& monitor); + gboolean (*start_monitor) (MooFileWatch *watch, + Monitor *monitor, + GError **error); + void (*stop_monitor) (MooFileWatch *watch, + Monitor *monitor); }; MOO_DEFINE_SLIST(MonitorList, monitor_list, Monitor) -struct MooFileWatch::Impl -{ - Impl(); - +struct _MooFileWatch { + guint ref_count; guint id; guint stat_timeout; MonitorList *monitors; @@ -110,37 +103,39 @@ typedef enum MOO_FILE_WATCH_ERROR_ACCESS_DENIED } MooFileWatchError; +MOO_DEFINE_BOXED_TYPE_R (MooFileWatch, moo_file_watch) + #define MOO_FILE_WATCH_ERROR (moo_file_watch_error_quark ()) MOO_DEFINE_QUARK_STATIC (moo-file-watch-error, moo_file_watch_error_quark) #ifdef WANT_STAT_MONITOR -static gboolean watch_stat_start (MooFileWatch &watch, - GError** error); -static gboolean watch_stat_shutdown (MooFileWatch& watch, - GError** error); -static gboolean watch_stat_start_monitor (MooFileWatch& watch, - Monitor* monitor, - GError** error); +static gboolean watch_stat_start (MooFileWatch *watch, + GError **error); +static gboolean watch_stat_shutdown (MooFileWatch *watch, + GError **error); +static gboolean watch_stat_start_monitor (MooFileWatch *watch, + Monitor *monitor, + GError **error); #endif #ifdef __WIN32__ -static gboolean watch_win32_start (MooFileWatch& watch, - GError** error); -static gboolean watch_win32_shutdown (MooFileWatch& watch, - GError** error); -static gboolean watch_win32_start_monitor (MooFileWatch& watch, - Monitor* monitor, - GError** error); -static void watch_win32_stop_monitor (MooFileWatch& watch, - Monitor& monitor); +static gboolean watch_win32_start (MooFileWatch *watch, + GError **error); +static gboolean watch_win32_shutdown (MooFileWatch *watch, + GError **error); +static gboolean watch_win32_start_monitor (MooFileWatch *watch, + Monitor *monitor, + GError **error); +static void watch_win32_stop_monitor (MooFileWatch *watch, + Monitor *monitor); #endif /* __WIN32__ */ -static Monitor *monitor_new (MooFileWatch& watch, - const char* filename, +static Monitor *monitor_new (MooFileWatch *watch, + const char *filename, MooFileWatchCallback callback, gpointer data, GDestroyNotify notify); -static void monitor_free (Monitor* monitor); +static void monitor_free (Monitor *monitor); static struct WatchFuncs watch_funcs = { @@ -181,14 +176,30 @@ get_new_watch_id (void) } -MooFileWatch::~MooFileWatch() +MooFileWatch * +moo_file_watch_ref (MooFileWatch *watch) { - if (m_impl->alive) + g_return_val_if_fail (watch != NULL, watch); + watch->ref_count++; + return watch; +} + + +void +moo_file_watch_unref (MooFileWatch *watch) +{ + GError *error = NULL; + + g_return_if_fail (watch != NULL); + + if (--watch->ref_count) + return; + + if (watch->alive) { g_warning ("finalizing open watch"); - GError *error = NULL; - if (!close(&error)) + if (!moo_file_watch_close (watch, &error)) { g_warning ("error in moo_file_watch_close(): %s", moo_error_message (error)); @@ -196,103 +207,144 @@ MooFileWatch::~MooFileWatch() } } - g_hash_table_destroy(m_impl->requests); + g_hash_table_destroy (watch->requests); + g_free (watch); } -MooFileWatch::Impl::Impl() - : id(get_new_watch_id()) - , stat_timeout(0) - , monitors(nullptr) - , requests(nullptr) - , alive(false) +MooFileWatch * +moo_file_watch_new (GError **error) { - requests = g_hash_table_new (g_direct_hash, g_direct_equal); -} + MooFileWatch *watch; -MooFileWatch::MooFileWatch() - : m_ref(1) - , m_impl(make_unique()) -{ -} + watch = g_new0 (MooFileWatch, 1); -MooFileWatchPtr MooFileWatch::create(GError **error) -{ - MooFileWatchPtr watch(new MooFileWatch, ref_transfer::take_ownership); + watch->requests = g_hash_table_new (g_direct_hash, g_direct_equal); - if (!watch_funcs.start(*watch, error)) - return nullptr; + watch->id = get_new_watch_id (); + watch->ref_count = 1; - watch->m_impl->alive = true; + if (!watch_funcs.start (watch, error)) + { + moo_file_watch_unref (watch); + return NULL; + } + + watch->alive = TRUE; return watch; } -void MooFileWatch::ref() + +static MooFileEvent * +moo_file_event_new (const char *filename, + guint monitor_id, + MooFileEventCode code) { - ++m_ref; + MooFileEvent *event; + + event = g_new0 (MooFileEvent, 1); + event->filename = g_strdup (filename); + event->monitor_id = monitor_id; + event->code = code; + event->error = NULL; + + return event; } -void MooFileWatch::unref() +static MooFileEvent * +moo_file_event_copy (MooFileEvent *event) { - if (--m_ref == 0) - delete this; + MooFileEvent *copy; + + copy = moo_file_event_new (event->filename, + event->monitor_id, + event->code); + + if (event->error) + copy->error = g_error_copy (event->error); + + return copy; } - -bool MooFileWatch::close(GError** error) +static void +moo_file_event_free (MooFileEvent *event) { - if (!m_impl->alive) - return true; + if (event) + { + if (event->error) + g_error_free (event->error); + g_free (event->filename); + g_free (event); + } +} - m_impl->alive = FALSE; - - MonitorList *monitors = m_impl->monitors; - m_impl->monitors = NULL; +MOO_DEFINE_BOXED_TYPE_C (MooFileEvent, moo_file_event) + + +gboolean +moo_file_watch_close (MooFileWatch *watch, + GError **error) +{ + MonitorList *monitors; + + g_return_val_if_fail (watch != NULL, FALSE); + + if (!watch->alive) + return TRUE; + + watch->alive = FALSE; + monitors = watch->monitors; + watch->monitors = NULL; while (monitors) { Monitor *mon = monitors->data; if (watch_funcs.stop_monitor) - watch_funcs.stop_monitor(*this, *mon); + watch_funcs.stop_monitor (watch, mon); monitor_free (mon); monitors = monitor_list_delete_link (monitors, monitors); } - return watch_funcs.shutdown(*this, error); + return watch_funcs.shutdown (watch, error); } -guint MooFileWatch::create_monitor(const char* filename, - MooFileWatchCallback callback, - gpointer data, - GDestroyNotify notify, - GError** error) +guint +moo_file_watch_create_monitor (MooFileWatch *watch, + const char *filename, + MooFileWatchCallback callback, + gpointer data, + GDestroyNotify notify, + GError **error) { + Monitor *monitor; + + g_return_val_if_fail (watch != NULL, 0); g_return_val_if_fail (filename != NULL, 0); g_return_val_if_fail (callback != NULL, 0); - if (!m_impl->alive) + if (!watch->alive) { g_set_error (error, MOO_FILE_WATCH_ERROR, MOO_FILE_WATCH_ERROR_CLOSED, "MooFileWatch %u closed", - m_impl->id); + watch->id); return 0; } - Monitor *monitor = monitor_new(*this, filename, callback, data, notify); + monitor = monitor_new (watch, filename, callback, data, notify); - if (!watch_funcs.start_monitor(*this, monitor, error)) + if (!watch_funcs.start_monitor (watch, monitor, error)) { monitor_free (monitor); return 0; } monitor->alive = TRUE; - m_impl->monitors = monitor_list_prepend(m_impl->monitors, monitor); - g_hash_table_insert(m_impl->requests, GUINT_TO_POINTER(monitor->id), monitor); + watch->monitors = monitor_list_prepend (watch->monitors, monitor); + g_hash_table_insert (watch->requests, GUINT_TO_POINTER (monitor->id), monitor); DEBUG_PRINT ("created monitor %d for '%s'", monitor->id, monitor->filename); @@ -300,14 +352,20 @@ guint MooFileWatch::create_monitor(const char* filename, } -void MooFileWatch::cancel_monitor(guint monitor_id) +void +moo_file_watch_cancel_monitor (MooFileWatch *watch, + guint monitor_id) { - Monitor *monitor = (Monitor*) g_hash_table_lookup(m_impl->requests, - GUINT_TO_POINTER (monitor_id)); + Monitor *monitor; + + g_return_if_fail (watch != NULL); + + monitor = (Monitor*) g_hash_table_lookup (watch->requests, + GUINT_TO_POINTER (monitor_id)); g_return_if_fail (monitor != NULL); - m_impl->monitors = monitor_list_remove(m_impl->monitors, monitor); - g_hash_table_remove (m_impl->requests, GUINT_TO_POINTER (monitor->id)); + watch->monitors = monitor_list_remove (watch->monitors, monitor); + g_hash_table_remove (watch->requests, GUINT_TO_POINTER (monitor->id)); if (monitor->alive) DEBUG_PRINT ("stopping monitor %d for '%s'", @@ -317,9 +375,9 @@ void MooFileWatch::cancel_monitor(guint monitor_id) monitor->id, monitor->filename); if (monitor->alive && watch_funcs.stop_monitor) - watch_funcs.stop_monitor(*this, *monitor); + watch_funcs.stop_monitor (watch, monitor); - monitor_free(monitor); + monitor_free (monitor); } @@ -328,7 +386,7 @@ moo_file_watch_emit_event (MooFileWatch *watch, MooFileEvent *event, Monitor *monitor) { - watch->ref(); + moo_file_watch_ref (watch); if (monitor->alive || event->code == MOO_FILE_EVENT_ERROR) { @@ -336,15 +394,15 @@ moo_file_watch_emit_event (MooFileWatch *watch, "changed", "created", "deleted", "error" }; DEBUG_PRINT ("emitting event %s for %s", names[event->code], event->filename); - monitor->callback (*watch, event, monitor->data); + monitor->callback (watch, event, monitor->data); } - watch->unref(); + moo_file_watch_unref (watch); } static Monitor * -monitor_new (MooFileWatch& watch, +monitor_new (MooFileWatch *watch, const char *filename, MooFileWatchCallback callback, gpointer data, @@ -353,7 +411,7 @@ monitor_new (MooFileWatch& watch, Monitor *mon; mon = g_new0 (Monitor, 1); - mon->watch = &watch; + mon->watch = watch; mon->filename = g_strdup (filename); mon->callback = callback; @@ -386,46 +444,43 @@ monitor_free (Monitor *monitor) #define MOO_STAT_PRIORITY G_PRIORITY_DEFAULT #define MOO_STAT_TIMEOUT 500 -static MooFileWatchError errno_to_file_error (mgw_errno_t code); -static gboolean do_stat (MooFileWatch* watch); +static MooFileWatchError errno_to_file_error (mgw_errno_t code); +static gboolean do_stat (MooFileWatch *watch); + static gboolean -watch_stat_start(MooFileWatch& watch, - G_GNUC_UNUSED GError** error) +watch_stat_start (MooFileWatch *watch, + G_GNUC_UNUSED GError **error) { - watch.ref(); - watch.impl().stat_timeout = - g_timeout_add_full (MOO_STAT_PRIORITY, - MOO_STAT_TIMEOUT, - (GSourceFunc) do_stat, - &watch, NULL); + watch->stat_timeout = + gdk_threads_add_timeout_full (MOO_STAT_PRIORITY, + MOO_STAT_TIMEOUT, + (GSourceFunc) do_stat, + watch, NULL); return TRUE; } static gboolean -watch_stat_shutdown (MooFileWatch &watch, +watch_stat_shutdown (MooFileWatch *watch, G_GNUC_UNUSED GError **error) { - if (watch.impl().stat_timeout) - { - g_source_remove(watch.impl().stat_timeout); - watch.impl().stat_timeout = 0; - watch.unref(); - } - + if (watch->stat_timeout) + g_source_remove (watch->stat_timeout); + watch->stat_timeout = 0; return TRUE; } static gboolean -watch_stat_start_monitor (G_GNUC_UNUSED MooFileWatch& watch, - Monitor* monitor, - GError** error) +watch_stat_start_monitor (MooFileWatch *watch, + Monitor *monitor, + GError **error) { MgwStatBuf buf; mgw_errno_t err; + g_return_val_if_fail (watch != NULL, FALSE); g_return_val_if_fail (monitor->filename != NULL, FALSE); if (mgw_stat (monitor->filename, &buf, &err) != 0) @@ -458,21 +513,21 @@ watch_stat_start_monitor (G_GNUC_UNUSED MooFileWatch& watch, static gboolean -do_stat(MooFileWatch *watch) +do_stat (MooFileWatch *watch) { MonitorList *lm; GSList *list = NULL, *lid; GSList *to_remove = NULL; gboolean result = TRUE; - g_return_val_if_fail(watch != NULL, FALSE); + g_return_val_if_fail (watch != NULL, FALSE); - watch->ref(); + moo_file_watch_ref (watch); - if (!watch->impl().monitors) + if (!watch->monitors) goto out; - for (lm = watch->impl().monitors; lm != NULL; lm = lm->next) + for (lm = watch->monitors; lm != NULL; lm = lm->next) { Monitor *m = lm->data; list = g_slist_prepend (list, GUINT_TO_POINTER (m->id)); @@ -487,7 +542,7 @@ do_stat(MooFileWatch *watch) mgw_time_t old; mgw_errno_t err; - monitor = (Monitor*) g_hash_table_lookup(watch->impl().requests, lid->data); + monitor = (Monitor*) g_hash_table_lookup (watch->requests, lid->data); if (!monitor || !monitor->alive) continue; @@ -531,14 +586,14 @@ do_stat(MooFileWatch *watch) } for (lid = to_remove; lid != NULL; lid = lid->next) - if (g_hash_table_lookup (watch->impl().requests, GUINT_TO_POINTER (lid->data))) - watch->cancel_monitor (GPOINTER_TO_UINT (lid->data)); + if (g_hash_table_lookup (watch->requests, GUINT_TO_POINTER (lid->data))) + moo_file_watch_cancel_monitor (watch, GPOINTER_TO_UINT (lid->data)); g_slist_free (to_remove); g_slist_free (list); out: - watch->unref(); + moo_file_watch_unref (watch); return result; } @@ -761,8 +816,8 @@ fam_thread_check_dir (FAMThread *thr, if (!FindNextChangeNotification (thr->events[idx])) { - gstr win_msg = g::win32_error_message(GetLastError()); - gstr msg = gstr::printf("Error in FindNextChangeNotification: %s", win_msg); + char *err = g_win32_error_message (GetLastError ()); + char *msg = g_strdup_printf ("Error in FindNextChangeNotification: %s", err); fam_thread_event (MOO_FILE_WATCH_ERROR_FAILED, TRUE, msg, thr->watches[idx].watch_id, @@ -770,6 +825,9 @@ fam_thread_check_dir (FAMThread *thr, fam_thread_remove_path (thr, thr->watches[idx].watch_id, thr->watches[idx].request); + + g_free (msg); + g_free (err); } } } @@ -881,7 +939,7 @@ find_watch (guint id) { MooFileWatch *watch = (MooFileWatch*) l->data; - if (watch->impl().id == id) + if (watch->id == id) return watch; } @@ -904,7 +962,7 @@ do_event (FAMEvent *event) } monitor = (Monitor*) - g_hash_table_lookup (watch->impl().requests, GUINT_TO_POINTER (event->request)); + g_hash_table_lookup (watch->requests, GUINT_TO_POINTER (event->request)); if (!monitor) { @@ -1021,8 +1079,8 @@ fam_win32_init (void) } static gboolean -watch_win32_start(MooFileWatch& watch, - GError** error) +watch_win32_start (MooFileWatch *watch, + GError **error) { if (!watch_stat_start (watch, error)) return FALSE; @@ -1032,33 +1090,34 @@ watch_win32_start(MooFileWatch& watch, g_set_error (error, MOO_FILE_WATCH_ERROR, MOO_FILE_WATCH_ERROR_FAILED, "Could not initialize folder watch thread"); - watch_stat_shutdown(watch, NULL); + watch_stat_shutdown (watch, NULL); return FALSE; } - fam->watches = g_slist_prepend (fam->watches, &watch); - DEBUG_PRINT ("started watch %d", watch.impl().id); + fam->watches = g_slist_prepend (fam->watches, watch); + DEBUG_PRINT ("started watch %d", watch->id); return TRUE; } static gboolean -watch_win32_shutdown(MooFileWatch& watch, - GError** error) +watch_win32_shutdown (MooFileWatch *watch, + GError **error) { - return watch_stat_shutdown(watch, error); + return watch_stat_shutdown (watch, error); } static gboolean -watch_win32_start_monitor (MooFileWatch& watch, - Monitor* monitor, - GError** error) +watch_win32_start_monitor (MooFileWatch *watch, + Monitor *monitor, + GError **error) { MgwStatBuf buf; mgw_errno_t err; + g_return_val_if_fail (watch != NULL, FALSE); g_return_val_if_fail (monitor->filename != NULL, FALSE); if (mgw_stat (monitor->filename, &buf, &err) != 0) @@ -1072,27 +1131,29 @@ watch_win32_start_monitor (MooFileWatch& watch, monitor->isdir = buf.isdir; if (!monitor->isdir) - return watch_stat_start_monitor(watch, monitor, error); + return watch_stat_start_monitor (watch, monitor, error); DEBUG_PRINT ("created monitor for '%s'", monitor->filename); monitor->id = get_new_monitor_id (); - fam_thread_command(COMMAND_ADD_PATH, monitor->filename, watch.impl().id, monitor->id); + fam_thread_command (COMMAND_ADD_PATH, monitor->filename, watch->id, monitor->id); return TRUE; } static void -watch_win32_stop_monitor (MooFileWatch& watch, - Monitor& monitor) +watch_win32_stop_monitor (MooFileWatch *watch, + Monitor *monitor) { - if (monitor.isdir) + g_return_if_fail (monitor != NULL); + + if (monitor->isdir) { - DEBUG_PRINT ("removing monitor for '%s'", monitor.filename); - fam_thread_command (COMMAND_REMOVE_PATH, monitor.filename, - watch.impl().id, monitor.id); + DEBUG_PRINT ("removing monitor for '%s'", monitor->filename); + fam_thread_command (COMMAND_REMOVE_PATH, monitor->filename, + watch->id, monitor->id); } } #endif /* __WIN32__ */ diff --git a/moo/mooutils/moofilewatch.h b/moo/mooutils/moofilewatch.h index 066d8f02..e119a351 100644 --- a/moo/mooutils/moofilewatch.h +++ b/moo/mooutils/moofilewatch.h @@ -1,7 +1,7 @@ /* * moofilewatch.h * - * Copyright (C) 2004-2016 by Yevgen Muntyan + * Copyright (C) 2004-2010 by Yevgen Muntyan * * This file is part of medit. medit is free software; you can * redistribute it and/or modify it under the terms of the @@ -16,79 +16,64 @@ /* Files and directory monitor. Uses stat(). On win32 does FindFirstChangeNotification and ReadDirectoryChangesW. */ -#pragma once - -#ifndef __cplusplus -#error "This is a C++ header" -#endif // __cplusplus +#ifndef MOO_FILE_WATCH_H +#define MOO_FILE_WATCH_H #include -#include -#include -enum MooFileEventCode { +G_BEGIN_DECLS + + +#define MOO_TYPE_FILE_WATCH (moo_file_watch_get_type ()) +#define MOO_TYPE_FILE_EVENT (moo_file_event_get_type ()) + +typedef enum { MOO_FILE_EVENT_CHANGED, MOO_FILE_EVENT_CREATED, MOO_FILE_EVENT_DELETED, MOO_FILE_EVENT_ERROR -}; +} MooFileEventCode; -struct MooFileEvent { +struct _MooFileEvent { MooFileEventCode code; guint monitor_id; char *filename; GError *error; }; -class MooFileWatch; +typedef struct _MooFileWatch MooFileWatch; +typedef struct _MooFileEvent MooFileEvent; -typedef void (*MooFileWatchCallback) (MooFileWatch& watch, - MooFileEvent* event, +typedef void (*MooFileWatchCallback) (MooFileWatch *watch, + MooFileEvent *event, gpointer user_data); -using MooFileWatchPtr = moo::gref_ptr; -class MooFileWatch -{ -public: - ~MooFileWatch(); +GType moo_file_watch_get_type (void) G_GNUC_CONST; +GType moo_file_event_get_type (void) G_GNUC_CONST; - static MooFileWatchPtr create (GError **error); +/* FAMOpen */ +MooFileWatch *moo_file_watch_new (GError **error); - bool close (GError **error); +MooFileWatch *moo_file_watch_ref (MooFileWatch *watch); +void moo_file_watch_unref (MooFileWatch *watch); - guint create_monitor (const char *filename, - MooFileWatchCallback callback, - gpointer data, - GDestroyNotify notify, - GError **error); +/* FAMClose */ +gboolean moo_file_watch_close (MooFileWatch *watch, + GError **error); - void cancel_monitor (guint monitor_id); +/* FAMMonitorDirectory, FAMMonitorFile */ +guint moo_file_watch_create_monitor (MooFileWatch *watch, + const char *filename, + MooFileWatchCallback callback, + gpointer data, + GDestroyNotify notify, + GError **error); +/* FAMCancelMonitor */ +void moo_file_watch_cancel_monitor (MooFileWatch *watch, + guint monitor_id); - struct Impl; - Impl& impl () { return *m_impl; } - void ref (); - void unref (); +G_END_DECLS - MooFileWatch(const MooFileWatch&) = delete; - MooFileWatch& operator=(const MooFileWatch&) = delete; - -private: - MooFileWatch(); - - int m_ref; - std::unique_ptr m_impl; -}; - -namespace moo { - -template<> -class obj_ref_unref -{ -public: - static void ref(MooFileWatch* w) { w->ref(); } - static void unref(MooFileWatch* w) { w->unref(); } -}; - -} // namespace moo +#endif /* MOO_FILE_WATCH_H */ diff --git a/moo/mooutils/moofilewriter-private.h b/moo/mooutils/moofilewriter-private.h index 202664b7..5356a361 100644 --- a/moo/mooutils/moofilewriter-private.h +++ b/moo/mooutils/moofilewriter-private.h @@ -1,7 +1,7 @@ /* * moofilewriter-private.h * - * Copyright (C) 2004-2016 by Yevgen Muntyan + * Copyright (C) 2004-2010 by Yevgen Muntyan * * This file is part of medit. medit is free software; you can * redistribute it and/or modify it under the terms of the @@ -13,58 +13,73 @@ * License along with medit. If not, see . */ -#pragma once +#ifndef MOO_FILE_WRITER_PRIVATE_H +#define MOO_FILE_WRITER_PRIVATE_H #include "mooutils/moofilewriter.h" -struct MooFileReader -{ - MooFileReader(); - ~MooFileReader(); +G_BEGIN_DECLS - void close_file(); +#define MOO_TYPE_FILE_READER (moo_file_reader_get_type ()) +#define MOO_FILE_READER(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), MOO_TYPE_FILE_READER, MooFileReader)) +#define MOO_FILE_READER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), MOO_TYPE_FILE_READER, MooFileReaderClass)) +#define MOO_IS_FILE_READER(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), MOO_TYPE_FILE_READER)) +#define MOO_IS_FILE_READER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), MOO_TYPE_FILE_READER)) +#define MOO_FILE_READER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), MOO_TYPE_FILE_READER, MooFileReaderClass)) - MOO_DISABLE_COPY_OPS(MooFileReader); +typedef struct _MooFileReaderClass MooFileReaderClass; - MGW_FILE *file; +struct _MooFileReaderClass { + GObjectClass base_class; }; -struct MooFileWriter -{ - virtual ~MooFileWriter() {} - virtual bool write (const char* data, - gssize len = -1) = 0; - virtual bool close(g::gerrp& error) = 0; +#define MOO_TYPE_FILE_WRITER (moo_file_writer_get_type ()) +#define MOO_FILE_WRITER(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), MOO_TYPE_FILE_WRITER, MooFileWriter)) +#define MOO_FILE_WRITER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), MOO_TYPE_FILE_WRITER, MooFileWriterClass)) +#define MOO_IS_FILE_WRITER(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), MOO_TYPE_FILE_WRITER)) +#define MOO_IS_FILE_WRITER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), MOO_TYPE_FILE_WRITER)) +#define MOO_FILE_WRITER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), MOO_TYPE_FILE_WRITER, MooFileWriterClass)) + +typedef struct _MooFileWriterClass MooFileWriterClass; + +struct _MooFileWriter { + GObject base; }; -struct MooLocalFileWriter : public MooFileWriter -{ - MooLocalFileWriter(); - ~MooLocalFileWriter(); +struct _MooFileWriterClass { + GObjectClass base_class; - bool write (const char* data, - gssize len = -1) override; - bool close(g::gerrp& error) override; - - MOO_DISABLE_COPY_OPS(MooLocalFileWriter); - - g::FilePtr file; - g::FileOutputStreamPtr stream; - MooFileWriterFlags flags; - g::gerrp error; + gboolean (*meth_write) (MooFileWriter *writer, + const char *data, + gsize len); + gboolean (*meth_printf) (MooFileWriter *writer, + const char *fmt, + va_list args) G_GNUC_PRINTF (2, 0); + gboolean (*meth_close) (MooFileWriter *writer, + GError **error); }; -struct MooStringWriter : public MooFileWriter -{ - MooStringWriter(); - ~MooStringWriter(); - bool write (const char* data, - gssize len = -1) override; - bool close(g::gerrp& error) override; +#define MOO_TYPE_LOCAL_FILE_WRITER (moo_local_file_writer_get_type ()) - MOO_DISABLE_COPY_OPS(MooStringWriter); +typedef struct _MooLocalFileWriter MooLocalFileWriter; +typedef struct _MooLocalFileWriterClass MooLocalFileWriterClass; - GString *string; +struct _MooLocalFileWriterClass { + MooFileWriterClass base_class; }; + + +#define MOO_TYPE_STRING_WRITER (moo_string_writer_get_type ()) + +typedef struct _MooStringWriter MooStringWriter; +typedef struct _MooStringWriterClass MooStringWriterClass; + +struct _MooStringWriterClass { + MooFileWriterClass base_class; +}; + +G_END_DECLS + +#endif /* MOO_FILE_WRITER_PRIVATE_H */ diff --git a/moo/mooutils/moofilewriter.c b/moo/mooutils/moofilewriter.c new file mode 100644 index 00000000..f0ead1bb --- /dev/null +++ b/moo/mooutils/moofilewriter.c @@ -0,0 +1,726 @@ +/* + * moofilewriter.c + * + * Copyright (C) 2004-2010 by Yevgen Muntyan + * + * This file is part of medit. medit 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. + * + * You should have received a copy of the GNU Lesser General Public + * License along with medit. If not, see . + */ + +#include +#include "mooutils/moofilewriter-private.h" +#include "mooutils/mootype-macros.h" +#include "mooutils/mooutils-fs.h" +#include "mooutils/mooutils-misc.h" +#include "mooutils/mooi18n.h" +#include "mooutils/moocompat.h" +#include +#include +#include +#include +#include +#ifdef HAVE_UNISTD_H +#include +#endif + +/************************************************************************/ +/* MooFileReader + */ + +struct _MooFileReader { + GObject base; + MGW_FILE *file; +}; + +MOO_DEFINE_TYPE_STATIC (MooFileReader, moo_file_reader, G_TYPE_OBJECT) + +static void +moo_file_reader_init (MooFileReader *reader) +{ + reader->file = NULL; +} + +static void +moo_file_reader_close_file (MooFileReader *reader) +{ + if (reader->file) + { + mgw_fclose (reader->file); + reader->file = NULL; + } +} + +static void +moo_file_reader_dispose (GObject *object) +{ + MooFileReader *reader = MOO_FILE_READER (object); + moo_file_reader_close_file (reader); + G_OBJECT_CLASS (moo_file_reader_parent_class)->dispose (object); +} + +static void +moo_file_reader_class_init (MooFileReaderClass *klass) +{ + G_OBJECT_CLASS (klass)->dispose = moo_file_reader_dispose; +} + +void +moo_file_reader_close (MooFileReader *reader) +{ + g_return_if_fail (MOO_IS_FILE_READER (reader)); + moo_file_reader_close_file (reader); + g_object_unref (reader); +} + +static MooFileReader * +moo_file_reader_new_real (const char *filename, + gboolean binary, + GError **error) +{ + const char *mode = binary ? "rb" : "r"; + MGW_FILE *file; + MooFileReader *reader; + mgw_errno_t err; + + g_return_val_if_fail (filename != NULL, NULL); + g_return_val_if_fail (!error || !*error, NULL); + + if (!(file = mgw_fopen (filename, mode, &err))) + { + g_set_error (error, MOO_FILE_ERROR, + _moo_file_error_from_errno (err), + _("Could not open %s: %s"), filename, + mgw_strerror (err)); + return NULL; + } + + reader = g_object_new (MOO_TYPE_FILE_READER, (const char*) NULL); + reader->file = file; + + return reader; +} + +MooFileReader * +moo_file_reader_new (const char *filename, + GError **error) +{ + return moo_file_reader_new_real (filename, TRUE, error); +} + +MooFileReader * +moo_text_reader_new (const char *filename, + GError **error) +{ + return moo_file_reader_new_real (filename, FALSE, error); +} + +gboolean +moo_file_reader_read (MooFileReader *reader, + char *buf, + gsize buf_size, + gsize *size_read_p, + GError **error) +{ + gsize size_read; + mgw_errno_t err; + + g_return_val_if_fail (MOO_IS_FILE_READER (reader), FALSE); + g_return_val_if_fail (size_read_p != NULL, FALSE); + g_return_val_if_fail (!error || !*error, FALSE); + g_return_val_if_fail (reader->file != NULL, FALSE); + g_return_val_if_fail (buf_size == 0 || buf != NULL, FALSE); + + if (buf_size == 0) + return TRUE; + + size_read = mgw_fread (buf, 1, buf_size, reader->file, &err); + + if (size_read != buf_size && mgw_ferror (reader->file)) + { + g_set_error (error, MOO_FILE_ERROR, + _moo_file_error_from_errno (err), + "error reading file: %s", + mgw_strerror (err)); + return FALSE; + } + + *size_read_p = size_read; + return TRUE; +} + + +/************************************************************************/ +/* MooFileWriter + */ + +MOO_DEFINE_TYPE_STATIC (MooFileWriter, moo_file_writer, G_TYPE_OBJECT) + +static void +moo_file_writer_init (G_GNUC_UNUSED MooFileWriter *writer) +{ +} + +static void +moo_file_writer_class_init (G_GNUC_UNUSED MooFileWriterClass *klass) +{ +} + +gboolean +moo_file_writer_write (MooFileWriter *writer, + const char *data, + gssize len) +{ + g_return_val_if_fail (MOO_IS_FILE_WRITER (writer), FALSE); + g_return_val_if_fail (data != NULL, FALSE); + + if (len < 0) + len = strlen (data); + if (!len) + return TRUE; + + return MOO_FILE_WRITER_GET_CLASS (writer)->meth_write (writer, data, len); +} + +gboolean +moo_file_writer_printf (MooFileWriter *writer, + const char *fmt, + ...) +{ + va_list args; + gboolean ret; + + g_return_val_if_fail (MOO_IS_FILE_WRITER (writer), FALSE); + g_return_val_if_fail (fmt != NULL, FALSE); + + va_start (args, fmt); + ret = MOO_FILE_WRITER_GET_CLASS (writer)->meth_printf (writer, fmt, args); + va_end (args); + + return ret; +} + +gboolean +moo_file_writer_printf_markup (MooFileWriter *writer, + const char *fmt, + ...) +{ + va_list args; + gboolean ret; + char *string; + + g_return_val_if_fail (MOO_IS_FILE_WRITER (writer), FALSE); + g_return_val_if_fail (fmt != NULL, FALSE); + + va_start (args, fmt); + string = g_markup_vprintf_escaped (fmt, args); + va_end (args); + + g_return_val_if_fail (string != NULL, FALSE); + + ret = moo_file_writer_write (writer, string, -1); + + g_free (string); + return ret; +} + +gboolean +moo_file_writer_close (MooFileWriter *writer, + GError **error) +{ + gboolean ret; + + g_return_val_if_fail (MOO_IS_FILE_WRITER (writer), FALSE); + g_return_val_if_fail (!error || !*error, FALSE); + + ret = MOO_FILE_WRITER_GET_CLASS (writer)->meth_close (writer, error); + + g_object_unref (writer); + return ret; +} + + +/************************************************************************/ +/* MooLocalFileWriter + */ + +struct _MooLocalFileWriter { + MooFileWriter base; + GFile *file; + GOutputStream *stream; + MooFileWriterFlags flags; + GError *error; +}; + +MOO_DEFINE_TYPE_STATIC (MooLocalFileWriter, moo_local_file_writer, MOO_TYPE_FILE_WRITER) + +static MooFileWriter * +moo_local_file_writer_new (GFile *file, + MooFileWriterFlags flags, + GError **error) +{ + MooLocalFileWriter *writer = NULL; + GFileOutputStream *stream = NULL; + GFile *file_copy = NULL; + + g_return_val_if_fail (G_IS_FILE (file), NULL); + + if (flags & MOO_FILE_WRITER_CONFIG_MODE) + { + char *dirname; + char *filename; + mgw_errno_t err; + + filename = g_file_get_path (file); + dirname = filename ? g_path_get_dirname (filename) : NULL; + + if (dirname && _moo_mkdir_with_parents (dirname, &err) != 0) + { + char *display_name = g_filename_display_name (dirname); + g_set_error (error, G_FILE_ERROR, + mgw_file_error_from_errno (err), + _("Could not create folder %s: %s"), + display_name, mgw_strerror (err)); + g_free (display_name); + g_free (dirname); + goto error; + } + + g_free (dirname); + g_free (filename); + } + + file_copy = g_file_dup (file); + stream = g_file_replace (file_copy, NULL, + (flags & MOO_FILE_WRITER_SAVE_BACKUP) != 0, + G_FILE_CREATE_NONE, + NULL, error); + + if (!stream) + goto error; + + writer = g_object_new (MOO_TYPE_LOCAL_FILE_WRITER, (const char*) NULL); + writer->file = file_copy; + writer->stream = G_OUTPUT_STREAM (stream); + writer->flags = flags; + + return MOO_FILE_WRITER (writer); + +error: + if (file_copy) + g_object_unref (file_copy); + if (stream) + g_object_unref (stream); + return NULL; +} + +MooFileWriter * +moo_file_writer_new (const char *filename, + MooFileWriterFlags flags, + GError **error) +{ + GFile *file; + MooFileWriter *writer; + + g_return_val_if_fail (filename != NULL, NULL); + g_return_val_if_fail (!error || !*error, NULL); + + file = g_file_new_for_path (filename); + writer = moo_local_file_writer_new (file, flags, error); + + g_object_unref (file); + return writer; +} + +MooFileWriter * +moo_file_writer_new_for_file (GFile *file, + MooFileWriterFlags flags, + GError **error) +{ + g_return_val_if_fail (G_IS_FILE (file), NULL); + g_return_val_if_fail (!error || !*error, NULL); + return moo_local_file_writer_new (file, flags, error); +} + +MooFileWriter * +moo_config_writer_new (const char *filename, + gboolean save_backup, + GError **error) +{ + MooFileWriterFlags flags; + + g_return_val_if_fail (filename != NULL, NULL); + g_return_val_if_fail (!error || !*error, NULL); + + flags = MOO_FILE_WRITER_CONFIG_MODE | MOO_FILE_WRITER_TEXT_MODE; + if (save_backup) + flags |= MOO_FILE_WRITER_SAVE_BACKUP; + + return moo_file_writer_new (filename, flags, error); +} + + +static gboolean +moo_local_file_writer_write (MooFileWriter *fwriter, + const char *data, + gsize len) +{ + MooLocalFileWriter *writer = (MooLocalFileWriter*) fwriter; + + if (writer->error) + return FALSE; + + while (len > 0) + { + gsize chunk_len = len; + gsize next_chunk = len; + gsize bytes_written; +#ifdef __WIN32__ + gboolean need_le = FALSE; +#endif + +#ifdef __WIN32__ + if (writer->flags & MOO_FILE_WRITER_TEXT_MODE) + { + gsize le_start, le_len; + if (moo_find_line_end (data, len, &le_start, &le_len)) + { + need_le = TRUE; + chunk_len = le_start; + next_chunk = le_start + le_len; + } + } +#endif + + if (!g_output_stream_write_all (writer->stream, + data, chunk_len, + &bytes_written, NULL, + &writer->error)) + return FALSE; + + data += next_chunk; + len -= next_chunk; + +#ifdef __WIN32__ + if (need_le && !g_output_stream_write_all (writer->stream, + "\r\n", 2, + &bytes_written, NULL, + &writer->error)) + return FALSE; +#endif + } + + return TRUE; +} + +G_GNUC_PRINTF (2, 0) +static gboolean +moo_local_file_writer_printf (MooFileWriter *fwriter, + const char *fmt, + va_list args) +{ + MooLocalFileWriter *writer = (MooLocalFileWriter*) fwriter; + char *text; + gboolean retval; + + if (writer->error) + return FALSE; + + text = g_strdup_vprintf (fmt, args); + retval = moo_local_file_writer_write (fwriter, text, strlen (text)); + g_free (text); + + return retval; +} + +static gboolean +moo_local_file_writer_close (MooFileWriter *fwriter, + GError **error) +{ + MooLocalFileWriter *writer = (MooLocalFileWriter*) fwriter; + gboolean retval; + + g_return_val_if_fail (writer->stream != NULL, FALSE); + + if (!writer->error) + { + g_output_stream_flush (writer->stream, NULL, &writer->error); + g_output_stream_close (writer->stream, NULL, + writer->error ? NULL : &writer->error); + g_object_unref (writer->stream); + g_object_unref (writer->file); + writer->stream = NULL; + writer->file = NULL; + } + + retval = writer->error == NULL; + + if (writer->error) + g_propagate_error (error, writer->error); + + writer->error = NULL; + return retval; +} + + +static void +moo_local_file_writer_class_init (MooLocalFileWriterClass *klass) +{ + MooFileWriterClass *writer_class = MOO_FILE_WRITER_CLASS (klass); + writer_class->meth_write = moo_local_file_writer_write; + writer_class->meth_printf = moo_local_file_writer_printf; + writer_class->meth_close = moo_local_file_writer_close; +} + +static void +moo_local_file_writer_init (MooLocalFileWriter *writer) +{ + writer->file = NULL; + writer->stream = NULL; + writer->error = NULL; +} + + +/************************************************************************/ +/* MooStringWriter + */ + +struct _MooStringWriter { + MooFileWriter base; + GString *string; +}; + +MOO_DEFINE_TYPE_STATIC (MooStringWriter, moo_string_writer, MOO_TYPE_FILE_WRITER) + +static gboolean +moo_string_writer_write (MooFileWriter *fwriter, + const char *data, + gsize len) +{ + MooStringWriter *writer = (MooStringWriter*) fwriter; + g_string_append_len (writer->string, data, len); + return TRUE; +} + +G_GNUC_PRINTF (2, 0) +static gboolean +moo_string_writer_printf (MooFileWriter *fwriter, + const char *fmt, + va_list args) +{ + char *buf; + gint len; + MooStringWriter *writer = (MooStringWriter*) fwriter; + + len = g_vasprintf (&buf, fmt, args); + + if (len >= 0) + { + g_string_append_len (writer->string, buf, len); + g_free (buf); + } + + return TRUE; +} + +static gboolean +moo_string_writer_close (MooFileWriter *fwriter, + G_GNUC_UNUSED GError **error) +{ + MooStringWriter *writer = (MooStringWriter*) fwriter; + g_string_free (writer->string, TRUE); + writer->string = NULL; + return TRUE; +} + +static void +moo_string_writer_class_init (MooStringWriterClass *klass) +{ + MooFileWriterClass *writer_class = MOO_FILE_WRITER_CLASS (klass); + writer_class->meth_write = moo_string_writer_write; + writer_class->meth_printf = moo_string_writer_printf; + writer_class->meth_close = moo_string_writer_close; +} + +static void +moo_string_writer_init (MooStringWriter *writer) +{ + writer->string = g_string_new (NULL); +} + +MooFileWriter * +moo_string_writer_new (void) +{ + return g_object_new (MOO_TYPE_STRING_WRITER, (const char*) NULL); +} + +const char * +moo_string_writer_get_string (MooFileWriter *fwriter, + gsize *len) +{ + MooStringWriter *writer = (MooStringWriter*) fwriter; + + g_return_val_if_fail (G_TYPE_CHECK_INSTANCE_TYPE ((writer), MOO_TYPE_STRING_WRITER), NULL); + g_return_val_if_fail (writer->string != NULL, NULL); + + if (len) + *len = writer->string->len; + + return writer->string->str; +} + + +static gboolean +same_content (const char *filename1, + const char *filename2) +{ + GMappedFile *file1, *file2; + char *content1, *content2; + gsize len; + gboolean equal = FALSE; + + file1 = g_mapped_file_new (filename1, FALSE, NULL); + file2 = g_mapped_file_new (filename2, FALSE, NULL); + + if (!file1 || !file2 || + g_mapped_file_get_length (file1) != g_mapped_file_get_length (file2)) + goto out; + + len = g_mapped_file_get_length (file1); + content1 = g_mapped_file_get_contents (file1); + content2 = g_mapped_file_get_contents (file2); + + if (memcmp (content1, content2, len) == 0) + equal = TRUE; + +out: + if (file1) + g_mapped_file_unref (file1); + if (file2) + g_mapped_file_unref (file2); + return equal; +} + +static gboolean +check_file_contents (const char *filename, + const char *contents) +{ + gboolean equal; + char *real_contents; + + if (!g_file_get_contents (filename, &real_contents, NULL, NULL)) + return FALSE; + + equal = strcmp (real_contents, contents) == 0; + + g_free (real_contents); + return equal; +} + +static void +test_moo_file_writer (void) +{ + const char *dir; + char *my_dir, *filename, *bak_filename; + MooFileWriter *writer; + GError *error = NULL; + + dir = moo_test_get_working_dir (); + my_dir = g_build_filename (dir, "cfg-writer", NULL); + filename = g_build_filename (my_dir, "configfile", NULL); + bak_filename = g_strdup_printf ("%s~", filename); + + writer = moo_config_writer_new (filename, TRUE, &error); + TEST_ASSERT_MSG (writer != NULL, + "moo_cfg_writer_new failed: %s", + moo_error_message (error)); + if (error) + { + g_error_free (error); + error = NULL; + } + + if (writer) + { + moo_file_writer_write (writer, "first line\n", -1); + moo_file_writer_printf (writer, "second line #%d\n", 2); + moo_file_writer_write (writer, "third\nlalalala\n", 6); + TEST_ASSERT_MSG (moo_file_writer_close (writer, &error), + "moo_file_writer_close failed: %s", + moo_error_message (error)); + if (error) + { + g_error_free (error); + error = NULL; + } + +#ifdef __WIN32__ +#define LE "\r\n" +#else +#define LE "\n" +#endif + + TEST_ASSERT (g_file_test (filename, G_FILE_TEST_EXISTS)); + TEST_ASSERT (!g_file_test (bak_filename, G_FILE_TEST_EXISTS)); + TEST_ASSERT (check_file_contents (filename, "first line" LE "second line #2" LE "third" LE)); + } + + writer = moo_config_writer_new (filename, TRUE, &error); + TEST_ASSERT_MSG (writer != NULL, + "moo_config_writer_new failed: %s", + moo_error_message (error)); + if (writer) + { + moo_file_writer_write (writer, "First line\n", -1); + moo_file_writer_printf (writer, "Second line #%d\n", 2); + moo_file_writer_write (writer, "Third\nlalalala\n", 6); + TEST_ASSERT_MSG (moo_file_writer_close (writer, &error), + "moo_file_writer_close failed: %s", + moo_error_message (error)); + if (error) + { + g_error_free (error); + error = NULL; + } + + TEST_ASSERT (g_file_test (filename, G_FILE_TEST_EXISTS)); + TEST_ASSERT (g_file_test (bak_filename, G_FILE_TEST_EXISTS)); + TEST_ASSERT (check_file_contents (filename, "First line" LE "Second line #2" LE "Third" LE)); + TEST_ASSERT (check_file_contents (bak_filename, "first line" LE "second line #2" LE "third" LE)); + TEST_ASSERT (!same_content (bak_filename, filename)); + } + + TEST_ASSERT (_moo_remove_dir (my_dir, TRUE, NULL)); + +#ifndef __WIN32__ + writer = moo_config_writer_new ("/usr/test-mooutils-fs", TRUE, &error); +#else + writer = moo_config_writer_new ("K:\\nowayyouhaveit\\file.ini", TRUE, &error); +#endif + TEST_ASSERT (writer == NULL); + TEST_ASSERT (error != NULL); + + if (error) + g_error_free (error); + error = NULL; + + g_free (bak_filename); + g_free (filename); + g_free (my_dir); +} + +void +moo_test_moo_file_writer (void) +{ + MooTestSuite *suite; + + suite = moo_test_suite_new ("MooFileWriter", "MooFileWriter tests", NULL, NULL, NULL); + + moo_test_suite_add_test (suite, "MooFileWriter", "MooFileWriter tests", + (MooTestFunc) test_moo_file_writer, NULL); +} diff --git a/moo/mooutils/moofilewriter.cpp b/moo/mooutils/moofilewriter.cpp deleted file mode 100644 index 22b29135..00000000 --- a/moo/mooutils/moofilewriter.cpp +++ /dev/null @@ -1,557 +0,0 @@ -/* - * moofilewriter.c - * - * Copyright (C) 2004-2010 by Yevgen Muntyan - * - * This file is part of medit. medit 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. - * - * You should have received a copy of the GNU Lesser General Public - * License along with medit. If not, see . - */ - -#include -#include "mooutils/moofilewriter-private.h" -#include "mooutils/mootype-macros.h" -#include "mooutils/mooutils-fs.h" -#include "mooutils/mooutils-misc.h" -#include "mooutils/mooi18n.h" -#include "mooutils/moocompat.h" -#include -#include -#include -#include -#include -#include -#ifdef HAVE_UNISTD_H -#include -#endif - -using namespace moo; - -/************************************************************************/ -/* MooFileReader - */ - -MooFileReader::MooFileReader() - : file(nullptr) -{ -} - -void MooFileReader::close_file () -{ - if (file) - { - mgw_fclose (file); - file = nullptr; - } -} - -MooFileReader::~MooFileReader() -{ - close_file(); -} - -void -moo_file_reader_close (MooFileReader *reader) -{ - delete reader; -} - -static MooFileReader * -moo_file_reader_new_real (const char *filename, - gboolean binary, - gerrp& error) -{ - const char *mode = binary ? "rb" : "r"; - MGW_FILE *file; - MooFileReader *reader; - mgw_errno_t err; - - g_return_val_if_fail (filename != NULL, NULL); - g_return_val_if_fail (!error, NULL); - - if (!(file = mgw_fopen (filename, mode, &err))) - { - g_set_error (&error, MOO_FILE_ERROR, - _moo_file_error_from_errno (err), - _("Could not open %s: %s"), filename, - mgw_strerror (err)); - return NULL; - } - - reader = new MooFileReader(); - reader->file = file; - - return reader; -} - -MooFileReader * -moo_file_reader_new (const char* filename, - gerrp& error) -{ - return moo_file_reader_new_real (filename, TRUE, error); -} - -MooFileReader * -moo_text_reader_new (const char* filename, - gerrp& error) -{ - return moo_file_reader_new_real (filename, FALSE, error); -} - -gboolean -moo_file_reader_read (MooFileReader *reader, - char *buf, - gsize buf_size, - gsize *size_read_p, - gerrp& error) -{ - gsize size_read; - mgw_errno_t err; - - g_return_val_if_fail (reader != nullptr, FALSE); - g_return_val_if_fail (size_read_p != NULL, FALSE); - g_return_val_if_fail (!error, FALSE); - g_return_val_if_fail (reader->file != NULL, FALSE); - g_return_val_if_fail (buf_size == 0 || buf != NULL, FALSE); - - if (buf_size == 0) - return TRUE; - - size_read = mgw_fread (buf, 1, buf_size, reader->file, &err); - - if (size_read != buf_size && mgw_ferror (reader->file)) - { - g_set_error (&error, MOO_FILE_ERROR, - _moo_file_error_from_errno (err), - "error reading file: %s", - mgw_strerror (err)); - return FALSE; - } - - *size_read_p = size_read; - return TRUE; -} - - -/************************************************************************/ -/* MooFileWriter - */ - -gboolean -moo_file_writer_write (MooFileWriter *writer, - const char *data, - gssize len) -{ - g_return_val_if_fail (writer != nullptr, FALSE); - g_return_val_if_fail (data != NULL, FALSE); - - if (len < 0) - len = strlen (data); - if (!len) - return TRUE; - - return writer->write (data, len); -} - -gboolean -moo_file_writer_printf_c (MooFileWriter *writer, - const char *fmt, - ...) -{ - va_list args; - - g_return_val_if_fail (writer != nullptr, FALSE); - g_return_val_if_fail (fmt != NULL, FALSE); - - va_start (args, fmt); - gstr s = gstr::vprintf (fmt, args); - va_end (args); - - return writer->write (s); -} - -gboolean -moo_file_writer_printf_markup_c (MooFileWriter *writer, - const char *fmt, - ...) -{ - g_return_val_if_fail (writer != nullptr, FALSE); - g_return_val_if_fail (fmt != NULL, FALSE); - - va_list args; - va_start (args, fmt); - gstr string = g::markup_vprintf_escaped (fmt, args); - va_end (args); - - g_return_val_if_fail (!string.is_null(), FALSE); - - return moo_file_writer_write (writer, string, -1); -} - -gboolean -moo_file_writer_close (MooFileWriter* writer, - gerrp& error) -{ - gboolean ret; - - g_return_val_if_fail (writer != nullptr, FALSE); - g_return_val_if_fail (!error, FALSE); - - ret = writer->close (error); - - delete writer; - return ret; -} - -gboolean -moo_file_writer_close (MooFileWriter *writer, - GError **errorp) -{ - gerrp error(errorp); - return moo_file_writer_close (writer, error); -} - - -/************************************************************************/ -/* MooLocalFileWriter - */ - -MooLocalFileWriter::MooLocalFileWriter() - : flags(MOO_FILE_WRITER_FLAGS_NONE) -{ -} - -MooLocalFileWriter::~MooLocalFileWriter() -{ -} - -static MooFileWriter * -moo_local_file_writer_new (g::File file, - MooFileWriterFlags flags, - gerrp& error) -{ - if (flags & MOO_FILE_WRITER_CONFIG_MODE) - { - mgw_errno_t err; - - gstr filename = file.get_path (); - gstr dirname = !filename.empty() ? g::path_get_dirname (filename) : gstr(); - - if (!dirname.empty() && _moo_mkdir_with_parents (dirname, &err) != 0) - { - gstr display_name = g::filename_display_name (dirname); - g_set_error (&error, G_FILE_ERROR, - mgw_file_error_from_errno (err), - _("Could not create folder %s: %s"), - display_name.get(), mgw_strerror (err)); - return nullptr; - } - } - - g::FilePtr file_copy = file.dup (); - g::FileOutputStreamPtr stream = file_copy->replace (NULL, - (flags & MOO_FILE_WRITER_SAVE_BACKUP) != 0, - G_FILE_CREATE_NONE, - NULL, error); - - if (!stream) - return nullptr; - - auto writer = make_unique(); - - writer->file = file_copy; - writer->stream = stream; - writer->flags = flags; - - return writer.release (); -} - -MooFileWriter * -moo_file_writer_new (const char* filename, - MooFileWriterFlags flags, - gerrp& error) -{ - g_return_val_if_fail (filename != nullptr, nullptr); - g_return_val_if_fail (!error, nullptr); - - g::FilePtr file = g::File::new_for_path (filename); - g_return_val_if_fail (file != nullptr, nullptr); - - return moo_local_file_writer_new (*file, flags, error); -} - -MooFileWriter * -moo_file_writer_new_for_file (g::File file, - MooFileWriterFlags flags, - gerrp& error) -{ - g_return_val_if_fail (!error, NULL); - return moo_local_file_writer_new (file, flags, error); -} - -MooFileWriter * -moo_config_writer_new (const char *filename, - gboolean save_backup, - gerrp& error) -{ - MooFileWriterFlags flags; - - g_return_val_if_fail (filename != NULL, NULL); - g_return_val_if_fail (!error, NULL); - - flags = MOO_FILE_WRITER_CONFIG_MODE | MOO_FILE_WRITER_TEXT_MODE; - if (save_backup) - flags |= MOO_FILE_WRITER_SAVE_BACKUP; - - return moo_file_writer_new (filename, flags, error); -} - -MooFileWriter * -moo_config_writer_new (const char *filename, - gboolean save_backup, - GError **errorp) -{ - gerrp error(errorp); - return moo_config_writer_new(filename, save_backup, error); -} - - -bool MooLocalFileWriter::write (const char* data, gssize len) -{ - if (error) - return FALSE; - - if (len < 0) - len = strlen(data); - - while (len > 0) - { - gsize chunk_len = len; - gsize next_chunk = len; - gsize bytes_written; -#ifdef __WIN32__ - gboolean need_le = FALSE; -#endif - -#ifdef __WIN32__ - if (flags & MOO_FILE_WRITER_TEXT_MODE) - { - gsize le_start, le_len; - if (moo_find_line_end (data, len, &le_start, &le_len)) - { - need_le = TRUE; - chunk_len = le_start; - next_chunk = le_start + le_len; - } - } -#endif - - if (!stream->write_all (data, chunk_len, - &bytes_written, NULL, - error)) - return FALSE; - - data += next_chunk; - len -= next_chunk; - -#ifdef __WIN32__ - if (need_le && !stream->write_all ("\r\n", 2, - &bytes_written, NULL, - error)) - return FALSE; -#endif - } - - return TRUE; -} - -bool MooLocalFileWriter::close (gerrp& out_error) -{ - g_return_val_if_fail (stream != nullptr, FALSE); - - if (!error) - { - stream->flush (NULL, error); - gerrp second; - stream->close (NULL, error ? second : error); - stream.reset (); - file.reset (); - } - - out_error = std::move (error); - return !out_error; -} - - -/************************************************************************/ -/* MooStringWriter - */ - -bool MooStringWriter::write (const char* data, gssize len) -{ - g_string_append_len (string, data, len); - return TRUE; -} - -bool MooStringWriter::close (G_GNUC_UNUSED gerrp& error) -{ - g_string_free (string, TRUE); - string = NULL; - return TRUE; -} - -MooStringWriter::MooStringWriter() - : string (g_string_new (NULL)) -{ -} - -MooStringWriter::~MooStringWriter() -{ - g_assert (!string); -} - -MooFileWriter * -moo_string_writer_new (void) -{ - return new MooStringWriter(); -} - - -static gboolean -same_content (const char *filename1, - const char *filename2) -{ - GMappedFile *file1, *file2; - char *content1, *content2; - gsize len; - gboolean equal = FALSE; - - file1 = g_mapped_file_new (filename1, FALSE, NULL); - file2 = g_mapped_file_new (filename2, FALSE, NULL); - - if (!file1 || !file2 || - g_mapped_file_get_length (file1) != g_mapped_file_get_length (file2)) - goto out; - - len = g_mapped_file_get_length (file1); - content1 = g_mapped_file_get_contents (file1); - content2 = g_mapped_file_get_contents (file2); - - if (memcmp (content1, content2, len) == 0) - equal = TRUE; - -out: - if (file1) - g_mapped_file_unref (file1); - if (file2) - g_mapped_file_unref (file2); - return equal; -} - -static gboolean -check_file_contents (const char *filename, - const char *contents) -{ - gboolean equal; - char *real_contents; - - if (!g_file_get_contents (filename, &real_contents, NULL, NULL)) - return FALSE; - - equal = strcmp (real_contents, contents) == 0; - - g_free (real_contents); - return equal; -} - -static void -test_moo_file_writer (void) -{ - const char *dir; - char *my_dir, *filename, *bak_filename; - MooFileWriter *writer; - gerrp error; - - dir = moo_test_get_working_dir (); - my_dir = g_build_filename (dir, "cfg-writer", NULL); - filename = g_build_filename (my_dir, "configfile", NULL); - bak_filename = g_strdup_printf ("%s~", filename); - - writer = moo_config_writer_new (filename, TRUE, &error); - TEST_ASSERT_MSG (writer != NULL, - "moo_cfg_writer_new failed: %s", - moo_error_message (error)); - error.clear (); - - if (writer) - { - moo_file_writer_write (writer, "first line\n", -1); - moo_file_writer_printf (writer, "second line #%d\n", 2); - moo_file_writer_write (writer, "third\nlalalala\n", 6); - TEST_ASSERT_MSG (moo_file_writer_close (writer, &error), - "moo_file_writer_close failed: %s", - moo_error_message (error)); - error.clear (); - -#ifdef __WIN32__ -#define LE "\r\n" -#else -#define LE "\n" -#endif - - TEST_ASSERT (g_file_test (filename, G_FILE_TEST_EXISTS)); - TEST_ASSERT (!g_file_test (bak_filename, G_FILE_TEST_EXISTS)); - TEST_ASSERT (check_file_contents (filename, "first line" LE "second line #2" LE "third" LE)); - } - - writer = moo_config_writer_new (filename, TRUE, &error); - TEST_ASSERT_MSG (writer != NULL, - "moo_config_writer_new failed: %s", - moo_error_message (error)); - if (writer) - { - moo_file_writer_write (writer, "First line\n", -1); - moo_file_writer_printf (writer, "Second line #%d\n", 2); - moo_file_writer_write (writer, "Third\nlalalala\n", 6); - TEST_ASSERT_MSG (moo_file_writer_close (writer, &error), - "moo_file_writer_close failed: %s", - moo_error_message (error)); - error.clear (); - - TEST_ASSERT (g_file_test (filename, G_FILE_TEST_EXISTS)); - TEST_ASSERT (g_file_test (bak_filename, G_FILE_TEST_EXISTS)); - TEST_ASSERT (check_file_contents (filename, "First line" LE "Second line #2" LE "Third" LE)); - TEST_ASSERT (check_file_contents (bak_filename, "first line" LE "second line #2" LE "third" LE)); - TEST_ASSERT (!same_content (bak_filename, filename)); - } - - TEST_ASSERT (_moo_remove_dir (my_dir, TRUE, NULL)); - -#ifndef __WIN32__ - writer = moo_config_writer_new ("/usr/test-mooutils-fs", TRUE, &error); -#else - writer = moo_config_writer_new ("K:\\nowayyouhaveit\\file.ini", TRUE, &error); -#endif - TEST_ASSERT (writer == NULL); - TEST_ASSERT (error); - - g_free (bak_filename); - g_free (filename); - g_free (my_dir); -} - -void -moo_test_moo_file_writer (void) -{ - MooTestSuite *suite; - - suite = moo_test_suite_new ("MooFileWriter", "MooFileWriter tests", NULL, NULL, NULL); - - moo_test_suite_add_test (suite, "MooFileWriter", "MooFileWriter tests", - (MooTestFunc) test_moo_file_writer, NULL); -} diff --git a/moo/mooutils/moofilewriter.h b/moo/mooutils/moofilewriter.h index 20e65bae..849449e6 100644 --- a/moo/mooutils/moofilewriter.h +++ b/moo/mooutils/moofilewriter.h @@ -13,103 +13,63 @@ * License along with medit. If not, see . */ -#pragma once +#ifndef MOO_FILE_WRITER_H +#define MOO_FILE_WRITER_H -#include -#include +#include -#ifdef __cplusplus +G_BEGIN_DECLS -struct MooFileReader; -struct MooFileWriter; -void g_object_ref(MooFileReader*) = delete; -void g_object_unref(MooFileReader*) = delete; -void g_object_ref(MooFileWriter*) = delete; -void g_object_unref(MooFileWriter*) = delete; +typedef struct _MooFileReader MooFileReader; MooFileReader *moo_file_reader_new (const char *filename, - g::gerrp& error); + GError **error); MooFileReader *moo_text_reader_new (const char *filename, - g::gerrp& error); + GError **error); gboolean moo_file_reader_read (MooFileReader *reader, char *buf, gsize buf_size, gsize *size_read, - g::gerrp& error); + GError **error); void moo_file_reader_close (MooFileReader *reader); +typedef struct _MooFileWriter MooFileWriter; + typedef enum /*< flags >*/ { - MOO_FILE_WRITER_FLAGS_NONE = 0, MOO_FILE_WRITER_SAVE_BACKUP = 1 << 0, MOO_FILE_WRITER_CONFIG_MODE = 1 << 1, MOO_FILE_WRITER_TEXT_MODE = 1 << 2 } MooFileWriterFlags; -MOO_DEFINE_FLAGS(MooFileWriterFlags); - MooFileWriter *moo_file_writer_new (const char *filename, MooFileWriterFlags flags, - g::gerrp& error); -MooFileWriter *moo_file_writer_new_for_file (g::File& file, + GError **error); +MooFileWriter *moo_file_writer_new_for_file (GFile *file, MooFileWriterFlags flags, - g::gerrp& error); + GError **error); MooFileWriter *moo_config_writer_new (const char *filename, gboolean save_backup, - g::gerrp& error); + GError **error); MooFileWriter *moo_string_writer_new (void); -gboolean moo_file_writer_close (MooFileWriter *writer, - g::gerrp& error); - - -#endif // __cplusplus - -G_BEGIN_DECLS - -typedef struct MooFileWriter MooFileWriter; - -MooFileWriter *moo_config_writer_new (const char *filename, - gboolean save_backup, - GError **error); gboolean moo_file_writer_write (MooFileWriter *writer, const char *data, - gssize len MOO_CPP_DFLT_PARAM(-1)); -gboolean moo_file_writer_printf_c (MooFileWriter *writer, + gssize len); +gboolean moo_file_writer_printf (MooFileWriter *writer, const char *fmt, ...) G_GNUC_PRINTF (2, 3); -gboolean moo_file_writer_printf_markup_c (MooFileWriter *writer, +gboolean moo_file_writer_printf_markup (MooFileWriter *writer, const char *fmt, ...) G_GNUC_PRINTF (2, 3); gboolean moo_file_writer_close (MooFileWriter *writer, GError **error); -#ifndef __cplusplus +const char *moo_string_writer_get_string (MooFileWriter *writer, + gsize *len); -#define moo_file_writer_printf moo_file_writer_printf_c -#define moo_file_writer_printf_markup moo_file_writer_printf_markup_c - -#endif // !__cplusplus G_END_DECLS -#ifdef __cplusplus - -template -inline bool moo_file_writer_printf (MooFileWriter *writer, const char* fmt, Args&& ...args) -{ - g::gstr s = g::gstr::printf(fmt, std::forward(args)...); - return moo_file_writer_write (writer, s); -} - -template -inline bool moo_file_writer_printf_markup (MooFileWriter *writer, - const char *fmt, - Args&&... args) -{ - g::gstr s = g::markup_printf_escaped(fmt, std::forward(args)...); - return moo_file_writer_write (writer, s); -} - -#endif // __cplusplus +#endif /* MOO_FILE_WRITER_H */ diff --git a/moo/mooutils/moofiltermgr.cpp b/moo/mooutils/moofiltermgr.c similarity index 99% rename from moo/mooutils/moofiltermgr.cpp rename to moo/mooutils/moofiltermgr.c index dfab162c..1869dfc5 100644 --- a/moo/mooutils/moofiltermgr.cpp +++ b/moo/mooutils/moofiltermgr.c @@ -1136,7 +1136,7 @@ mgr_do_save (MooFilterMgr *mgr) mgr->priv->changed = FALSE; - g_slist_foreach (user_ids, (GFunc) extern_g_free, NULL); + g_slist_foreach (user_ids, (GFunc) g_free, NULL); g_slist_free (user_ids); return FALSE; } @@ -1146,5 +1146,5 @@ static void mgr_save (MooFilterMgr *mgr) { if (!mgr->priv->save_idle_id) - mgr->priv->save_idle_id = g_idle_add ((GSourceFunc) mgr_do_save, mgr); + mgr->priv->save_idle_id = gdk_threads_add_idle ((GSourceFunc) mgr_do_save, mgr); } diff --git a/moo/mooutils/moofontsel.c b/moo/mooutils/moofontsel.c index e68a85c1..34d99729 100644 --- a/moo/mooutils/moofontsel.c +++ b/moo/mooutils/moofontsel.c @@ -257,9 +257,9 @@ list_row_activated (GtkWidget *widget) window = NULL; if (window - && widget != gtk_window_get_default_widget(window) - && !(widget == gtk_window_get_focus(window) && - (!gtk_window_get_default_widget(window) || !GTK_WIDGET_SENSITIVE(gtk_window_get_default_widget(window))))) + && widget != window->default_widget + && !(widget == window->focus_widget && + (!window->default_widget || !GTK_WIDGET_SENSITIVE (window->default_widget)))) { gtk_window_activate_default (window); } diff --git a/moo/mooutils/mooglade.cpp b/moo/mooutils/mooglade.c similarity index 99% rename from moo/mooutils/mooglade.cpp rename to moo/mooutils/mooglade.c index c0d1ce67..de49d018 100644 --- a/moo/mooutils/mooglade.cpp +++ b/moo/mooutils/mooglade.c @@ -1086,7 +1086,7 @@ widget_props_free (WidgetProps *props) if (props->custom_props) { - g_ptr_array_foreach (props->custom_props, (GFunc) extern_g_free, NULL); + g_ptr_array_foreach (props->custom_props, (GFunc) g_free, NULL); g_ptr_array_free (props->custom_props, TRUE); } @@ -1786,7 +1786,6 @@ parse_property (GParamSpec *param_spec, param_spec->value_type == G_TYPE_LONG || param_spec->value_type == G_TYPE_INT64) /* XXX */ { - errno = 0; long val = strtol (value, NULL, 0); if (errno) diff --git a/moo/mooutils/moohelp.cpp b/moo/mooutils/moohelp.c similarity index 100% rename from moo/mooutils/moohelp.cpp rename to moo/mooutils/moohelp.c diff --git a/moo/mooutils/moohistorycombo.cpp b/moo/mooutils/moohistorycombo.c similarity index 99% rename from moo/mooutils/moohistorycombo.cpp rename to moo/mooutils/moohistorycombo.c index dd2258f3..7f13ef49 100644 --- a/moo/mooutils/moohistorycombo.cpp +++ b/moo/mooutils/moohistorycombo.c @@ -448,9 +448,9 @@ moo_history_combo_changed (MooCombo *combo) if (hist_combo->priv->completion_popup_timeout_id) g_source_remove (hist_combo->priv->completion_popup_timeout_id); hist_combo->priv->completion_popup_timeout_id = - g_timeout_add (hist_combo->priv->completion_popup_timeout, - (GSourceFunc) popup, - combo); + gdk_threads_add_timeout (hist_combo->priv->completion_popup_timeout, + (GSourceFunc) popup, + combo); } else { diff --git a/moo/mooutils/moohistorylist.cpp b/moo/mooutils/moohistorylist.c similarity index 100% rename from moo/mooutils/moohistorylist.cpp rename to moo/mooutils/moohistorylist.c diff --git a/moo/mooutils/moohistorymgr.cpp b/moo/mooutils/moohistorymgr.c similarity index 99% rename from moo/mooutils/moohistorymgr.cpp rename to moo/mooutils/moohistorymgr.c index d7da013c..65768b50 100644 --- a/moo/mooutils/moohistorymgr.cpp +++ b/moo/mooutils/moohistorymgr.c @@ -20,6 +20,7 @@ #include "mooutils/moohistorymgr.h" #include "mooutils/moofileicon.h" #include "mooutils/mooapp-ipc.h" +#include "mooutils/moofilewatch.h" #include "mooutils/mooutils-misc.h" #include "mooutils/mooutils-gobject.h" #include "mooutils/mooutils-fs.h" @@ -33,8 +34,6 @@ #include #include -using namespace moo; - #define N_MENU_ITEMS 10 #define MAX_ITEM_NUMBER 5000 @@ -209,7 +208,7 @@ moo_history_mgr_dispose (GObject *object) if (mgr->priv->files) { - moo_history_item_queue_foreach (mgr->priv->files, moo_history_item_free, NULL); + moo_history_item_queue_foreach (mgr->priv->files, (MooHistoryItemListFunc) moo_history_item_free, NULL); moo_history_item_queue_free_links (mgr->priv->files); g_hash_table_destroy (mgr->priv->hash); } @@ -796,7 +795,7 @@ static void moo_history_mgr_save (MooHistoryMgr *mgr) { const char *filename; - g::gerrp error; + GError *error = NULL; MooFileWriter *writer; g_return_if_fail (MOO_IS_HISTORY_MGR (mgr)); @@ -813,7 +812,7 @@ moo_history_mgr_save (MooHistoryMgr *mgr) return; } - if ((writer = moo_config_writer_new (filename, FALSE, error))) + if ((writer = moo_config_writer_new (filename, FALSE, &error))) { GString *string; MooHistoryItemList *l; @@ -835,13 +834,14 @@ moo_history_mgr_save (MooHistoryMgr *mgr) g_string_free (string, TRUE); moo_file_writer_write (writer, "\n", -1); - moo_file_writer_close (writer, error); + moo_file_writer_close (writer, &error); } if (error) { g_critical ("could not save file '%s': %s", filename, moo_error_message (error)); + g_error_free (error); } } diff --git a/moo/mooutils/mooi18n.cpp b/moo/mooutils/mooi18n.c similarity index 100% rename from moo/mooutils/mooi18n.cpp rename to moo/mooutils/mooi18n.c diff --git a/moo/mooutils/mooi18n.h b/moo/mooutils/mooi18n.h index 3de38af6..af3ad75e 100644 --- a/moo/mooutils/mooi18n.h +++ b/moo/mooutils/mooi18n.h @@ -1,7 +1,7 @@ /* * mooi18n.h * - * Copyright (C) 2004-2016 by Yevgen Muntyan + * Copyright (C) 2004-2010 by Yevgen Muntyan * * This file is part of medit. medit is free software; you can * redistribute it and/or modify it under the terms of the @@ -13,7 +13,8 @@ * License along with medit. If not, see . */ -#pragma once +#ifndef MOO_I18N_H +#define MOO_I18N_H #include #include @@ -42,19 +43,11 @@ #undef bindtextdomain #undef bind_textdomain_codeset -// a function to make sure that g_strip_context parameters really -// point to the same char buffer -G_INLINE_FUNC const char* -_moo_strip_context (const char* s) -{ - return g_strip_context (s, s); -} - #define _(String) (String) #define N_(String) (String) -#define Q_(String) _moo_strip_context (String) +#define Q_(String) g_strip_context ((String), (String)) #define D_(String,Domain) (String) -#define QD_(String,Domain) _moo_strip_context (String) +#define QD_(String,Domain) g_strip_context ((String), (String)) #define C_(Context,String) (String) #define NC_(Context,String) (String) @@ -84,3 +77,5 @@ const char *_moo_gsv_gettext (const char *string) G_GNUC_FORMAT (1); char *_moo_gsv_dgettext (const char *domain, const char *string) G_GNUC_FORMAT (2); G_END_DECLS + +#endif /* MOO_I18N_H */ diff --git a/moo/mooutils/moomarkup.cpp b/moo/mooutils/moomarkup.c similarity index 99% rename from moo/mooutils/moomarkup.cpp rename to moo/mooutils/moomarkup.c index 2c411912..ef5ae6a1 100644 --- a/moo/mooutils/moomarkup.cpp +++ b/moo/mooutils/moomarkup.c @@ -21,7 +21,6 @@ #include #include -using namespace moo; typedef struct { MooMarkupDoc *doc; @@ -1298,7 +1297,7 @@ gboolean moo_parse_markup_file (const char *filename, const GMarkupParser *parser, gpointer data, - GError **errorp) + GError **error) { GMarkupParseContext *ctx; MooFileReader *reader; @@ -1308,9 +1307,7 @@ moo_parse_markup_file (const char *filename, g_return_val_if_fail (filename != NULL, FALSE); g_return_val_if_fail (parser != NULL, FALSE); - g_return_val_if_fail (!errorp || !*errorp, FALSE); - - gerrp error(errorp); + g_return_val_if_fail (!error || !*error, FALSE); if (!(reader = moo_text_reader_new (filename, error))) return FALSE; @@ -1328,14 +1325,14 @@ moo_parse_markup_file (const char *filename, if (!size) break; - if (!g_markup_parse_context_parse (ctx, buf, size, &error)) + if (!g_markup_parse_context_parse (ctx, buf, size, error)) { seen_error = TRUE; break; } } - if (!seen_error && !g_markup_parse_context_end_parse (ctx, &error)) + if (!seen_error && !g_markup_parse_context_end_parse (ctx, error)) seen_error = TRUE; g_markup_parse_context_free (ctx); diff --git a/moo/mooutils/moomarkup.h b/moo/mooutils/moomarkup.h index d3939554..f1e8c072 100644 --- a/moo/mooutils/moomarkup.h +++ b/moo/mooutils/moomarkup.h @@ -13,12 +13,10 @@ * License along with medit. If not, see . */ -#pragma once +#ifndef MOO_MARKUP_H +#define MOO_MARKUP_H #include -#ifdef __cplusplus -#include -#endif G_BEGIN_DECLS @@ -215,18 +213,4 @@ gboolean _moo_markup_get_modified (MooMarkupDoc *doc); G_END_DECLS -#ifdef __cplusplus - -namespace moo { - -//template<> -//class obj_ref_unref -//{ -//public: -// static void ref(MooMarkupDoc* doc) { moo_markup_doc_ref(doc); } -// static void unref(MooMarkupDoc* doc) { moo_markup_doc_unref(doc); } -//}; - -} // namespace moo - -#endif // __cplusplus +#endif /* MOO_MARKUP_H */ diff --git a/moo/mooutils/moomenu.cpp b/moo/mooutils/moomenu.c similarity index 100% rename from moo/mooutils/moomenu.cpp rename to moo/mooutils/moomenu.c diff --git a/moo/mooutils/moomenuaction.cpp b/moo/mooutils/moomenuaction.c similarity index 100% rename from moo/mooutils/moomenuaction.cpp rename to moo/mooutils/moomenuaction.c diff --git a/moo/mooutils/moomenumgr.cpp b/moo/mooutils/moomenumgr.c similarity index 100% rename from moo/mooutils/moomenumgr.cpp rename to moo/mooutils/moomenumgr.c diff --git a/moo/mooutils/moomenutoolbutton.cpp b/moo/mooutils/moomenutoolbutton.c similarity index 100% rename from moo/mooutils/moomenutoolbutton.cpp rename to moo/mooutils/moomenutoolbutton.c diff --git a/moo/mooutils/moonotebook.cpp b/moo/mooutils/moonotebook.c similarity index 98% rename from moo/mooutils/moonotebook.cpp rename to moo/mooutils/moonotebook.c index cc639ef8..d7aa2e94 100644 --- a/moo/mooutils/moonotebook.cpp +++ b/moo/mooutils/moonotebook.c @@ -144,7 +144,7 @@ G_STMT_START { \ GSList *l__; \ for (l__ = nb->priv->pages; l__ != NULL; l__ = l__->next) \ { \ - Page *page = reinterpret_cast (l__->data); \ + Page *page = l__->data; \ if (GTK_WIDGET_VISIBLE (page->child)) \ #define VISIBLE_FOREACH_END \ @@ -538,7 +538,7 @@ moo_notebook_destroy (GtkObject *object) for (l = nb->priv->pages; l != NULL; l = l->next) { - Page *page = reinterpret_cast (l->data); + Page *page = l->data; g_signal_handlers_disconnect_by_func (page->child, (gpointer) child_visible_notify, @@ -679,7 +679,7 @@ moo_notebook_finalize (GObject *object) GtkWidget * moo_notebook_new (void) { - return GTK_WIDGET (g_object_new (MOO_TYPE_NOTEBOOK, nullptr)); + return g_object_new (MOO_TYPE_NOTEBOOK, (const char*) NULL); } @@ -1062,7 +1062,7 @@ moo_notebook_realize (GtkWidget *widget) for (l = nb->priv->pages; l != NULL; l = l->next) { - Page *page = reinterpret_cast (l->data); + Page *page = l->data; gtk_widget_set_parent_window (page->label->widget, nb->priv->tab_window); } } @@ -1182,7 +1182,7 @@ moo_notebook_forall (GtkContainer *container, for (l = nb->priv->pages; l != NULL; l = l->next) { - Page *page = reinterpret_cast (l->data); + Page *page = l->data; callback (page->child, callback_data); if (include_internals && page != nb->priv->drag_page) callback (page->label->widget, callback_data); @@ -1613,7 +1613,7 @@ find_child (MooNotebook *nb, for (l = nb->priv->pages; l != NULL; l = l->next) { - Page *page = reinterpret_cast (l->data); + Page *page = l->data; if (page->child == child) return page; } @@ -1632,7 +1632,7 @@ find_grand_child (MooNotebook *nb, for (l = nb->priv->pages; l != NULL; l = l->next) { - Page *page = reinterpret_cast (l->data); + Page *page = l->data; if (page->child == child || gtk_widget_is_ancestor (child, page->child)) return page; } @@ -1649,7 +1649,7 @@ find_label (MooNotebook *nb, for (l = nb->priv->pages; l != NULL; l = l->next) { - Page *page = reinterpret_cast (l->data); + Page *page = l->data; if (page->label->widget == label) return page; } @@ -1665,7 +1665,7 @@ get_nth_page (MooNotebook *nb, if (n < 0) return NULL; else - return reinterpret_cast (g_slist_nth_data (nb->priv->pages, n)); + return g_slist_nth_data (nb->priv->pages, n); } @@ -2055,7 +2055,7 @@ labels_size_allocate (MooNotebook *nb, for (l = list; l != NULL; l = l->next) { - Page *page = reinterpret_cast (l->data); + Page *page = l->data; GtkWidget *label = page->label->widget; gtk_widget_get_child_requisition (label, &child_req); @@ -2065,7 +2065,7 @@ labels_size_allocate (MooNotebook *nb, for (l = list, width = 0; l != NULL; l = l->next) { - Page *page = reinterpret_cast (l->data); + Page *page = l->data; if (max_width != page->label->width) invalidate = TRUE; @@ -2089,7 +2089,7 @@ labels_size_allocate (MooNotebook *nb, { for (l = list, width = 0; l != NULL; l = l->next) { - Page *page = reinterpret_cast (l->data); + Page *page = l->data; GtkWidget *label = page->label->widget; int new_width; @@ -2156,7 +2156,7 @@ labels_size_allocate (MooNotebook *nb, for (l = list; l != NULL; l = l->next) { - Page *page = reinterpret_cast (l->data); + Page *page = l->data; GtkWidget *label = page->label->widget; gtk_widget_get_child_requisition (label, &child_req); @@ -2642,9 +2642,9 @@ drag_scroll_start (MooNotebook *nb, } nb->priv->drag_scroll_right = right; - nb->priv->drag_scroll_id = g_timeout_add (SCROLL_TIMEOUT, - (GSourceFunc) drag_scroll, - nb); + nb->priv->drag_scroll_id = gdk_threads_add_timeout (SCROLL_TIMEOUT, + (GSourceFunc) drag_scroll, + nb); } @@ -2871,7 +2871,7 @@ tab_drag_motion (MooNotebook *nb, Page *page; int min_width; - page = reinterpret_cast (l->data); + page = l->data; min_width = MIN (page->label->width, width); if (i == new_index) @@ -3166,17 +3166,6 @@ moo_notebook_enable_reordering (MooNotebook *notebook, /* Popup menu */ -namespace { - -struct Data -{ - MooNotebook *nb; - Page *page; - GdkEventButton *event; -}; - -} // anonymous namespace - static void popup_position_func (G_GNUC_UNUSED GtkMenu *menu, gint *x, @@ -3184,7 +3173,11 @@ popup_position_func (G_GNUC_UNUSED GtkMenu *menu, gboolean *push_in, gpointer user_data) { - Data *data = reinterpret_cast (user_data); + struct { + MooNotebook *nb; + Page *page; + GdkEventButton *event; + } *data = user_data; g_return_if_fail (data != NULL); g_return_if_fail (data->nb != NULL && data->nb->priv->tab_window != NULL); @@ -3218,7 +3211,11 @@ moo_notebook_do_popup (MooNotebook *nb, { GtkWidget *menu; gboolean dont = FALSE; - Data data; + struct { + MooNotebook *nb; + Page *page; + GdkEventButton *event; + } data; g_return_val_if_fail (page != NULL, FALSE); @@ -3347,14 +3344,14 @@ focus_to_next_label (MooNotebook *nb, if (page == g_slist_last(visible)->data) return FALSE; else - next = reinterpret_cast (g_slist_nth_data (visible, g_slist_index (visible, page) + 1)); + next = g_slist_nth_data (visible, g_slist_index (visible, page) + 1); } else { if (page == visible->data) return FALSE; else - next = reinterpret_cast (g_slist_nth_data (visible, g_slist_index (visible, page) - 1)); + next = g_slist_nth_data (visible, g_slist_index (visible, page) - 1); } g_return_val_if_fail (next != NULL, FALSE); diff --git a/moo/mooutils/moopane.cpp b/moo/mooutils/moopane.c similarity index 94% rename from moo/mooutils/moopane.cpp rename to moo/mooutils/moopane.c index 7e75cea9..ff72b12e 100644 --- a/moo/mooutils/moopane.cpp +++ b/moo/mooutils/moopane.c @@ -32,14 +32,64 @@ #define SPACING_IN_BUTTON 4 #define OPEN_PANE_TIMEOUT 200 +#ifdef MOO_COMPILATION + #include "mooutils-misc.h" #include "moocompat.h" #include "moohelp.h" #include "mooutils-gobject.h" #include "mooi18n.h" -#include "moocpp/moocpp.h" -using namespace moo; +#else + +#define _(s) s + +static void +_moo_widget_set_tooltip (GtkWidget *widget, + const char *tip) +{ + static GtkTooltips *tooltips; + + g_return_if_fail (GTK_IS_WIDGET (widget)); + + if (!tooltips) + tooltips = gtk_tooltips_new (); + + if (GTK_IS_TOOL_ITEM (widget)) + gtk_tool_item_set_tooltip (GTK_TOOL_ITEM (widget), tooltips, tip, NULL); + else + gtk_tooltips_set_tip (tooltips, widget, tip, tip); +} + +void +_moo_window_set_icon_from_stock (GtkWindow *window, + const char *name) +{ + GdkPixbuf *icon; + GtkStockItem dummy; + + g_return_if_fail (GTK_IS_WINDOW (window)); + g_return_if_fail (name != NULL); + + if (gtk_stock_lookup (name, &dummy)) + { + icon = gtk_widget_render_icon (GTK_WIDGET (window), name, + GTK_ICON_SIZE_BUTTON, 0); + + if (icon) + { + gtk_window_set_icon (GTK_WINDOW (window), icon); + g_object_unref (icon); + } + } + else + { + gtk_window_set_icon_name (GTK_WINDOW (window), name); + } +} + +#endif + struct _MooPane { GtkObject base; @@ -303,10 +353,10 @@ moo_pane_set_property (GObject *object, switch (prop_id) { case PROP_LABEL: - moo_pane_set_label (pane, reinterpret_cast (g_value_get_boxed (value))); + moo_pane_set_label (pane, g_value_get_boxed (value)); break; case PROP_PARAMS: - moo_pane_set_params (pane, reinterpret_cast (g_value_get_boxed (value))); + moo_pane_set_params (pane, g_value_get_boxed (value)); break; case PROP_DETACHABLE: moo_pane_set_detachable (pane, g_value_get_boolean (value)); @@ -728,7 +778,7 @@ create_frame_widget (MooPane *pane, case MOO_PANE_POS_LEFT: gtk_table_attach (GTK_TABLE (table), separator, 0, 1, 0, 1, - GtkAttachOptions (0), GTK_FILL, 0, 0); + 0, GTK_FILL, 0, 0); gtk_table_attach (GTK_TABLE (table), vbox, 1, 2, 0, 1, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0); @@ -736,7 +786,7 @@ create_frame_widget (MooPane *pane, case MOO_PANE_POS_TOP: gtk_table_attach (GTK_TABLE (table), separator, 0, 1, 0, 1, - GtkAttachOptions (0), GTK_FILL, 0, 0); + 0, GTK_FILL, 0, 0); gtk_table_attach (GTK_TABLE (table), vbox, 0, 1, 1, 2, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0); @@ -744,7 +794,7 @@ create_frame_widget (MooPane *pane, case MOO_PANE_POS_RIGHT: gtk_table_attach (GTK_TABLE (table), separator, 1, 2, 0, 1, - GtkAttachOptions (0), GTK_FILL, 0, 0); + 0, GTK_FILL, 0, 0); gtk_table_attach (GTK_TABLE (table), vbox, 0, 1, 0, 1, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0); @@ -752,7 +802,7 @@ create_frame_widget (MooPane *pane, case MOO_PANE_POS_BOTTOM: gtk_table_attach (GTK_TABLE (table), separator, 0, 1, 1, 2, - GtkAttachOptions (0), GTK_FILL, 0, 0); + 0, GTK_FILL, 0, 0); gtk_table_attach (GTK_TABLE (table), vbox, 0, 1, 0, 1, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0); @@ -887,7 +937,7 @@ button_drag_motion (GtkWidget *button, (GSourceFunc) drag_open_pane, pane); - gdk_drag_status (context, GdkDragAction (0), time); + gdk_drag_status (context, 0, time); return TRUE; @@ -899,7 +949,7 @@ out: g_source_remove (pane->open_timeout); pane->open_timeout = 0; - gdk_drag_status (context, GdkDragAction (0), time); + gdk_drag_status (context, 0, time); return TRUE; } @@ -907,7 +957,7 @@ out: static void setup_button_dnd (MooPane *pane) { - gtk_drag_dest_set (pane->button, GtkDestDefaults (0), NULL, 0, GDK_ACTION_COPY | GDK_ACTION_MOVE); + gtk_drag_dest_set (pane->button, 0, NULL, 0, GDK_ACTION_COPY | GDK_ACTION_MOVE); g_signal_connect (pane->button, "drag-motion", G_CALLBACK (button_drag_motion), pane); g_signal_connect (pane->button, "drag-leave", @@ -1007,8 +1057,8 @@ _moo_pane_new (GtkWidget *child, g_return_val_if_fail (GTK_IS_WIDGET (child), NULL); - pane = MOO_PANE (g_object_new (MOO_TYPE_PANE, nullptr)); - pane->child = GTK_WIDGET (g_object_ref (child)); + pane = g_object_new (MOO_TYPE_PANE, (const char*) NULL); + pane->child = g_object_ref (child); gtk_widget_show (pane->child); g_object_set_data (G_OBJECT (pane->child), "moo-pane", pane); @@ -1059,8 +1109,8 @@ _moo_pane_set_parent (MooPane *pane, } else { - pane->parent = MOO_PANED (parent); - create_widgets (pane, _moo_paned_get_position (pane->parent), pane_window); + pane->parent = parent; + create_widgets (pane, _moo_paned_get_position (parent), pane_window); g_signal_connect_swapped (parent, "notify::enable-detaching", G_CALLBACK (paned_enable_detaching_notify), @@ -1107,7 +1157,7 @@ GtkWidget * _moo_pane_get_focus_child (MooPane *pane) { g_return_val_if_fail (MOO_IS_PANE (pane), NULL); - return object_ref_cast_opt (pane->focus_child); + return pane->focus_child; } GtkWidget * @@ -1248,12 +1298,12 @@ _moo_pane_update_focus_child (MooPane *pane) g_return_if_fail (MOO_IS_PANE (pane)); if (pane->focus_child) - g_object_remove_weak_pointer (G_OBJECT (pane->focus_child), &pane->focus_child); + g_object_remove_weak_pointer (pane->focus_child, &pane->focus_child); pane->focus_child = find_focus (pane->child); if (pane->focus_child) - g_object_add_weak_pointer (G_OBJECT (pane->focus_child), &pane->focus_child); + g_object_add_weak_pointer (pane->focus_child, &pane->focus_child); } @@ -1323,7 +1373,9 @@ create_pane_window (MooPane *pane) pane->window = gtk_window_new (GTK_WINDOW_TOPLEVEL); window = GTK_WINDOW (pane->window); +#ifdef MOO_COMPILATION moo_help_connect_keys (pane->window); +#endif set_pane_window_icon_and_title (pane); gtk_window_set_type_hint (GTK_WINDOW (pane->window), @@ -1403,7 +1455,7 @@ _moo_pane_detach (MooPane *pane) } if (pane->focus_child) - gtk_widget_grab_focus (GTK_WIDGET (pane->focus_child)); + gtk_widget_grab_focus (pane->focus_child); else gtk_widget_child_focus (pane->child, GTK_DIR_TAB_FORWARD); @@ -1437,10 +1489,10 @@ _moo_pane_attach (MooPane *pane) pane->params->detached = FALSE; if (pane->focus_child) - g_object_remove_weak_pointer (G_OBJECT (pane->focus_child), &pane->focus_child); + g_object_remove_weak_pointer (pane->focus_child, &pane->focus_child); pane->focus_child = find_focus (pane->child); if (pane->focus_child) - g_object_add_weak_pointer (G_OBJECT (pane->focus_child), &pane->focus_child); + g_object_add_weak_pointer (pane->focus_child, &pane->focus_child); reparent (pane->child, pane->window_child_holder, pane->child_holder); @@ -1548,8 +1600,6 @@ typedef struct { GType _moo_icon_widget_get_type (void) G_GNUC_CONST; -#define MOO_TYPE_ICON_WIDGET (_moo_icon_widget_get_type ()) -#define MOO_ICON_WIDGET(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), MOO_TYPE_ICON_WIDGET, MooIconWidget)) G_DEFINE_TYPE (MooIconWidget, _moo_icon_widget, GTK_TYPE_WIDGET) static void @@ -1699,7 +1749,7 @@ draw_arrow (GtkWidget *widget, gtk_paint_arrow (widget->style, event->window, - GtkStateType (GTK_WIDGET_STATE (widget)), + GTK_WIDGET_STATE (widget), GTK_SHADOW_IN, &event->area, widget, @@ -1773,7 +1823,7 @@ _moo_create_small_icon (MooSmallIcon icon) g_return_val_if_fail (data != NULL, NULL); - icon_widget = MOO_ICON_WIDGET (g_object_new (MOO_TYPE_ICON_WIDGET, nullptr)); + icon_widget = g_object_new (_moo_icon_widget_get_type (), (const char*) NULL); icon_widget->data = data; gtk_widget_set_size_request (GTK_WIDGET (icon_widget), 7, 7 /* magic */); @@ -1804,7 +1854,7 @@ _moo_create_arrow_icon (GtkArrowType arrow_type) g_return_val_if_reached (NULL); } - icon_widget = MOO_ICON_WIDGET (g_object_new (MOO_TYPE_ICON_WIDGET, nullptr)); + icon_widget = g_object_new (_moo_icon_widget_get_type (), (const char*) NULL); icon_widget->type = icon_type; return GTK_WIDGET (icon_widget); diff --git a/moo/mooutils/moopaned.cpp b/moo/mooutils/moopaned.c similarity index 97% rename from moo/mooutils/moopaned.cpp rename to moo/mooutils/moopaned.c index 7dc3989f..5d6730ae 100644 --- a/moo/mooutils/moopaned.cpp +++ b/moo/mooutils/moopaned.c @@ -36,9 +36,11 @@ #include #include -#include "mooutils-misc.h" -#include "moocpp/moocpp.h" -#include "moocompat.h" + +#ifdef MOO_COMPILATION +# include "mooutils-misc.h" +# include "moocompat.h" +#endif #define MIN_PANE_SIZE 10 @@ -374,7 +376,7 @@ moo_paned_init (MooPaned *paned) * http://bugzilla.gnome.org/show_bug.cgi?id=550345 */ paned->priv->forall_bottom_to_top = TRUE; - paned->priv->pane_position = MOO_PANE_POS_INVALID; + paned->priv->pane_position = -1; paned->priv->handle_window = NULL; paned->priv->pane_window = NULL; paned->priv->bin_window = NULL; @@ -453,11 +455,11 @@ moo_paned_set_property (GObject *object, switch (prop_id) { case PANED_PROP_ACTIVE_PANE: - moo_paned_open_pane (paned, MOO_PANE (g_value_get_object (value))); + moo_paned_open_pane (paned, g_value_get_object (value)); break; case PANED_PROP_PANE_POSITION: - paned->priv->pane_position = MooPanePosition (g_value_get_enum (value)); + paned->priv->pane_position = g_value_get_enum (value); break; case PANED_PROP_CLOSE_PANE_ON_CHILD_FOCUS: @@ -480,7 +482,7 @@ moo_paned_set_property (GObject *object, case PANED_PROP_ENABLE_HANDLE_DRAG: paned->priv->enable_handle_drag = g_value_get_boolean (value); if (!paned->priv->enable_handle_drag) - moo_paned_set_handle_cursor_type (paned, GDK_X_CURSOR, FALSE); + moo_paned_set_handle_cursor_type (paned, 0, FALSE); else moo_paned_set_handle_cursor_type (paned, paned->priv->handle_cursor_type, TRUE); g_object_notify (object, "enable-handle-drag"); @@ -492,9 +494,9 @@ moo_paned_set_property (GObject *object, case PANED_PROP_HANDLE_CURSOR_TYPE: if (paned->priv->enable_handle_drag) - moo_paned_set_handle_cursor_type (paned, GdkCursorType (g_value_get_enum (value)), TRUE); + moo_paned_set_handle_cursor_type (paned, g_value_get_enum (value), TRUE); else - paned->priv->handle_cursor_type = GdkCursorType (g_value_get_enum (value)); + paned->priv->handle_cursor_type = g_value_get_enum (value); break; default: @@ -558,7 +560,7 @@ moo_paned_destroy (GtkObject *object) MooPaned *paned = MOO_PANED (object); for (l = paned->priv->panes; l != NULL; l = l->next) - gtk_object_destroy (GTK_OBJECT (l->data)); + gtk_object_destroy (l->data); GTK_OBJECT_CLASS(moo_paned_parent_class)->destroy (object); @@ -582,7 +584,7 @@ moo_paned_new (MooPanePosition pane_position) MooPanePosition _moo_paned_get_position (MooPaned *paned) { - g_return_val_if_fail (MOO_IS_PANED (paned), MOO_PANE_POS_INVALID); + g_return_val_if_fail (MOO_IS_PANED (paned), 0); return paned->priv->pane_position; } @@ -1417,7 +1419,7 @@ forall_internals (MooPaned *paned, callback (paned->button_box, callback_data); for (l = paned->priv->panes; l != NULL; l = l->next) - callback (_moo_pane_get_frame (MOO_PANE (l->data)), callback_data); + callback (_moo_pane_get_frame (l->data), callback_data); } static void @@ -1572,7 +1574,7 @@ draw_handle (MooPaned *paned, else if (paned->priv->handle_prelit) state = GTK_STATE_PRELIGHT; else - state = GtkStateType (GTK_WIDGET_STATE (widget)); + state = GTK_WIDGET_STATE (widget); gtk_paint_handle (widget->style, paned->priv->handle_window, @@ -1735,7 +1737,7 @@ moo_paned_get_pane (MooPaned *paned, g_return_val_if_fail (MOO_IS_PANED (paned), NULL); g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL); - pane = reinterpret_cast (g_object_get_data (G_OBJECT (widget), "moo-pane")); + pane = g_object_get_data (G_OBJECT (widget), "moo-pane"); if (pane && _moo_pane_get_parent (pane) == paned) return pane; @@ -1753,7 +1755,7 @@ moo_paned_get_pane_num (MooPaned *paned, g_return_val_if_fail (MOO_IS_PANED (paned), -1); g_return_val_if_fail (GTK_IS_WIDGET (widget), -1); - pane = reinterpret_cast (g_object_get_data (G_OBJECT (widget), "moo-pane")); + pane = g_object_get_data (G_OBJECT (widget), "moo-pane"); if (pane) return pane_index (paned, pane); @@ -1992,9 +1994,9 @@ _moo_paned_get_button_position (MooPaned *paned, buttons = gtk_container_get_children (GTK_CONTAINER (paned->button_box)); if (index >= 0) - button = reinterpret_cast (g_list_nth_data (buttons, index)); + button = g_list_nth_data (buttons, index); if (!button && buttons) - last_button = reinterpret_cast (g_list_last (buttons)->data); + last_button = g_list_last (buttons)->data; if (button) { @@ -2089,7 +2091,7 @@ _moo_paned_get_button (MooPaned *paned, while (buttons != NULL) { gboolean in_button = FALSE; - GtkWidget *button = GTK_WIDGET (buttons->data); + GtkWidget *button = buttons->data; switch (paned->priv->pane_position) { @@ -2325,7 +2327,7 @@ moo_paned_remove_pane (MooPaned *paned, g_return_val_if_fail (MOO_IS_PANED (paned), FALSE); g_return_val_if_fail (GTK_IS_WIDGET (pane_widget), FALSE); - pane = MOO_PANE (g_object_get_data (G_OBJECT (pane_widget), "moo-pane")); + pane = g_object_get_data (G_OBJECT (pane_widget), "moo-pane"); g_return_val_if_fail (pane != NULL, FALSE); g_return_val_if_fail (g_slist_find (paned->priv->panes, pane) != NULL, FALSE); @@ -2453,7 +2455,7 @@ moo_paned_set_focus_child (GtkContainer *container, { for (l = paned->priv->panes; l != NULL; l = l->next) { - MooPane *pane = MOO_PANE (l->data); + MooPane *pane = l->data; if (widget == _moo_pane_get_frame (pane)) { @@ -2487,13 +2489,13 @@ moo_paned_set_focus_child (GtkContainer *container, if (new_focus != FOCUS_CHILD) { if (paned->priv->focus_child) - g_object_remove_weak_pointer (G_OBJECT (paned->priv->focus_child), + g_object_remove_weak_pointer (paned->priv->focus_child, &paned->priv->focus_child); paned->priv->focus_child = find_focus_child (paned); if (paned->priv->focus_child) - g_object_add_weak_pointer (G_OBJECT (paned->priv->focus_child), + g_object_add_weak_pointer (paned->priv->focus_child, &paned->priv->focus_child); } break; @@ -2924,7 +2926,7 @@ moo_paned_hide_pane_real (MooPaned *paned) { if (paned->priv->focus_child) { - gtk_widget_grab_focus (GTK_WIDGET (paned->priv->focus_child)); + gtk_widget_grab_focus (paned->priv->focus_child); } else if (!GTK_BIN(paned)->child || !gtk_widget_child_focus (GTK_BIN(paned)->child, GTK_DIR_TAB_FORWARD)) @@ -2950,7 +2952,7 @@ pane_button_toggled (GtkToggleButton *button, { MooPane *pane; - pane = MOO_PANE (g_object_get_data (G_OBJECT (button), "moo-pane")); + pane = g_object_get_data (G_OBJECT (button), "moo-pane"); g_return_if_fail (MOO_IS_PANE (pane)); if (!gtk_toggle_button_get_active (button)) @@ -2996,7 +2998,7 @@ static MooPane * get_nth_pane (MooPaned *paned, guint index_) { - return MOO_PANE (g_slist_nth_data (paned->priv->panes, index_)); + return g_slist_nth_data (paned->priv->panes, index_); } @@ -3089,7 +3091,7 @@ handle_motion (GtkWidget *widget, if (!paned->priv->handle_button_pressed) return FALSE; - pane = MOO_PANE (g_object_get_data (G_OBJECT (widget), "moo-pane")); + pane = g_object_get_data (G_OBJECT (widget), "moo-pane"); child = moo_pane_get_child (pane); g_return_val_if_fail (child != NULL, FALSE); @@ -3143,7 +3145,7 @@ handle_button_release (GtkWidget *widget, #endif paned->priv->handle_button_pressed = FALSE; - pane = MOO_PANE (g_object_get_data (G_OBJECT (widget), "moo-pane")); + pane = g_object_get_data (G_OBJECT (widget), "moo-pane"); child = moo_pane_get_child (pane); g_return_val_if_fail (child != NULL, FALSE); @@ -3170,7 +3172,7 @@ handle_expose (GtkWidget *widget, gtk_paint_handle (widget->style, widget->window, - GtkStateType (widget->state), + widget->state, GTK_SHADOW_ETCHED_IN, &event->area, widget, @@ -3241,7 +3243,7 @@ moo_pane_label_new (const char *icon_stock_id, label->window_title = g_strdup (window_title); if (pixbuf) - label->icon_pixbuf = GDK_PIXBUF (g_object_ref (pixbuf)); + label->icon_pixbuf = g_object_ref (pixbuf); return label; } @@ -3261,7 +3263,7 @@ moo_pane_label_copy (MooPaneLabel *label) copy->window_title = g_strdup (label->window_title); if (label->icon_pixbuf) - copy->icon_pixbuf = GDK_PIXBUF (g_object_ref (label->icon_pixbuf)); + copy->icon_pixbuf = g_object_ref (label->icon_pixbuf); return copy; } @@ -3381,7 +3383,7 @@ moo_pane_params_new (GdkRectangle *window_position, MooPaneParams* moo_pane_params_copy (MooPaneParams *params) { - return reinterpret_cast (g_memdup (params, sizeof *params)); + return g_memdup (params, sizeof *params); } diff --git a/moo/mooutils/moopaned.h b/moo/mooutils/moopaned.h index 87a60013..16314996 100644 --- a/moo/mooutils/moopaned.h +++ b/moo/mooutils/moopaned.h @@ -43,8 +43,7 @@ typedef struct _MooPanedClass MooPanedClass; * @MOO_PANE_POS_BOTTOM: */ typedef enum { - MOO_PANE_POS_INVALID = -1, - MOO_PANE_POS_LEFT, + MOO_PANE_POS_LEFT = 0, MOO_PANE_POS_RIGHT, MOO_PANE_POS_TOP, MOO_PANE_POS_BOTTOM diff --git a/moo/mooutils/mooprefs.cpp b/moo/mooutils/mooprefs.c similarity index 97% rename from moo/mooutils/mooprefs.cpp rename to moo/mooutils/mooprefs.c index 5df0cda7..a144ed7a 100644 --- a/moo/mooutils/mooprefs.cpp +++ b/moo/mooutils/mooprefs.c @@ -24,8 +24,6 @@ #include #include -using namespace moo; - #define MOO_PREFS_ELEMENT "moo-prefs" #define PROP_VERSION "version" #define MOO_PREFS_VERSION "1.0" @@ -290,22 +288,15 @@ moo_prefs_set_modified (gboolean modified) } -namespace { - -struct Data -{ - GSList *list; - MooPrefsKind prefs_kind; -}; - -} - static void prepend_key (const char *key, PrefsItem *item, gpointer pdata) { - Data *data = reinterpret_cast (pdata); + struct { + GSList *list; + MooPrefsKind prefs_kind; + } *data = pdata; if (data->prefs_kind == item->prefs_kind) data->list = g_slist_prepend (data->list, g_strdup (key)); @@ -316,7 +307,10 @@ moo_prefs_list_keys (MooPrefsKind prefs_kind) { PrefsStore *prefs = prefs_instance (); - Data data; + struct { + GSList *list; + MooPrefsKind prefs_kind; + } data; data.list = NULL; data.prefs_kind = prefs_kind; @@ -422,7 +416,7 @@ prefs_new_key_from_string (const char *key, if (prefs_kind == MOO_PREFS_SYS) g_value_copy (&real_val, &default_val); moo_prefs_new_key (key, value_type, &default_val, - prefs_kind == MOO_PREFS_SYS ? MOO_PREFS_RC : MooPrefsKind (prefs_kind)); + prefs_kind == MOO_PREFS_SYS ? MOO_PREFS_RC : prefs_kind); item = prefs_get_item (key); g_value_unset (&default_val); } @@ -464,7 +458,7 @@ prefs_get_item (const char *key) { PrefsStore *prefs = prefs_instance (); g_return_val_if_fail (key != NULL, NULL); - return reinterpret_cast (g_hash_table_lookup (prefs->data, key)); + return g_hash_table_lookup (prefs->data, key); } @@ -599,7 +593,7 @@ process_item (MooMarkupElement *elm, static gboolean load_file (const char *file, int prefs_kind, - g::gerrp& error) + GError **error) { MooMarkupDoc *xml; MooMarkupNode *root; @@ -627,7 +621,7 @@ load_file (const char *file, if (!g_file_test (file, G_FILE_TEST_EXISTS)) return TRUE; - xml = moo_markup_parse_file (file, &error); + xml = moo_markup_parse_file (file, error); if (!xml) return FALSE; @@ -681,11 +675,11 @@ load_file (const char *file, } -bool +gboolean moo_prefs_load (char **sys_files, const char *file_rc, const char *file_state, - g::gerrp& error) + GError **error) { moo_prefs_set_modified (FALSE); @@ -825,7 +819,7 @@ sync_xml (MooPrefsKind prefs_kind) MOO_PREFS_ELEMENT "/" PREFS_ROOT); for (i = 0; i < data.keys->len; ++i) - write_item (reinterpret_cast (data.keys->pdata[i]), root); + write_item (data.keys->pdata[i], root); } g_ptr_array_free (data.keys, TRUE); @@ -848,9 +842,9 @@ check_modified (MooPrefsKind prefs_kind) } static gboolean -save_file (const char* file, - MooPrefsKind prefs_kind, - gerrp& error) +save_file (const char *file, + MooPrefsKind prefs_kind, + GError **error) { MooMarkupDoc *xml = NULL; MooMarkupNode *node; @@ -901,10 +895,10 @@ save_file (const char* file, } -bool -moo_prefs_save (const char* file_rc, - const char* file_state, - gerrp& error) +gboolean +moo_prefs_save (const char *file_rc, + const char *file_state, + GError **error) { PrefsStore *prefs = prefs_instance (); diff --git a/moo/mooutils/mooprefs.h b/moo/mooutils/mooprefs.h index 788c9e4d..a2e460c3 100644 --- a/moo/mooutils/mooprefs.h +++ b/moo/mooutils/mooprefs.h @@ -13,21 +13,27 @@ * License along with medit. If not, see . */ -#pragma once +#ifndef MOO_PREFS_H +#define MOO_PREFS_H #include #include #include -#ifdef __cplusplus -#include -#endif + +G_BEGIN_DECLS typedef enum { MOO_PREFS_RC, MOO_PREFS_STATE } MooPrefsKind; -G_BEGIN_DECLS +gboolean moo_prefs_load (char **sys_files, + const char *file_rc, + const char *file_state, + GError **error); +gboolean moo_prefs_save (const char *file_rc, + const char *file_state, + GError **error); MooMarkupNode *moo_prefs_get_markup (MooPrefsKind prefs_kind); @@ -85,14 +91,4 @@ void moo_prefs_set_bool (const char *key, G_END_DECLS -#ifdef __cplusplus - -bool moo_prefs_load (char** sys_files, - const char* file_rc, - const char* file_state, - g::gerrp& error); -bool moo_prefs_save (const char* file_rc, - const char* file_state, - g::gerrp& error); - -#endif // __cplusplus +#endif /* MOO_PREFS_H */ diff --git a/moo/mooutils/mooprefsdialog.cpp b/moo/mooutils/mooprefsdialog.c similarity index 98% rename from moo/mooutils/mooprefsdialog.cpp rename to moo/mooutils/mooprefsdialog.c index d61b0850..cf0cfcef 100644 --- a/moo/mooutils/mooprefsdialog.cpp +++ b/moo/mooutils/mooprefsdialog.c @@ -107,7 +107,7 @@ moo_prefs_dialog_class_init (MooPrefsDialogClass *klass) prefs_dialog_signals[APPLY] = g_signal_new ("apply", G_OBJECT_CLASS_TYPE (klass), - G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, + (GSignalFlags) (G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION), G_STRUCT_OFFSET (MooPrefsDialogClass, apply), NULL, NULL, _moo_marshal_VOID__VOID, @@ -116,7 +116,7 @@ moo_prefs_dialog_class_init (MooPrefsDialogClass *klass) prefs_dialog_signals[INIT] = g_signal_new ("init", G_OBJECT_CLASS_TYPE (klass), - G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, + (GSignalFlags) (G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION), G_STRUCT_OFFSET (MooPrefsDialogClass, init), NULL, NULL, _moo_marshal_VOID__VOID, @@ -443,7 +443,7 @@ moo_prefs_dialog_apply (MooPrefsDialog *dialog) while (list) { - MooPrefsPage *page = MOO_PREFS_PAGE (list->data); + MooPrefsPage *page = list->data; if (page->auto_apply && page_initialized (page)) g_signal_emit_by_name (page, "apply"); @@ -530,7 +530,7 @@ moo_prefs_dialog_remove_page (MooPrefsDialog *dialog, g_return_if_fail (MOO_IS_PREFS_DIALOG (dialog)); g_return_if_fail (MOO_IS_PREFS_PAGE (page)); - ref = reinterpret_cast (g_object_get_data (G_OBJECT (page), "moo-prefs-dialog-row")); + ref = g_object_get_data (G_OBJECT (page), "moo-prefs-dialog-row"); g_return_if_fail (ref && gtk_tree_row_reference_valid (ref)); path = gtk_tree_row_reference_get_path (ref); diff --git a/moo/mooutils/mooprefspage.cpp b/moo/mooutils/mooprefspage.c similarity index 95% rename from moo/mooutils/mooprefspage.cpp rename to moo/mooutils/mooprefspage.c index d83dccb7..8b7a7a68 100644 --- a/moo/mooutils/mooprefspage.cpp +++ b/moo/mooutils/mooprefspage.c @@ -116,7 +116,7 @@ moo_prefs_page_class_init (MooPrefsPageClass *klass) signals[INIT] = g_signal_new ("init", G_OBJECT_CLASS_TYPE (klass), - G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, + (GSignalFlags) (G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION), G_STRUCT_OFFSET (MooPrefsPageClass, init), NULL, NULL, _moo_marshal_VOID__VOID, @@ -233,10 +233,10 @@ GtkWidget * moo_prefs_page_new (const char *label, const char *icon_stock_id) { - return GTK_WIDGET (g_object_new (MOO_TYPE_PREFS_PAGE, - "label", label, - "icon-stock-id", icon_stock_id, - nullptr)); + return g_object_new (MOO_TYPE_PREFS_PAGE, + "label", label, + "icon-stock-id", icon_stock_id, + (const char*) NULL); } @@ -310,7 +310,7 @@ static void setting_init (GtkWidget *widget) { const GValue *value; - const char *prefs_key = reinterpret_cast (g_object_get_data (G_OBJECT (widget), "moo-prefs-key")); + const char *prefs_key = g_object_get_data (G_OBJECT (widget), "moo-prefs-key"); g_return_if_fail (prefs_key != NULL); @@ -324,8 +324,8 @@ setting_init (GtkWidget *widget) static void setting_apply (GtkWidget *widget) { - const char *prefs_key = reinterpret_cast (g_object_get_data (G_OBJECT (widget), "moo-prefs-key")); - GtkWidget *set_or_not = reinterpret_cast (g_object_get_data (G_OBJECT (widget), "moo-prefs-set-or-not")); + const char *prefs_key = g_object_get_data (G_OBJECT (widget), "moo-prefs-key"); + GtkWidget *set_or_not = g_object_get_data (G_OBJECT (widget), "moo-prefs-set-or-not"); GValue value; GType type; diff --git a/moo/mooutils/moospawn.cpp b/moo/mooutils/moospawn.c similarity index 95% rename from moo/mooutils/moospawn.cpp rename to moo/mooutils/moospawn.c index 8d445fb0..408db055 100644 --- a/moo/mooutils/moospawn.cpp +++ b/moo/mooutils/moospawn.c @@ -16,7 +16,6 @@ #include "mooutils/moospawn.h" #include "marshals.h" #include "mooutils/mooutils-misc.h" -#include "moocpp/moocpp.h" #include #ifndef __WIN32__ @@ -28,7 +27,6 @@ #include #endif -using namespace moo; typedef struct { MooCmd *cmd; @@ -206,7 +204,7 @@ _moo_cmd_new (const char *working_dir, g_return_val_if_fail (argv && *argv, NULL); - cmd = new_object(); + cmd = g_object_new (MOO_TYPE_CMD, (const char*) NULL); result = moo_cmd_run_command (cmd, working_dir, argv, envp, flags, cmd_flags, child_setup, @@ -353,7 +351,7 @@ command_out_or_err (MooCmd *cmd, while (lines) { - process_line (cmd, !out, reinterpret_cast (lines->data), -1); + process_line (cmd, !out, lines->data, -1); g_free (lines->data); lines = g_slist_delete_link (lines, lines); } @@ -450,17 +448,13 @@ stderr_watch_removed (MooCmd *cmd) #ifndef __WIN32__ -namespace { -struct ChildSetupData { - GSpawnChildSetupFunc child_setup; - gpointer user_data; -}; -} - static void real_child_setup (gpointer user_data) { - ChildSetupData *data = reinterpret_cast(user_data); + struct { + GSpawnChildSetupFunc child_setup; + gpointer user_data; + } *data = user_data; setpgid (0, 0); @@ -517,7 +511,10 @@ moo_cmd_run_command (MooCmd *cmd, ChildWatchData *child_watch_data; #ifndef __WIN32__ - ChildSetupData data; + struct { + GSpawnChildSetupFunc child_setup; + gpointer user_data; + } data; #endif g_return_val_if_fail (MOO_IS_CMD (cmd), FALSE); @@ -599,11 +596,11 @@ moo_cmd_run_command (MooCmd *cmd, g_io_channel_set_flags (cmd->priv->stdout_io, G_IO_FLAG_NONBLOCK, NULL); g_io_channel_set_close_on_unref (cmd->priv->stdout_io, TRUE); cmd->priv->stdout_watch = - g_io_add_watch_full (cmd->priv->stdout_io, - G_PRIORITY_DEFAULT_IDLE, - G_IO_IN | G_IO_PRI | G_IO_ERR | G_IO_HUP, - (GIOFunc) command_out, cmd, - (GDestroyNotify) stdout_watch_removed); + _moo_io_add_watch_full (cmd->priv->stdout_io, + G_PRIORITY_DEFAULT_IDLE, + G_IO_IN | G_IO_PRI | G_IO_ERR | G_IO_HUP, + (GIOFunc) command_out, cmd, + (GDestroyNotify) stdout_watch_removed); } if (errp) @@ -614,11 +611,11 @@ moo_cmd_run_command (MooCmd *cmd, g_io_channel_set_flags (cmd->priv->stderr_io, G_IO_FLAG_NONBLOCK, NULL); g_io_channel_set_close_on_unref (cmd->priv->stderr_io, TRUE); cmd->priv->stderr_watch = - g_io_add_watch_full (cmd->priv->stderr_io, - G_PRIORITY_DEFAULT_IDLE, - G_IO_IN | G_IO_PRI | G_IO_ERR | G_IO_HUP, - (GIOFunc) command_err, cmd, - (GDestroyNotify) stderr_watch_removed); + _moo_io_add_watch_full (cmd->priv->stderr_io, + G_PRIORITY_DEFAULT_IDLE, + G_IO_IN | G_IO_PRI | G_IO_ERR | G_IO_HUP, + (GIOFunc) command_err, cmd, + (GDestroyNotify) stderr_watch_removed); } return TRUE; diff --git a/moo/mooutils/moospawn.h b/moo/mooutils/moospawn.h index 12707f89..e2ee1c3f 100644 --- a/moo/mooutils/moospawn.h +++ b/moo/mooutils/moospawn.h @@ -13,12 +13,10 @@ * License along with medit. If not, see . */ -#pragma once +#ifndef MOO_SPAWN_H +#define MOO_SPAWN_H #include -#ifdef __cplusplus -#include -#endif G_BEGIN_DECLS @@ -69,7 +67,7 @@ struct _MooCmdClass #ifdef MOO_PATCHED_G_SPAWN_WIN32_HIDDEN_CONSOLE #define MOO_SPAWN_WIN32_HIDDEN_CONSOLE G_SPAWN_WIN32_HIDDEN_CONSOLE #else -#define MOO_SPAWN_WIN32_HIDDEN_CONSOLE ((GSpawnFlags)0) +#define MOO_SPAWN_WIN32_HIDDEN_CONSOLE 0 #endif GType _moo_cmd_get_type (void) G_GNUC_CONST; @@ -96,9 +94,4 @@ gboolean moo_spawn_command_line_async_with_flags (const gchar *command_li G_END_DECLS -#ifdef __cplusplus -namespace moo -{ -MOO_DEFINE_SIMPLE_GOBJ_CLASS(Cmd, g::Object, MooCmd, MOO_TYPE_CMD); -} -#endif // __cplusplus +#endif /* MOO_SPAWN_H */ diff --git a/moo/mooutils/moostock.cpp b/moo/mooutils/moostock.c similarity index 89% rename from moo/mooutils/moostock.cpp rename to moo/mooutils/moostock.c index 4858fee5..cef3fef7 100644 --- a/moo/mooutils/moostock.cpp +++ b/moo/mooutils/moostock.c @@ -26,15 +26,15 @@ static GtkStockItem stock_items[] = { - {(char*) MOO_STOCK_SAVE_NONE, (char*) N_("Save _None"), GdkModifierType(0), 0, (char*) GETTEXT_PACKAGE}, - {(char*) MOO_STOCK_SAVE_SELECTED, (char*) N_("Save _Selected"), GdkModifierType(0), 0, (char*) GETTEXT_PACKAGE}, - {(char*) MOO_STOCK_FILE_COPY, (char*) "_Copy", GdkModifierType(0), 0, (char*) "gtk20"}, - {(char*) MOO_STOCK_FILE_MOVE, (char*) N_("Move"), GdkModifierType(0), 0, (char*) GETTEXT_PACKAGE}, - {(char*) MOO_STOCK_FILE_LINK, (char*) N_("Link"), GdkModifierType(0), 0, (char*) GETTEXT_PACKAGE}, - {(char*) MOO_STOCK_FILE_SAVE_AS, (char*) "Save _As", GdkModifierType(0), 0, (char*) "gtk20"}, - {(char*) MOO_STOCK_FILE_SAVE_COPY, (char*) N_("Save Copy"), GdkModifierType(0), 0, (char*) GETTEXT_PACKAGE}, - {(char*) MOO_STOCK_NEW_FOLDER, (char*) N_("_New Folder"), GdkModifierType(0), 0, (char*) GETTEXT_PACKAGE}, - {(char*) MOO_STOCK_NEW_WINDOW, (char*) N_("New _Window"), GdkModifierType(0), 0, (char*) GETTEXT_PACKAGE} + {(char*) MOO_STOCK_SAVE_NONE, (char*) N_("Save _None"), 0, 0, (char*) GETTEXT_PACKAGE}, + {(char*) MOO_STOCK_SAVE_SELECTED, (char*) N_("Save _Selected"), 0, 0, (char*) GETTEXT_PACKAGE}, + {(char*) MOO_STOCK_FILE_COPY, (char*) "_Copy", 0, 0, (char*) "gtk20"}, + {(char*) MOO_STOCK_FILE_MOVE, (char*) N_("Move"), 0, 0, (char*) GETTEXT_PACKAGE}, + {(char*) MOO_STOCK_FILE_LINK, (char*) N_("Link"), 0, 0, (char*) GETTEXT_PACKAGE}, + {(char*) MOO_STOCK_FILE_SAVE_AS, (char*) "Save _As", 0, 0, (char*) "gtk20"}, + {(char*) MOO_STOCK_FILE_SAVE_COPY, (char*) N_("Save Copy"), 0, 0, (char*) GETTEXT_PACKAGE}, + {(char*) MOO_STOCK_NEW_FOLDER, (char*) N_("_New Folder"), 0, 0, (char*) GETTEXT_PACKAGE}, + {(char*) MOO_STOCK_NEW_WINDOW, (char*) N_("New _Window"), 0, 0, (char*) GETTEXT_PACKAGE} }; diff --git a/moo/mooutils/moouixml.cpp b/moo/mooutils/moouixml.c similarity index 96% rename from moo/mooutils/moouixml.cpp rename to moo/mooutils/moouixml.c index 58b03c8d..ad74e250 100644 --- a/moo/mooutils/moouixml.cpp +++ b/moo/mooutils/moouixml.c @@ -37,8 +37,6 @@ #include #include -#include "moocpp/moocpp.h" -using namespace moo; #define REPORT_UNKNOWN_ACTIONS 0 @@ -256,7 +254,7 @@ node_new (NodeType type, const char *name) break; } - node = reinterpret_cast (g_malloc0 (size)); + node = g_malloc0 (size); node->type = type; node->name = name ? g_strdup (name) : g_strdup (""); return node; @@ -274,7 +272,7 @@ moo_ui_xml_init (MooUiXml *xml) MooUiXml* moo_ui_xml_new (void) { - return new_object(); + return g_object_new (MOO_TYPE_UI_XML, (const char*) NULL); } @@ -691,7 +689,7 @@ placeholder_check (Node *node) SLIST_FOREACH (node->children, l) { - Node *child = reinterpret_cast (l->data); + Node *child = l->data; switch (child->type) { @@ -723,7 +721,7 @@ item_check (Node *node) SLIST_FOREACH (node->children, l) { - Node *child = reinterpret_cast (l->data); + Node *child = l->data; switch (child->type) { @@ -755,7 +753,7 @@ widget_check (Node *node) SLIST_FOREACH (node->children, l) { - Node *child = reinterpret_cast (l->data); + Node *child = l->data; switch (child->type) { @@ -787,7 +785,7 @@ container_check (Node *node) SLIST_FOREACH (node->children, l) { - Node *child = reinterpret_cast (l->data); + Node *child = l->data; switch (child->type) { @@ -886,7 +884,7 @@ lookup_merge (MooUiXml *xml, for (l = xml->priv->merged_ui; l != NULL; l = l->next) { - Merge *merge = reinterpret_cast (l->data); + Merge *merge = l->data; if (merge->id == merge_id) return merge; } @@ -1283,7 +1281,7 @@ moo_ui_xml_remove_ui (MooUiXml *xml, nodes = g_slist_copy (merge->nodes); while (nodes) { - moo_ui_xml_remove_node (xml, reinterpret_cast (nodes->data)); + moo_ui_xml_remove_node (xml, nodes->data); nodes = g_slist_delete_link (nodes, nodes); } @@ -1308,12 +1306,12 @@ moo_ui_xml_remove_node (MooUiXml *xml, SLIST_FOREACH (xml->priv->merged_ui, l) { - Merge *merge = reinterpret_cast (l->data); + Merge *merge = l->data; GSList *merge_nodes = g_slist_copy (merge->nodes); SLIST_FOREACH (merge_nodes, n) { - Node *merge_node = reinterpret_cast (n->data); + Node *merge_node = n->data; if (node_is_ancestor (merge_node, node)) merge_remove_node (merge, merge_node); } @@ -1334,7 +1332,7 @@ moo_ui_xml_remove_node (MooUiXml *xml, SLIST_FOREACH (xml->priv->toplevels, l) { - Toplevel *toplevel = reinterpret_cast (l->data); + Toplevel *toplevel = l->data; if (node_is_ancestor (parent, toplevel->node)) check_separators (parent, toplevel); } @@ -1353,7 +1351,7 @@ merge_add_node (Merge *merge, SLIST_FOREACH (merge->nodes, l) { - Node *node = reinterpret_cast (l->data); + Node *node = l->data; if (node_is_ancestor (added, node)) return; @@ -1409,20 +1407,15 @@ moo_ui_xml_find_node (MooUiXml *xml, return node; } -namespace { - -struct Data { - Node *found; - const char *name; -}; - -} // anonymous namespace static gboolean find_placeholder_func (Node *node, gpointer user_data) { - Data *data = reinterpret_cast (user_data); + struct { + Node *found; + const char *name; + } *data = user_data; if (node->type != PLACEHOLDER) return FALSE; @@ -1446,7 +1439,10 @@ MooUiNode* moo_ui_xml_find_placeholder (MooUiXml *xml, const char *name) { - Data data; + struct { + Node *found; + const char *name; + } data; g_return_val_if_fail (MOO_IS_UI_XML (xml), NULL); g_return_val_if_fail (name != NULL, NULL); @@ -1514,7 +1510,7 @@ moo_ui_node_get_child (MooUiNode *node, SLIST_FOREACH (node->children, l) { - child = reinterpret_cast (l->data); + child = l->data; if (!strcmp (child->name, *p)) break; else @@ -1596,13 +1592,13 @@ visibility_notify (GtkWidget *widget, g_return_if_fail (GTK_IS_WIDGET (widget)); g_return_if_fail (MOO_IS_UI_XML (xml)); - toplevel = reinterpret_cast (g_object_get_qdata (G_OBJECT (widget), TOPLEVEL_QUARK)); + toplevel = g_object_get_qdata (G_OBJECT (widget), TOPLEVEL_QUARK); g_return_if_fail (toplevel != NULL); if (toplevel->in_creation) return; - node = reinterpret_cast (g_object_get_qdata (G_OBJECT (widget), NODE_QUARK)); + node = g_object_get_qdata (G_OBJECT (widget), NODE_QUARK); g_return_if_fail (node != NULL && node->parent != NULL); g_return_if_fail (node->type == ITEM); @@ -1638,11 +1634,11 @@ xml_remove_widget (MooUiXml *xml, g_return_if_fail (GTK_IS_WIDGET (widget)); g_return_if_fail (MOO_IS_UI_XML (xml)); - toplevel = reinterpret_cast (g_object_get_qdata (G_OBJECT (widget), TOPLEVEL_QUARK)); + toplevel = g_object_get_qdata (G_OBJECT (widget), TOPLEVEL_QUARK); g_return_if_fail (toplevel != NULL); g_return_if_fail (toplevel->widget != widget); - node = reinterpret_cast (g_object_get_qdata (G_OBJECT (widget), NODE_QUARK)); + node = g_object_get_qdata (G_OBJECT (widget), NODE_QUARK); g_hash_table_remove (toplevel->children, node); g_object_set_qdata (G_OBJECT (widget), NODE_QUARK, NULL); @@ -1696,7 +1692,7 @@ toplevel_destroyed (GtkWidget *widget, g_return_if_fail (GTK_IS_WIDGET (widget)); g_return_if_fail (MOO_IS_UI_XML (xml)); - toplevel = reinterpret_cast (g_object_get_qdata (G_OBJECT (widget), TOPLEVEL_QUARK)); + toplevel = g_object_get_qdata (G_OBJECT (widget), TOPLEVEL_QUARK); g_return_if_fail (toplevel != NULL); g_return_if_fail (toplevel->widget == widget); @@ -1761,7 +1757,7 @@ static gboolean node_is_empty (Node *node) { SLIST_FOREACH (node->children, l) { - Node *child = reinterpret_cast (l->data); + Node *child = l->data; if (child->type == SEPARATOR) return FALSE; @@ -1879,7 +1875,7 @@ node_list_children (Node *parent) for (l = parent->children; l != NULL; l = l->next) { GSList *tmp, *t; - Node *node = reinterpret_cast (l->data); + Node *node = l->data; switch (node->type) { @@ -1901,23 +1897,17 @@ node_list_children (Node *parent) return g_slist_reverse (list); } -namespace { - -struct ForeachData -{ - NodeForeachFunc func; - gpointer func_data; - gboolean stop; -}; - -} // anonymous namespace static void real_foreach (Node *node, gpointer data) { GSList *l; - ForeachData *foreach_data = reinterpret_cast (data); + struct { + NodeForeachFunc func; + gpointer func_data; + gboolean stop; + } *foreach_data = data; if (foreach_data->stop) return; @@ -1930,7 +1920,7 @@ real_foreach (Node *node, for (l = node->children; l != NULL; l = l->next) { - Node *child = reinterpret_cast (l->data); + Node *child = l->data; real_foreach (child, data); @@ -1944,7 +1934,11 @@ node_foreach (Node *node, NodeForeachFunc func, gpointer data) { - ForeachData foreach_data; + struct { + NodeForeachFunc func; + gpointer func_data; + gboolean stop; + } foreach_data; g_return_if_fail (node != NULL); g_return_if_fail (func != NULL); @@ -1960,7 +1954,7 @@ static GtkWidget* toplevel_get_widget (Toplevel *toplevel, Node *node) { - return object_cast_opt (g_hash_table_lookup (toplevel->children, node)); + return g_hash_table_lookup (toplevel->children, node); } @@ -1976,7 +1970,7 @@ check_empty (Node *parent, for (l = children; l != NULL; l = l->next) { - Node *node = reinterpret_cast (l->data); + Node *node = l->data; if (node->type == MOO_UI_NODE_ITEM) { @@ -2017,7 +2011,7 @@ check_separators (Node *parent, for (l = children; l != NULL; l = l->next) { - Node *node = reinterpret_cast (l->data); + Node *node = l->data; switch (node->type) { @@ -2077,7 +2071,7 @@ fill_menu_shell (MooUiXml *xml, SLIST_FOREACH (children, l) { - Node *node = reinterpret_cast (l->data); + Node *node = l->data; switch (node->type) { @@ -2285,7 +2279,7 @@ fill_toolbar (MooUiXml *xml, SLIST_FOREACH (children, l) { - Node *node = reinterpret_cast (l->data); + Node *node = l->data; switch (node->type) { @@ -2343,7 +2337,7 @@ create_toolbar (MooUiXml *xml, * * Returns: (type GtkWidget*) */ -GtkWidget* +gpointer moo_ui_xml_create_widget (MooUiXml *xml, MooUiWidgetType type, const char *path, @@ -2426,7 +2420,7 @@ moo_ui_xml_get_widget (MooUiXml *xml, node = moo_ui_xml_get_node (xml, path); g_return_val_if_fail (node != NULL, NULL); - toplevel = reinterpret_cast (g_object_get_qdata (G_OBJECT (widget), TOPLEVEL_QUARK)); + toplevel = g_object_get_qdata (G_OBJECT (widget), TOPLEVEL_QUARK); g_return_val_if_fail (toplevel != NULL, NULL); return toplevel_get_widget (toplevel, node); @@ -2590,7 +2584,7 @@ toplevel_remove_node (G_GNUC_UNUSED MooUiXml *xml, g_return_if_fail (node != toplevel->node); g_return_if_fail (node_is_ancestor (node, toplevel->node)); - widget = object_cast_opt (g_hash_table_lookup (toplevel->children, node)); + widget = g_hash_table_lookup (toplevel->children, node); if (widget) gtk_widget_destroy (widget); @@ -2607,7 +2601,7 @@ update_widgets (MooUiXml *xml, case UPDATE_ADD_NODE: SLIST_FOREACH (xml->priv->toplevels, l) { - Toplevel *toplevel = reinterpret_cast (l->data); + Toplevel *toplevel = l->data; if (node_is_ancestor (node, toplevel->node)) toplevel_add_node (xml, toplevel, node); @@ -2618,7 +2612,7 @@ update_widgets (MooUiXml *xml, case UPDATE_REMOVE_NODE: SLIST_FOREACH (xml->priv->toplevels, l) { - Toplevel *toplevel = reinterpret_cast (l->data); + Toplevel *toplevel = l->data; if (node_is_ancestor (toplevel->node, node)) xml_delete_toplevel (xml, toplevel); @@ -2645,7 +2639,7 @@ moo_ui_xml_finalize (GObject *object) SLIST_FOREACH (xml->priv->toplevels, t) { - Toplevel *toplevel = reinterpret_cast (t->data); + Toplevel *toplevel = t->data; GSList *widgets = hash_table_list_values (toplevel->children); SLIST_FOREACH (widgets, w) @@ -2666,7 +2660,7 @@ moo_ui_xml_finalize (GObject *object) SLIST_FOREACH (xml->priv->merged_ui, m) { - Merge *merge = reinterpret_cast (m->data); + Merge *merge = m->data; g_slist_free (merge->nodes); g_free (merge); } diff --git a/moo/mooutils/moouixml.h b/moo/mooutils/moouixml.h index ae9c26fb..544e2e09 100644 --- a/moo/mooutils/moouixml.h +++ b/moo/mooutils/moouixml.h @@ -13,13 +13,11 @@ * License along with medit. If not, see . */ -#pragma once +#ifndef MOO_UI_XML_H +#define MOO_UI_XML_H #include #include -#ifdef __cplusplus -#include -#endif G_BEGIN_DECLS @@ -127,7 +125,7 @@ char *moo_ui_node_get_path (MooUiNode *node); MooUiNode *moo_ui_node_get_child (MooUiNode *node, const char *path); -GtkWidget *moo_ui_xml_create_widget (MooUiXml *xml, +gpointer moo_ui_xml_create_widget (MooUiXml *xml, MooUiWidgetType type, const char *path, MooActionCollection *actions, @@ -186,11 +184,4 @@ void moo_ui_xml_remove_node (MooUiXml *xml, G_END_DECLS -#ifdef __cplusplus - -namespace moo -{ -MOO_DEFINE_SIMPLE_GOBJ_CLASS(UiXml, g::Object, MooUiXml, MOO_TYPE_UI_XML); -} - -#endif // __cplusplus +#endif /* MOO_UI_XML_H */ diff --git a/moo/mooutils/mooundo.cpp b/moo/mooutils/mooundo.c similarity index 95% rename from moo/mooutils/mooundo.cpp rename to moo/mooutils/mooundo.c index 8d6d9768..8431a6d0 100644 --- a/moo/mooutils/mooundo.cpp +++ b/moo/mooutils/mooundo.c @@ -15,7 +15,6 @@ #include "mooutils/mooundo.h" #include "marshals.h" -#include "moocpp/moocpp.h" #include @@ -165,9 +164,9 @@ moo_undo_stack_init (G_GNUC_UNUSED MooUndoStack *stack) MooUndoStack* moo_undo_stack_new (gpointer document) { - return MOO_UNDO_STACK (g_object_new (MOO_TYPE_UNDO_STACK, - "document", document, - nullptr)); + return g_object_new (MOO_TYPE_UNDO_STACK, + "document", document, + (const char*) NULL); } @@ -287,7 +286,7 @@ action_group_undo (ActionGroup *group, for (l = group->actions->head; l != NULL; l = l->next) { - Wrapper *wrapper = reinterpret_cast (l->data); + Wrapper *wrapper = l->data; WRAPPER_VTABLE(wrapper)->undo (wrapper->action, stack->document); } } @@ -301,7 +300,7 @@ action_group_redo (ActionGroup *group, for (l = group->actions->tail; l != NULL; l = l->prev) { - Wrapper *wrapper = reinterpret_cast (l->data); + Wrapper *wrapper = l->data; WRAPPER_VTABLE(wrapper)->redo (wrapper->action, stack->document); } } @@ -319,7 +318,7 @@ moo_undo_stack_undo_real (MooUndoStack *stack) stack->frozen++; link = stack->undo_stack; - group = reinterpret_cast (link->data); + group = link->data; stack->undo_stack = g_slist_delete_link (stack->undo_stack, link); notify_redo = stack->redo_stack == NULL; stack->redo_stack = g_slist_prepend (stack->redo_stack, group); @@ -352,7 +351,7 @@ moo_undo_stack_redo_real (MooUndoStack *stack) stack->frozen++; link = stack->redo_stack; - group = reinterpret_cast (link->data); + group = link->data; stack->redo_stack = g_slist_delete_link (stack->redo_stack, link); notify_undo = stack->undo_stack == NULL; stack->undo_stack = g_slist_prepend (stack->undo_stack, group); @@ -461,7 +460,7 @@ action_group_merge (ActionGroup *group, { Wrapper *old; - old = group->actions->head ? reinterpret_cast (group->actions->head->data) : nullptr; + old = group->actions->head ? group->actions->head->data : NULL; if (!old || old->type != type) return FALSE; @@ -521,12 +520,12 @@ moo_undo_stack_add_action (MooUndoStack *stack, } else if (stack->do_continue) { - group = reinterpret_cast (stack->undo_stack->data); + group = stack->undo_stack->data; action_group_add (group, type, action, TRUE, stack->document); } else { - group = reinterpret_cast (stack->undo_stack->data); + group = stack->undo_stack->data; if (!action_group_merge (group, type, action, stack->document)) { diff --git a/moo/mooutils/mooundo2.cpp b/moo/mooutils/mooundo2.cpp deleted file mode 100644 index 52869629..00000000 --- a/moo/mooutils/mooundo2.cpp +++ /dev/null @@ -1,391 +0,0 @@ -/* - * mooundo2.cpp - * - * Copyright (C) 2004-2016 by Yevgen Muntyan - * - * This file is part of medit. medit 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. - * - * You should have received a copy of the GNU Lesser General Public - * License along with medit. If not, see . - */ - -#include "mooutils/mooundo2.h" -#include "moocpp/moocpp.h" - -using namespace moo; - -namespace { - -using Action = MooUndoAction; -using ActionPtr = std::unique_ptr; - -class Entry; -class ActionEntry; -class GroupEntry; -using EntryPtr = std::unique_ptr; -using ActionEntryPtr = std::unique_ptr; -using GroupEntryPtr = std::unique_ptr; - -class Entry -{ -public: - virtual ~Entry() = default; - - virtual void undo() = 0; - virtual void redo() = 0; - - virtual bool is_empty() const = 0; -}; - -class ActionEntry : public Entry -{ -public: - ActionEntry(ActionPtr&& action) - : m_action(move(action)) - { - } - - void undo() override - { - g_return_if_fail(m_action != nullptr); - m_action->undo(); - } - - void redo() override - { - g_return_if_fail(m_action != nullptr); - m_action->redo(); - } - - bool is_empty() const override { return false; } - - MOO_DISABLE_COPY_OPS(ActionEntry); - -private: - ActionPtr m_action; -}; - -class GroupEntry : public Entry -{ -public: - GroupEntry(GroupEntry* parent, bool user) - : m_parent(parent) - , m_user(user) - , m_status_change(false) - { - } - - void undo() override - { - for (auto itr = m_entries.rbegin(); itr != m_entries.rend(); ++itr) - (*itr)->undo(); - } - - void redo() override - { - for (auto itr = m_entries.begin(); itr != m_entries.end(); ++itr) - (*itr)->redo(); - } - - GroupEntry* get_parent() const { return m_parent; } - - bool is_empty() const override - { - return std::all_of(m_entries.begin(), m_entries.end(), [] (const EntryPtr& e) { return e->is_empty(); }); - } - - bool merge_action(ActionPtr& action) - { - // zzz - return false; - } - - GroupEntry& add_group() - { - GroupEntryPtr ep = std::make_unique(this, false); - GroupEntry& ret = *ep; - m_entries.push_back(move(ep)); - return ret; - } - - void add_action(MooUndoActionPtr&& action) - { - g_return_if_fail(action); - m_entries.push_back(std::make_unique(move(action))); - } - - void set_status_change(bool value) { m_status_change = value; } - bool is_status_change() const { return m_status_change; } - - MOO_DISABLE_COPY_OPS(GroupEntry); - -private: - GroupEntry* m_parent; - std::vector m_entries; - bool m_user; - bool m_status_change; -}; - -} // anonymous namespace - -struct MooUndoManager::Private -{ - Private() - { - stack.reserve(50); - } - - Private(const Private&) = delete; - Private& operator=(const Private&) = delete; - - void clear_redo() { if (redo_idx < stack.size()) stack.resize(redo_idx); } - void clear_merge_candidate() { merge_candidate = nullptr; } - - bool in_undo_redo = false; - - // Undo manager is enabled by default, but it can be temporarily (or permanently) disabled, - // and disable/enable calls may be nested. - unsigned disable_count = 0; - - // Sequence of all actions, from earliest to latest. When undo is performed, the sequence - // does not change, but redo_idx points to the action which has just been undone, and redo - // similarly moves the redo_idx pointer forward. - std::vector stack; - size_t redo_idx = 0; - - // When begin_group() is called, a new group is created and pushed onto the current - // group stack (virtual, implemented as the sequence of group->parent pointers), - // and current_group is set to point to that new group. When end_group() is called, - // the group is closed, and current_group is set to its parent (which will be null - // for the top-level group). - GroupEntry* current_group; - - // When a character is typed or deleted, a group containing the simple edit action is - // pushed onto the stack, and merge_candidate is set to point to it. When another action - // is performed, if merge_candidate is not null, we will try to merge that action with the - // group pointed to by the merge_candidate. merge_candidate is set to null whenever something - // non-trivial happens, like undo/redo, begin/end group, etc. - GroupEntry* merge_candidate = nullptr; - - bool is_text_modified = false; -}; - - -MooUndoGroup::MooUndoGroup(MooUndoManager& mgr, bool user) - : m_mgr(mgr) -{ - mgr.begin_group(user); -} - -MooUndoGroup::~MooUndoGroup() -{ - m_mgr.end_group(); -} - - -MooDisableUndo::MooDisableUndo(MooUndoManager& mgr) - : m_mgr(mgr) -{ - m_mgr.set_enabled(false); -} - -MooDisableUndo::~MooDisableUndo() -{ - m_mgr.set_enabled(true); -} - - -MooUndoManager::MooUndoManager() - : m_p(std::make_unique()) -{ -} - -bool MooUndoManager::can_undo() -{ - return is_enabled() && m_p->redo_idx > 0; -} - -bool MooUndoManager::can_redo() -{ - return is_enabled() && m_p->redo_idx < m_p->stack.size(); -} - -void MooUndoManager::undo() -{ - g_return_if_fail(!m_p->in_undo_redo); - g_return_if_fail(can_undo()); - g_return_if_fail(m_p->current_group == nullptr); - - m_p->clear_merge_candidate(); - - GroupEntry& entry = *m_p->stack[m_p->redo_idx - 1]; - - { - auto r = set_temp_value(m_p->in_undo_redo, true); - entry.undo(); - m_p->redo_idx -= 1; - } - - if (entry.is_status_change()) - { - g_assert(m_p->is_text_modified); - m_p->is_text_modified = false; - // zzz signal - } -} - -void MooUndoManager::redo() -{ - g_return_if_fail(!m_p->in_undo_redo); - g_return_if_fail(can_redo()); - g_return_if_fail(m_p->current_group == nullptr); - - m_p->clear_merge_candidate(); - - GroupEntry& entry = *m_p->stack[m_p->redo_idx]; - - { - auto r = set_temp_value(m_p->in_undo_redo, true); - entry.redo(); - m_p->redo_idx += 1; - } - - if (entry.is_status_change()) - { - g_assert(!m_p->is_text_modified); - m_p->is_text_modified = true; - // zzz signal - } -} - -void MooUndoManager::add_action(MooUndoActionPtr&& action) -{ - g_return_if_fail(!m_p->in_undo_redo); - g_return_if_fail(action != nullptr); - - if (!is_enabled()) - return; - - m_p->clear_redo(); - - if (m_p->merge_candidate) - { - g_assert(m_p->is_text_modified); - - if (m_p->merge_candidate->merge_action(action)) - return; - } - - m_p->clear_merge_candidate(); - - if (!m_p->is_text_modified) - g_assert(!m_p->current_group || m_p->current_group->is_empty()); - - if (m_p->current_group) - { - m_p->current_group->add_action(move(action)); - } - else - { - MooUndoGroup _(*this, /*user*/ true); - m_p->current_group->add_action(move(action)); - m_p->merge_candidate = m_p->current_group; - } - - if (!m_p->is_text_modified) - { - m_p->stack.back()->set_status_change(true); - m_p->is_text_modified = true; - } - - m_p->redo_idx = m_p->stack.size(); -} - -void MooUndoManager::begin_group(bool user) -{ - if (!is_enabled()) - return; - - m_p->clear_redo(); - - if (m_p->current_group) - { - g_return_if_fail(!user); - m_p->current_group = &m_p->current_group->add_group(); - } - else - { - GroupEntryPtr group = std::make_unique(nullptr, user); - m_p->current_group = group.get(); - m_p->stack.push_back(move(group)); - m_p->redo_idx = m_p->stack.size(); - } -} - -void MooUndoManager::end_group() -{ - if (!is_enabled()) - return; - - g_return_if_fail(m_p->current_group != nullptr); - - GroupEntry* cur_group = m_p->current_group; - GroupEntry* parent = cur_group->get_parent(); - - g_return_if_fail(!parent || !m_p->merge_candidate); - - if (!parent && cur_group->is_empty()) - { - g_return_if_fail(!m_p->stack.empty() && cur_group == m_p->stack.back().get()); - m_p->stack.pop_back(); - m_p->redo_idx = m_p->stack.size(); - } - - m_p->current_group = parent; -} - -void MooUndoManager::clear(bool is_modified) -{ - if (!is_enabled()) - return; - - g_return_if_fail(!m_p->in_undo_redo); - g_return_if_fail(!m_p->current_group); - - m_p->stack.clear(); - m_p->redo_idx = 0; - m_p->merge_candidate = nullptr; - m_p->is_text_modified = is_modified; -} - -void MooUndoManager::set_unmodified() -{ - m_p->is_text_modified = false; - - for (auto& ep : m_p->stack) - ep->set_status_change(false); - - if (can_redo()) - m_p->stack[m_p->redo_idx]->set_status_change(true); -} - -void MooUndoManager::set_enabled(bool enabled) -{ - g_return_if_fail(!enabled || m_p->disable_count > 0); - - clear(true); - - if (enabled) - --m_p->disable_count; - else - ++m_p->disable_count; -} - -bool MooUndoManager::is_enabled() -{ - return m_p->disable_count == 0; -} diff --git a/moo/mooutils/mooundo2.h b/moo/mooutils/mooundo2.h deleted file mode 100644 index 185522fc..00000000 --- a/moo/mooutils/mooundo2.h +++ /dev/null @@ -1,103 +0,0 @@ -/* - * mooundo2.h - * - * Copyright (C) 2004-2016 by Yevgen Muntyan - * - * This file is part of medit. medit 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. - * - * You should have received a copy of the GNU Lesser General Public - * License along with medit. If not, see . - */ - -#pragma once - -#ifndef __cplusplus -#error "This is a C++ header" -#endif - -#include "moocpp/utils.h" -#include - -class MooUndoClient; -class MooUndoManager; -class MooUndoGroup; -class MooUndoAction; - -class MooUndoClient -{ -public: -}; - -class MooUndoGroup -{ -public: - MooUndoGroup(MooUndoManager& mgr, bool user = true); - ~MooUndoGroup(); - - MOO_DISABLE_COPY_OPS(MooUndoGroup); - -private: - MooUndoManager& m_mgr; -}; - -class MooDisableUndo -{ -public: - MooDisableUndo(MooUndoManager& mgr); - ~MooDisableUndo(); - - MOO_DISABLE_COPY_OPS(MooDisableUndo); - -private: - MooUndoManager& m_mgr; -}; - -class MooUndoAction -{ -public: - virtual ~MooUndoAction() = default; - - virtual void undo() = 0; - virtual void redo() = 0; -}; - -using MooUndoActionPtr = std::unique_ptr; - -class MooUndoManager -{ -public: - MooUndoManager(); - ~MooUndoManager(); - - bool can_undo(); - bool can_redo(); - - void undo(); - void redo(); - - void add_action(MooUndoActionPtr&& action); - - void set_unmodified(); - void clear(bool is_modified); - - bool is_enabled(); - - MOO_DISABLE_COPY_OPS(MooUndoManager); - -private: - void begin_group(bool user); - void end_group(); - - void set_enabled(bool enabled); - -private: - friend class MooUndoGroup; - friend class MooDisableUndo; - - struct Private; - std::unique_ptr m_p; -}; diff --git a/moo/gpp/utils.h b/moo/mooutils/mooutils-cpp.h similarity index 90% rename from moo/gpp/utils.h rename to moo/mooutils/mooutils-cpp.h index 1bf0115a..8af8de3c 100644 --- a/moo/gpp/utils.h +++ b/moo/mooutils/mooutils-cpp.h @@ -1,5 +1,5 @@ /* - * moogpp/utils.h + * mooutils-cpp.h * * Copyright (C) 2004-2015 by Yevgen Muntyan * @@ -15,9 +15,11 @@ #pragma once -#ifndef __cplusplus -#error "This is a C++ header" -#endif +template +inline T *moo_object_ref(T *obj) +{ + return static_cast(g_object_ref(obj)); +} #define MOO_DEFINE_FLAGS(Flags) \ inline Flags operator | (Flags f1, Flags f2) { return static_cast(static_cast(f1) | f2); } \ diff --git a/moo/mooutils/mooutils-dialog-win32.cpp b/moo/mooutils/mooutils-dialog-win32.cpp deleted file mode 100644 index e73799e7..00000000 --- a/moo/mooutils/mooutils-dialog-win32.cpp +++ /dev/null @@ -1,96 +0,0 @@ -/* - * mooutils-dialog-win32.cpp - * - * Copyright (C) 2004-2016 by Yevgen Muntyan - * - * This file is part of medit. medit 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. - * - * You should have received a copy of the GNU Lesser General Public - * License along with medit. If not, see . - */ - -#include "config.h" - -#include "mooutils/mooutils-dialog-win32.h" -#include "moocpp/moocpp.h" - -#include -#include - -#include - -#include -#include -#include -#include - -using namespace moo; - -MooWinDialogHelper::MooWinDialogHelper() - : m_got_gdk_events_message(RegisterWindowMessage(L"GDK_WIN32_GOT_EVENTS")) - , m_thread_id(GetCurrentThreadId()) -{ - g_return_if_fail(!m_instance); - m_instance = this; -} - -MooWinDialogHelper::~MooWinDialogHelper() -{ - if (m_instance == this) - { - if (m_hook) - UnhookWindowsHookEx(m_hook); - - gdk_win32_set_modal_dialog_libgtk_only(nullptr); - - m_instance = nullptr; - } -} - -void MooWinDialogHelper::hookup(HWND hwnd) -{ - g_return_if_fail(this == m_instance); - g_return_if_fail(hwnd != nullptr); - - gdk_win32_set_modal_dialog_libgtk_only(hwnd); - - if (!m_hook) - { - m_hook = SetWindowsHookEx(WH_CALLWNDPROC, hook_proc, - GetModuleHandle(nullptr), - m_thread_id); - g_return_if_fail(m_hook != nullptr); - - while (gtk_events_pending()) - gtk_main_iteration(); - } -} - -LRESULT CALLBACK MooWinDialogHelper::hook_proc(int code, WPARAM wParam, LPARAM lParam) -{ - g_return_val_if_fail(m_instance != nullptr, 0); - - if (GetCurrentThreadId() != m_instance->m_thread_id) - return CallNextHookEx(m_instance->m_hook, code, wParam, lParam); - - if (m_instance->m_in_hook_proc) - return CallNextHookEx(m_instance->m_hook, code, wParam, lParam); - - raii on_exit([] () - { - m_instance->m_in_hook_proc = false; - }); - - m_instance->m_in_hook_proc = true; - - while (gtk_events_pending()) - gtk_main_iteration(); - - return CallNextHookEx(m_instance->m_hook, code, wParam, lParam); -} - -MooWinDialogHelper* MooWinDialogHelper::m_instance = nullptr; diff --git a/moo/mooutils/mooutils-dialog-win32.h b/moo/mooutils/mooutils-dialog-win32.h deleted file mode 100644 index d2227510..00000000 --- a/moo/mooutils/mooutils-dialog-win32.h +++ /dev/null @@ -1,42 +0,0 @@ -/* - * mooutils-dialog-win32.h - * - * Copyright (C) 2004-2016 by Yevgen Muntyan - * - * This file is part of medit. medit 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. - * - * You should have received a copy of the GNU Lesser General Public - * License along with medit. If not, see . - */ - -#pragma once - -#include - -class MooWinDialogHelper -{ -public: - MooWinDialogHelper(); - ~MooWinDialogHelper(); - - MooWinDialogHelper(const MooWinDialogHelper&) = delete; - MooWinDialogHelper& operator=(const MooWinDialogHelper&) = delete; - - void hookup(HWND hwnd_dialog); - -private: - static LRESULT CALLBACK hook_proc(int code, WPARAM wParam, LPARAM lParam); - -private: - HWND m_hwnd = nullptr; - bool m_set = false; - HHOOK m_hook = nullptr; - bool m_in_hook_proc = false; - DWORD m_thread_id; - UINT m_got_gdk_events_message; - static MooWinDialogHelper* m_instance; -}; diff --git a/moo/mooutils/mooutils-file.cpp b/moo/mooutils/mooutils-file.c similarity index 80% rename from moo/mooutils/mooutils-file.cpp rename to moo/mooutils/mooutils-file.c index f51c0e11..74ef9e37 100644 --- a/moo/mooutils/mooutils-file.cpp +++ b/moo/mooutils/mooutils-file.c @@ -3,14 +3,13 @@ #include "mooutils.h" #include -using namespace moo; - MOO_DEFINE_OBJECT_ARRAY_FULL (MooFileArray, moo_file_array, GFile) -gstr -moo_file_get_display_name(g::File file) +char * +moo_file_get_display_name (GFile *file) { - return file.get_parse_name(); + g_return_val_if_fail (G_IS_FILE (file), NULL); + return g_file_get_parse_name (file); } gboolean diff --git a/moo/mooutils/mooutils-file.h b/moo/mooutils/mooutils-file.h index d5c7d702..a752feb5 100644 --- a/moo/mooutils/mooutils-file.h +++ b/moo/mooutils/mooutils-file.h @@ -1,4 +1,5 @@ -#pragma once +#ifndef MOO_UTILS_FILE_H +#define MOO_UTILS_FILE_H #include #include @@ -14,15 +15,10 @@ moo_file_free (GFile *file) g_object_unref (file); } -gboolean moo_file_fnmatch (GFile* file, - const char* glob); +gboolean moo_file_fnmatch (GFile *file, + const char *glob); +char *moo_file_get_display_name (GFile *file); G_END_DECLS -#ifdef __cplusplus - -#include - -g::gstr moo_file_get_display_name (g::File& file); - -#endif // __cplusplus +#endif /* MOO_UTILS_FILE_H */ diff --git a/moo/mooutils/mooutils-fs.cpp b/moo/mooutils/mooutils-fs.c similarity index 90% rename from moo/mooutils/mooutils-fs.cpp rename to moo/mooutils/mooutils-fs.c index 15a865f4..495c2363 100644 --- a/moo/mooutils/mooutils-fs.cpp +++ b/moo/mooutils/mooutils-fs.c @@ -23,7 +23,6 @@ #include "mooutils/mootype-macros.h" #include "mooutils/mooi18n.h" #include -#include #include #include @@ -51,8 +50,6 @@ #include #endif -using namespace moo; - #define BROKEN_NAME "<" "????" ">" MOO_DEFINE_QUARK (moo-file-error-quark, _moo_file_error_quark) @@ -130,7 +127,7 @@ filename_list_to_double_null_terminated_string (GList *filenames) long len; gunichar2 *wstr; - wstr = g_utf8_to_utf16 (reinterpret_cast (filenames->data), -1, NULL, &len, NULL); + wstr = g_utf8_to_utf16 (filenames->data, -1, NULL, &len, NULL); filenames = filenames->next; if (!wstr) @@ -170,7 +167,7 @@ move_or_copy_files_ui (GList *filenames, return FALSE; } - shop.hwnd = parent && parent->window ? ((HWND) GDK_WINDOW_HWND (parent->window)) : nullptr; + shop.hwnd = parent && parent->window ? GDK_WINDOW_HWND (parent->window) : NULL; shop.wFunc = copy ? FO_COPY : FO_MOVE; shop.pFrom = from; shop.pTo = to; @@ -480,55 +477,67 @@ _moo_file_error_from_errno (mgw_errno_t code) } -static gstr -moo_filename_from_locale (const gstr& file) +char ** +moo_filenames_from_locale (char **files) { - g_return_val_if_fail (!file.empty (), gstr::null); + guint i; + char **conv; + + if (!files) + return NULL; + + conv = g_new0 (char*, g_strv_length (files) + 1); + + for (i = 0; files && *files; ++files) + { + conv[i] = moo_filename_from_locale (*files); + + if (!conv[i]) + g_warning ("could not convert '%s' to UTF8", *files); + else + ++i; + } + + return conv; +} + +char * +moo_filename_from_locale (const char *file) +{ + g_return_val_if_fail (file != NULL, NULL); #ifdef __WIN32__ - return g::locale_to_utf8 (file); + return g_locale_to_utf8 (file, -1, NULL, NULL, NULL); #else - return file; + return g_strdup (file); #endif } -gstrvec -moo_filenames_from_locale (gstrvec files) +char * +_moo_filename_to_uri (const char *file, + GError **error) { - gstrvec ret; - ret.reserve(files.size()); - - for (gstr& file: files) - { - ret.emplace_back (moo_filename_from_locale (std::move (file))); - - if (ret.back().empty()) - ret.erase (ret.end() - 1); - } - - return ret; -} - -gstr -_moo_filename_to_uri (const char* file) -{ - gstr tmp; + char *uri; + char *freeme = NULL; g_return_val_if_fail (file != NULL, NULL); if (!_moo_path_is_absolute (file)) { - gstr cd = g::get_current_dir (); - tmp = g::build_filename (cd, file); - file = tmp; + char *cd = g_get_current_dir (); + file = freeme = g_build_filename (cd, file, NULL); + g_free (cd); } - return g::filename_to_uri (file); + uri = g_filename_to_uri (file, NULL, error); + + g_free (freeme); + return uri; } #ifndef __WIN32__ -static gstr +static char * normalize_path_string (const char *path) { GPtrArray *comps; @@ -608,48 +617,49 @@ normalize_path_string (const char *path) g_strfreev ((char**) comps->pdata); g_ptr_array_free (comps, FALSE); - return gstr::wrap_new (normpath); + return normpath; } -static gstr +static char * normalize_full_path_unix (const char *path) { + guint len; + char *normpath; + g_return_val_if_fail (path != NULL, NULL); - gstr normpath = normalize_path_string (path); - g_return_val_if_fail (!normpath.empty(), NULL); + normpath = normalize_path_string (path); + g_return_val_if_fail (normpath != NULL, NULL); - guint len = strlen (normpath); + len = strlen (normpath); + g_return_val_if_fail (len > 0, normpath); - if (len > 1 && normpath[len - 1] == G_DIR_SEPARATOR) - { - char* p = normpath.get_mutable (); - p[len - 1] = 0; - } + if (len > 1 && normpath[len-1] == G_DIR_SEPARATOR) + normpath[len-1] = 0; return normpath; } #endif /* !__WIN32__ */ -static gstr -normalize_full_path_win32 (const gstr& fullpath) +static char * +normalize_full_path_win32 (const char *fullpath) { char *prefix; char *path; guint slashes; - g_return_val_if_fail (!fullpath.empty(), fullpath); + g_return_val_if_fail (fullpath && fullpath[0], g_strdup (fullpath)); - if (fullpath[1] == ':') + if (fullpath[0] && fullpath[1] == ':') { prefix = g_strndup (fullpath, 3); prefix[2] = '\\'; if (fullpath[2] == '\\') - path = g_strdup (&fullpath[3]); + path = g_strdup (fullpath + 3); else - path = g_strdup (&fullpath[2]); + path = g_strdup (fullpath + 2); } else { @@ -737,42 +747,43 @@ normalize_full_path_win32 (const gstr& fullpath) } g_free (prefix); - return gstr::wrap_new (path); + return path; } -static char* -normalize_full_path_win32_test_func (const char* fullpath) +static char * +normalize_path (const char *filename) { - return normalize_full_path_win32 (gstr::wrap_const (fullpath)).release_owned(); -} + char *freeme = NULL; + char *norm_filename; -gstr -_moo_normalize_file_path (const gstr& filename) -{ - g_return_val_if_fail (!filename.empty(), gstr::null); - - gstr tmp; - const gstr* to_normalize = &filename; + g_assert (filename && filename[0]); if (!_moo_path_is_absolute (filename)) { - gstr working_dir = g::get_current_dir (); - g_return_val_if_fail (!working_dir.empty(), filename); - tmp = g::build_filename (working_dir, filename); - to_normalize = &tmp; + char *working_dir = g_get_current_dir (); + g_return_val_if_fail (working_dir != NULL, g_strdup (filename)); + freeme = g_build_filename (working_dir, filename, NULL); + filename = freeme; + g_free (working_dir); } #ifdef __WIN32__ - return normalize_full_path_win32 (*to_normalize); + norm_filename = normalize_full_path_win32 (filename); #else - return normalize_full_path_unix (*to_normalize); + norm_filename = normalize_full_path_unix (filename); #endif + + g_free (freeme); + return norm_filename; } char * _moo_normalize_file_path (const char *filename) { - return _moo_normalize_file_path (gstr::wrap_const (filename)).release_owned (); + g_return_val_if_fail (filename != NULL, NULL); + /* empty filename is an error, but we don't want to crash here */ + g_return_val_if_fail (filename[0] != 0, g_strdup ("")); + return normalize_path (filename); } gboolean @@ -986,8 +997,7 @@ test_normalize_file_path (void) for (i = 0; i < paths->len; i += 2) { - test_normalize_path_one (reinterpret_cast (paths->pdata[i]), - reinterpret_cast (paths->pdata[i+1]), + test_normalize_path_one (paths->pdata[i], paths->pdata[i+1], _moo_normalize_file_path, "_moo_normalize_file_path"); g_free (paths->pdata[i]); @@ -1008,9 +1018,8 @@ test_normalize_file_path_win32 (void) for (i = 0; i < paths->len; i += 2) { - test_normalize_path_one (reinterpret_cast (paths->pdata[i]), - reinterpret_cast (paths->pdata[i+1]), - normalize_full_path_win32_test_func, + test_normalize_path_one (paths->pdata[i], paths->pdata[i+1], + normalize_full_path_win32, "normalize_full_path_win32"); g_free (paths->pdata[i]); g_free (paths->pdata[i+1]); @@ -1164,7 +1173,7 @@ _moo_glob_new (const char *pattern) MooGlob *gl; GRegex *re; char *re_pattern; - GRegexCompileFlags flags = GRegexCompileFlags (0); + GRegexCompileFlags flags = 0; GError *error = NULL; g_return_val_if_fail (pattern != NULL, NULL); @@ -1176,7 +1185,7 @@ _moo_glob_new (const char *pattern) if (!(re_pattern = glob_to_re (pattern))) return NULL; - re = g_regex_new (re_pattern, flags, GRegexMatchFlags (0), &error); + re = g_regex_new (re_pattern, flags, 0, &error); g_free (re_pattern); @@ -1202,7 +1211,7 @@ _moo_glob_match (MooGlob *glob, g_return_val_if_fail (filename_utf8 != NULL, FALSE); g_return_val_if_fail (g_utf8_validate (filename_utf8, -1, NULL), FALSE); - return g_regex_match (glob->re, filename_utf8, GRegexMatchFlags (0), NULL); + return g_regex_match (glob->re, filename_utf8, 0, NULL); } #endif diff --git a/moo/mooutils/mooutils-fs.h b/moo/mooutils/mooutils-fs.h index 9ca872fc..6e506519 100644 --- a/moo/mooutils/mooutils-fs.h +++ b/moo/mooutils/mooutils-fs.h @@ -18,9 +18,6 @@ #include #include -#ifdef __cplusplus -#include -#endif G_BEGIN_DECLS @@ -61,16 +58,10 @@ gboolean _moo_rename_file (const char *path, const char *new_path, GError **error); -G_END_DECLS -#ifdef __cplusplus - -g::gstrvec moo_filenames_from_locale (g::gstrvec files); - -g::gstr _moo_filename_to_uri (const char* file); -g::gstr _moo_normalize_file_path(const g::gstr& filename); - -#endif // __cplusplus -G_BEGIN_DECLS +char **moo_filenames_from_locale (char **files); +char *moo_filename_from_locale (const char *file); +char *_moo_filename_to_uri (const char *file, + GError **error); char *_moo_normalize_file_path (const char *filename); gboolean _moo_path_is_absolute (const char *path); diff --git a/moo/mooutils/mooutils-gobject.cpp b/moo/mooutils/mooutils-gobject.c similarity index 98% rename from moo/mooutils/mooutils-gobject.cpp rename to moo/mooutils/mooutils-gobject.c index f2840c0f..6c6efa4a 100644 --- a/moo/mooutils/mooutils-gobject.cpp +++ b/moo/mooutils/mooutils-gobject.c @@ -60,7 +60,7 @@ moo_gtype_lcopy_value (const GValue *value, GTypeCValue *collect_values, G_GNUC_UNUSED guint collect_flags) { - GType *ptr = reinterpret_cast (collect_values->v_pointer); + GType *ptr = collect_values->v_pointer; *ptr = _moo_value_get_gtype (value); return NULL; } @@ -99,11 +99,11 @@ _moo_gtype_get_type (void) &val_table }; - static GTypeFundamentalInfo finfo = { GTypeFundamentalFlags (0) }; + static GTypeFundamentalInfo finfo = { 0 }; type = g_type_register_fundamental (g_type_fundamental_next (), "MooGType", - &info, &finfo, GTypeFlags (0)); + &info, &finfo, 0); } return type; @@ -432,7 +432,7 @@ _moo_value_convert (const GValue *src, if (src_type == GDK_TYPE_COLOR) { char string[14]; - const GdkColor *color = reinterpret_cast (g_value_get_boxed (src)); + const GdkColor *color = g_value_get_boxed (src); if (!color) { @@ -677,8 +677,8 @@ _moo_value_equal (const GValue *a, { const GdkColor *ca, *cb; - ca = reinterpret_cast (g_value_get_boxed (a)); - cb = reinterpret_cast (g_value_get_boxed (b)); + ca = g_value_get_boxed (a); + cb = g_value_get_boxed (b); if (!ca || !cb) return ca == cb; @@ -1573,9 +1573,9 @@ watch_alloc (gsize size, g_return_val_if_fail (G_IS_OBJECT (source), NULL); g_return_val_if_fail (G_IS_OBJECT (target), NULL); - w = reinterpret_cast (g_malloc0 (size)); - w->source = _moo_object_ptr_new (G_OBJECT (source), (GWeakNotify) watch_source_died, w); - w->target = _moo_object_ptr_new (G_OBJECT (target), (GWeakNotify) watch_target_died, w); + w = g_malloc0 (size); + w->source = _moo_object_ptr_new (source, (GWeakNotify) watch_source_died, w); + w->target = _moo_object_ptr_new (target, (GWeakNotify) watch_target_died, w); w->klass = klass; w->notify = notify; w->notify_data = notify_data; @@ -1628,8 +1628,8 @@ prop_watch_new (GObject *target, g_return_val_if_fail (source_prop != NULL, NULL); g_return_val_if_fail (transform != NULL, NULL); - target_class = G_OBJECT_CLASS (g_type_class_peek (G_OBJECT_TYPE (target))); - source_class = G_OBJECT_CLASS (g_type_class_peek (G_OBJECT_TYPE (source))); + target_class = g_type_class_peek (G_OBJECT_TYPE (target)); + source_class = g_type_class_peek (G_OBJECT_TYPE (source)); source_pspec = g_object_class_find_property (source_class, source_prop); target_pspec = g_object_class_find_property (target_class, target_prop); @@ -1695,8 +1695,7 @@ _moo_add_property_watch (gpointer target, g_return_val_if_fail (source_prop != NULL, 0); g_return_val_if_fail (transform != NULL, 0); - watch = prop_watch_new (G_OBJECT (target), target_prop, - G_OBJECT (source), source_prop, + watch = prop_watch_new (target, target_prop, source, source_prop, NULL, transform, transform_data, destroy_notify, transform_data); @@ -2229,7 +2228,7 @@ _moo_data_get_value (MooData *data, g_return_val_if_fail (data != NULL, FALSE); g_return_val_if_fail (!dest || dest->g_type == 0, FALSE); - value = reinterpret_cast (g_hash_table_lookup (data->hash, key)); + value = g_hash_table_lookup (data->hash, key); if (value && dest) { @@ -2250,12 +2249,12 @@ _moo_data_get_ptr (MooData *data, g_return_val_if_fail (data != NULL, NULL); - value = reinterpret_cast (g_hash_table_lookup (data->hash, key)); + value = g_hash_table_lookup (data->hash, key); if (value) { g_return_val_if_fail (G_VALUE_TYPE (value) == MOO_TYPE_PTR, NULL); - ptr = reinterpret_cast (g_value_get_boxed (value)); + ptr = g_value_get_boxed (value); return ptr->data; } else diff --git a/moo/mooutils/mooutils-macros.h b/moo/mooutils/mooutils-macros.h index 62f3d9cf..3191dbe2 100644 --- a/moo/mooutils/mooutils-macros.h +++ b/moo/mooutils/mooutils-macros.h @@ -30,7 +30,7 @@ #if defined(MOO_CL_MSVC) #define MOO_MSVC_WARNING_PUSH __pragma(warning(push)) -#define MOO_MSVC_WARNING_POP __pragma(warning(pop)) +#define MOO_MSVC_WARNING_POP __pragma(warning(push)) #define MOO_MSVC_WARNING_DISABLE(N) __pragma(warning(disable:N)) #define MOO_MSVC_WARNING_PUSH_DISABLE(N) MOO_MSVC_WARNING_PUSH MOO_MSVC_WARNING_DISABLE(N) #else @@ -103,11 +103,34 @@ #define NORETURN MOO_NORETURN #define NOTHROW MOO_NOTHROW -#define MOO_STMT_START do +#if defined(MOO_CL_GCC) +# define MOO_VA_CLEANUP(func) __attribute__((cleanup(func))) +# define _MOO_VA_CLEANUP_DEFINED 1 +#elif defined(MOO_CL_MSVC) +# define MOO_VA_CLEANUP(func) +# undef _MOO_VA_CLEANUP_DEFINED +#else /* !MOO_CL_GCC */ +# define MOO_VA_CLEANUP(func) +# undef _MOO_VA_CLEANUP_DEFINED +#endif /* !MOO_CL_GCC */ -#define MOO_STMT_END \ - MOO_MSVC_WARNING_PUSH_DISABLE(4127) \ - while (0) \ - MOO_MSVC_WARNING_POP +#define MOO_VAR_CLEANUP_CHECK(func) +#define MOO_VAR_CLEANUP_CHECKD(func) +#undef MOO_VAR_CLEANUP_CHECK_ENABLED +#undef MOO_VAR_CLEANUP_CHECKD_ENABLED + +#if defined(_MOO_VA_CLEANUP_DEFINED) +# undef MOO_VAR_CLEANUP_CHECK +# define MOO_VAR_CLEANUP_CHECK(func) MOO_VA_CLEANUP(func) +# define MOO_VAR_CLEANUP_CHECK_ENABLED 1 +# ifdef DEBUG +# undef MOO_VAR_CLEANUP_CHECKD +# define MOO_VAR_CLEANUP_CHECKD(func) MOO_VA_CLEANUP(func) +# define MOO_VAR_CLEANUP_CHECKD_ENABLED 1 +# endif +#endif + +#define _MOO_STATIC_ASSERT_MACRO(cond) enum { MOO_CONCAT(_MooStaticAssert_, __LINE__) = 1 / ((cond) ? 1 : 0) } +#define MOO_STATIC_ASSERT(cond, message) _MOO_STATIC_ASSERT_MACRO(cond) #endif /* MOO_UTILS_MACROS_H */ diff --git a/moo/mooutils/mooutils-mem.h b/moo/mooutils/mooutils-mem.h index 1614e84e..4b89b8d5 100644 --- a/moo/mooutils/mooutils-mem.h +++ b/moo/mooutils/mooutils-mem.h @@ -63,37 +63,20 @@ G_STMT_START { \ #define MOO_IP_ARRAY_GROW(ElmType,c_,name_,howmuch_) \ G_STMT_START { \ - if (howmuch_ > 0) \ - { \ - MOO_IP_ARRAY_RESERVE_AT_LEAST(ElmType, c_, name_, \ - (c_)->n_##name_ + howmuch_); \ - memset ((c_)->name_ + (c_)->n_##name_, 0, \ - howmuch_ * sizeof *(c_)->name_); \ - (c_)->n_##name_ += howmuch_; \ - } \ -} G_STMT_END - -#define MOO_IP_ARRAY_RESERVE_EXACT(ElmType,c_,name_,size_) \ -G_STMT_START { \ - gsize new_size__ = size_; \ - if (new_size__ > (c_)->n_##name_##_allocd__) \ - { \ - (c_)->name_ = (ElmType*) g_realloc ((c_)->name_, \ - new_size__ * sizeof *(c_)->name_); \ - (c_)->n_##name_##_allocd__ = new_size__; \ - } \ -} G_STMT_END - -#define MOO_IP_ARRAY_RESERVE_AT_LEAST(ElmType,c_,name_,size_) \ -G_STMT_START { \ - if (size_ > (c_)->n_##name_##_allocd__) \ + if ((c_)->n_##name_ + howmuch_ > (c_)->n_##name_##_allocd__) \ { \ gsize old_size__ = (c_)->n_##name_##_allocd__; \ - gsize new_size__ = MAX((gsize) (old_size__ * 1.2), size_); \ + gsize new_size__ = MAX((gsize) (old_size__ * 1.2), \ + (c_)->n_##name_ + howmuch_); \ (c_)->name_ = (ElmType*) g_realloc ((c_)->name_, \ new_size__ * sizeof *(c_)->name_); \ (c_)->n_##name_##_allocd__ = new_size__; \ } \ + \ + if (howmuch_ > 0) \ + memset ((c_)->name_ + (c_)->n_##name_, 0, \ + howmuch_ * sizeof *(c_)->name_); \ + (c_)->n_##name_ += howmuch_; \ } G_STMT_END #define MOO_IP_ARRAY_REMOVE_INDEX(c_,name_,idx_) \ diff --git a/moo/mooutils/mooutils-messages.h b/moo/mooutils/mooutils-messages.h index a785c925..fa5a606c 100644 --- a/moo/mooutils/mooutils-messages.h +++ b/moo/mooutils/mooutils-messages.h @@ -1,309 +1,258 @@ -/* - * mooutils-messages.h - * - * Copyright (C) 2004-2016 by Yevgen Muntyan - * - * This file is part of medit. medit 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. - * - * You should have received a copy of the GNU Lesser General Public - * License along with medit. If not, see . - */ - -#pragma once - -#include -#include -#ifdef __cplusplus -#include -#endif -#include - -G_BEGIN_DECLS - -#undef G_STMT_START -#undef G_STMT_END -#define G_STMT_START MOO_STMT_START -#define G_STMT_END MOO_STMT_END - -#ifdef __COUNTER__ -#define _MOO_CODE_LOC_COUNTER (__COUNTER__ + 1) -#else -#define _MOO_CODE_LOC_COUNTER 0 -#endif - -#define MOO_CODE_LOC (moo_make_code_loc (__FILE__, MOO_STRFUNC, __LINE__, _MOO_CODE_LOC_COUNTER)) -#define MOO_CODE_LOC_UNKNOWN (moo_default_code_loc ()) - -#define _MOO_ASSERT_MESSAGE(msg) _moo_assert_message (MOO_CODE_LOC, msg) - -#define _MOO_ASSERT_CHECK_MSG(cond, msg) \ -MOO_STMT_START { \ - if (G_LIKELY (cond)) \ - ; \ - else \ - _MOO_ASSERT_MESSAGE (msg); \ -} MOO_STMT_END - -#define _MOO_ASSERT_CHECK(cond) \ - _MOO_ASSERT_CHECK_MSG(cond, \ - "condition failed: " #cond) - -#define MOO_VOID_STMT MOO_STMT_START {} MOO_STMT_END - -#define _MOO_RELEASE_ASSERT _MOO_ASSERT_CHECK -#define _MOO_RELEASE_ASSERT_NOT_REACHED() _MOO_ASSERT_MESSAGE ("should not be reached") - -#ifdef DEBUG -#define _MOO_DEBUG_ASSERT _MOO_ASSERT_CHECK -#define _MOO_DEBUG_ASSERT_NOT_REACHED() _MOO_ASSERT_MESSAGE ("should not be reached") -#define _MOO_DEBUG_SIDE_ASSERT(what) MOO_STMT_START { gboolean res__ = (what); _MOO_DEBUG_ASSERT(res__); } MOO_STMT_END -#else -#define _MOO_DEBUG_ASSERT(cond) MOO_VOID_STMT -#define _MOO_DEBUG_ASSERT_NOT_REACHED() MOO_VOID_STMT -#define _MOO_DEBUG_SIDE_ASSERT(what) MOO_VOID_STMT -#endif - -#define moo_assert _MOO_DEBUG_ASSERT -#define moo_side_assert _MOO_DEBUG_SIDE_ASSERT -#define moo_release_assert _MOO_RELEASE_ASSERT -#define moo_assert_not_reached _MOO_DEBUG_ASSERT_NOT_REACHED -#define moo_release_assert_not_reached _MOO_RELEASE_ASSERT_NOT_REACHED - -typedef struct MooCodeLoc -{ - const char *file; - const char *func; - int line; - int counter; - -#ifdef __cplusplus - - bool empty() const - { - return !file; - } - -#endif // __cplusplus -} MooCodeLoc; - -G_INLINE_FUNC MooCodeLoc -moo_default_code_loc (void) -{ - MooCodeLoc loc = { 0, 0, 0, 0 }; - return loc; -} - -G_INLINE_FUNC MooCodeLoc -moo_make_code_loc (const char *file, const char *func, int line, int counter) -{ - MooCodeLoc loc; - loc.file = file; - loc.func = func; - loc.line = line; - loc.counter = counter; - return loc; -} - -void _moo_log_c (MooCodeLoc loc, GLogLevelFlags flags, const char *format, ...) G_GNUC_PRINTF (3, 4); -void _moo_logv (MooCodeLoc loc, GLogLevelFlags flags, const char *format, va_list args) G_GNUC_PRINTF (3, 0); -void MOO_NORETURN _moo_error_c (MooCodeLoc loc, const char *format, ...) G_GNUC_PRINTF (2, 3); -void MOO_NORETURN _moo_errorv (MooCodeLoc loc, const char *format, va_list args) G_GNUC_PRINTF (2, 0); - -#ifndef __cplusplus -#define _moo_log _moo_log_c -#define _moo_error _moo_error_c -#else // __cplusplus - -G_END_DECLS - -void _moo_log_impl(MooCodeLoc loc, GLogLevelFlags flags, g::gstr message); -void MOO_NORETURN _moo_error_impl(MooCodeLoc loc, g::gstr message); - -template -inline void _moo_log (MooCodeLoc loc, GLogLevelFlags flags, const char *format, Args&& ...args) -{ - g::gstr message = g::gstr::printf(format, std::forward(args)...); - _moo_log_impl (loc, flags, std::move (message)); -} - -template -inline void MOO_NORETURN _moo_error (MooCodeLoc loc, const char *format, Args&& ...args) -{ - g::gstr message = g::gstr::printf(format, std::forward(args)...); - _moo_error_impl (loc, std::move (message)); -} - -G_BEGIN_DECLS - -#endif // __cplusplus - -void MOO_NORETURN _moo_assert_message (MooCodeLoc loc, const char *message); - -#define moo_return_val_if_fail(cond, val) \ -MOO_STMT_START { \ - if (cond) \ - { \ - } \ - else \ - { \ - moo_critical("Condition '%s' failed", #cond); \ - return val; \ - } \ -} MOO_STMT_END - -#define moo_return_if_fail(cond) moo_return_val_if_fail(cond,;) - -#define moo_return_val_if_reached(val) \ -MOO_STMT_START { \ - moo_critical("should not be reached"); \ - return val; \ -} MOO_STMT_END - -#define moo_return_if_reached() moo_return_val_if_reached(;) - -#define _moo_on_error moo_debug_break -#define _moo_on_critical moo_break_if_in_debugger -#define _moo_on_warning moo_break_if_in_debugger - -#ifdef __WIN32__ - -#define moo_break_if_in_debugger() \ - MOO_STMT_START { \ - if (IsDebuggerPresent()) \ - __debugbreak(); \ - } MOO_STMT_END - -#define moo_debug_break __debugbreak - -#else // !__WIN32__ - -#define moo_break_if_in_debugger() MOO_VOID_STMT -#define moo_debug_break() MOO_VOID_STMT - -#endif // !__WIN32__ - -#define moo_check_break_in_debugger(log_level_flags) \ - MOO_STMT_START { \ - if ((log_level_flags) & (G_LOG_LEVEL_ERROR | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION)) \ - _moo_on_error(); \ - else if ((log_level_flags) & G_LOG_LEVEL_CRITICAL) \ - _moo_on_critical(); \ - else if ((log_level_flags) & G_LOG_LEVEL_WARNING) \ - _moo_on_warning(); \ - } MOO_STMT_END - -/* - * Suppress warnings when GCC is in -pedantic mode and not -std=c99 - */ -#ifdef __GNUC__ -#pragma GCC system_header -#endif - -#if defined(G_HAVE_ISO_VARARGS) - -# define moo_error(...) MOO_STMT_START { _moo_on_error(); _moo_error (MOO_CODE_LOC, __VA_ARGS__); } MOO_STMT_END -# define moo_message(...) _moo_log (MOO_CODE_LOC, G_LOG_LEVEL_MESSAGE, __VA_ARGS__) -# define moo_critical(...) MOO_STMT_START { _moo_on_critical(); _moo_log (MOO_CODE_LOC, G_LOG_LEVEL_CRITICAL, __VA_ARGS__); } MOO_STMT_END -# define moo_warning(...) MOO_STMT_START { _moo_on_warning(); _moo_log (MOO_CODE_LOC, G_LOG_LEVEL_WARNING, __VA_ARGS__); } MOO_STMT_END -# define moo_debug(...) _moo_log (MOO_CODE_LOC, G_LOG_LEVEL_DEBUG, __VA_ARGS__) -# define moo_error_noloc(...) MOO_STMT_START { _moo_on_error(); _moo_error (MOO_CODE_LOC_UNKNOWN, __VA_ARGS__); } MOO_STMT_END -# define moo_message_noloc(...) _moo_log (MOO_CODE_LOC_UNKNOWN, G_LOG_LEVEL_MESSAGE, __VA_ARGS__) -# define moo_critical_noloc(...) MOO_STMT_START { _moo_on_critical(); _moo_log (MOO_CODE_LOC_UNKNOWN, G_LOG_LEVEL_CRITICAL, __VA_ARGS__); } MOO_STMT_END -# define moo_warning_noloc(...) MOO_STMT_START { _moo_on_warning(); _moo_log (MOO_CODE_LOC_UNKNOWN, G_LOG_LEVEL_WARNING, __VA_ARGS__); } MOO_STMT_END -# define moo_debug_noloc(...) _moo_log (MOO_CODE_LOC_UNKNOWN, G_LOG_LEVEL_DEBUG, __VA_ARGS__) - -#elif defined(G_HAVE_GNUC_VARARGS) - -# define moo_error(format...) MOO_STMT_START { _moo_on_error(); _moo_error (MOO_CODE_LOC, format); } MOO_STMT_END -# define moo_message(format...) _moo_log (MOO_CODE_LOC, G_LOG_LEVEL_MESSAGE, format) -# define moo_critical(format...) MOO_STMT_START { _moo_on_critical(); _moo_log (MOO_CODE_LOC, G_LOG_LEVEL_CRITICAL, format); } MOO_STMT_END -# define moo_warning(format...) MOO_STMT_START { _moo_on_warning(); _moo_log (MOO_CODE_LOC, G_LOG_LEVEL_WARNING, format); } MOO_STMT_END -# define moo_debug(format...) _moo_log (MOO_CODE_LOC, G_LOG_LEVEL_DEBUG, format) -# define moo_error_noloc(format...) MOO_STMT_START { _moo_on_error(); _moo_error (MOO_CODE_LOC_UNKNOWN, format); } MOO_STMT_END -# define moo_message_noloc(format...) _moo_log (MOO_CODE_LOC_UNKNOWN, G_LOG_LEVEL_MESSAGE, format) -# define moo_critical_noloc(format...) MOO_STMT_START { _moo_on_critical(); _moo_log (MOO_CODE_LOC_UNKNOWN, G_LOG_LEVEL_CRITICAL, format); } MOO_STMT_END -# define moo_warning_noloc(format...) MOO_STMT_START { _moo_on_warning(); _moo_log (MOO_CODE_LOC_UNKNOWN, G_LOG_LEVEL_WARNING, format); } MOO_STMT_END -# define moo_debug_noloc(format...) _moo_log (MOO_CODE_LOC_UNKNOWN, G_LOG_LEVEL_DEBUG, format) - -#else /* no varargs macros */ - -G_INLINE_FUNC void MOO_NORETURN -moo_error (const char *format, ...) G_GNUC_PRINTF (1, 2) -{ - _moo_on_error(); - va_list args; - va_start (args, format); - _moo_errorv (MOO_CODE_LOC_UNKNOWN, format, args); - // _moo_errorv does not return -} - -#define _MOO_DEFINE_LOG_FUNC(func, FUNC) \ -G_INLINE_FUNC void \ -moo_##func (const gchar *format, ...) \ -G_GNUC_PRINTF (1, 2) \ -{ \ - moo_check_break_in_debugger(G_LOG_LEVEL_##FUNC); \ - va_list args; \ - va_start (args, format); \ - _moo_logv (MOO_CODE_LOC_UNKNOWN, \ - G_LOG_LEVEL_##FUNC, \ - format, args); \ - va_end (args); \ -} - -_MOO_DEFINE_LOG_FUNC (message, MESSAGE) -_MOO_DEFINE_LOG_FUNC (warning, WARNING) -_MOO_DEFINE_LOG_FUNC (critical, CRITICAL) -_MOO_DEFINE_LOG_FUNC (debug, DEBUG) - -#undef _MOO_DEFINE_LOG_FUNC - -#define moo_error_noloc moo_error -#define moo_message_noloc moo_message -#define moo_critical_noloc moo_critical -#define moo_warning_noloc moo_warning -#define moo_debug_noloc moo_debug - -#endif /* varargs macros */ - -#undef g_critical -#undef g_error -#undef g_warning -#undef g_message -#undef g_debug -#undef g_assert -#define g_critical moo_critical -#define g_error moo_error -#define g_warning moo_warning -#define g_message moo_message -#define g_debug moo_debug -#define g_assert moo_assert - -#undef g_return_if_fail -#undef g_return_if_reached -#undef g_return_val_if_fail -#undef g_return_val_if_reached -#define g_return_if_fail moo_return_if_fail -#define g_return_val_if_fail moo_return_val_if_fail -#define g_return_if_reached moo_return_if_reached -#define g_return_val_if_reached moo_return_val_if_reached - -G_END_DECLS - -#ifdef __cplusplus - -template -inline void moo_g_log_checked (const char* domain, GLogLevelFlags flags, const char* format, Args&& ...args) -{ - static_assert(moo::printf_helper::is_valid_arg::value, "Passed an object to g_log"); - g_log (domain, flags, format, std::forward (args)...); -} - -#undef g_log -#define g_log moo_g_log_checked - -#endif // __cplusplus \ No newline at end of file +/* + * mooutils-messages.h + * + * Copyright (C) 2004-2010 by Yevgen Muntyan + * + * This file is part of medit. medit 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. + * + * You should have received a copy of the GNU Lesser General Public + * License along with medit. If not, see . + */ + +#ifndef MOO_UTILS_MESSAGES_H +#define MOO_UTILS_MESSAGES_H + +#include +#include +#include + +G_BEGIN_DECLS + +#define MOO_STMT_START \ + G_STMT_START + +#define MOO_STMT_END \ + __pragma(warning(push)) \ + __pragma(warning(disable: 4127)) \ + G_STMT_END \ + __pragma(warning(pop)) + +#ifdef __COUNTER__ +#define _MOO_CODE_LOC_COUNTER (__COUNTER__ + 1) +#else +#define _MOO_CODE_LOC_COUNTER 0 +#endif + +#define MOO_CODE_LOC (moo_make_code_loc (__FILE__, MOO_STRFUNC, __LINE__, _MOO_CODE_LOC_COUNTER)) +#define MOO_CODE_LOC_UNKNOWN (moo_default_code_loc ()) + +#define _MOO_ASSERT_MESSAGE(msg) _moo_assert_message (MOO_CODE_LOC, msg) + +#define _MOO_ASSERT_CHECK_MSG(cond, msg) \ +MOO_STMT_START { \ + if (cond) \ + ; \ + else \ + _MOO_ASSERT_MESSAGE (msg); \ +} MOO_STMT_END + +#define _MOO_ASSERT_CHECK(cond) \ + _MOO_ASSERT_CHECK_MSG(cond, \ + "condition failed: " #cond) + +#define MOO_VOID_STMT MOO_STMT_START {} MOO_STMT_END + +#define _MOO_RELEASE_ASSERT _MOO_ASSERT_CHECK +#define _MOO_RELEASE_ASSERT_NOT_REACHED() _MOO_ASSERT_MESSAGE ("should not be reached") + +#ifdef DEBUG +#define _MOO_DEBUG_ASSERT _MOO_ASSERT_CHECK +#define _MOO_DEBUG_ASSERT_NOT_REACHED() _MOO_ASSERT_MESSAGE ("should not be reached") +#define _MOO_DEBUG_SIDE_ASSERT(what) MOO_STMT_START { gboolean res__ = (what); _MOO_DEBUG_ASSERT(res__); } MOO_STMT_END +#else +#define _MOO_DEBUG_ASSERT(cond) MOO_VOID_STMT +#define _MOO_DEBUG_ASSERT_NOT_REACHED() MOO_VOID_STMT +#define _MOO_DEBUG_SIDE_ASSERT(what) MOO_VOID_STMT +#endif + +#define moo_assert _MOO_DEBUG_ASSERT +#define moo_side_assert _MOO_DEBUG_SIDE_ASSERT +#define moo_release_assert _MOO_RELEASE_ASSERT +#define moo_assert_not_reached _MOO_DEBUG_ASSERT_NOT_REACHED +#define moo_release_assert_not_reached _MOO_RELEASE_ASSERT_NOT_REACHED + +typedef struct MooCodeLoc +{ + const char *file; + const char *func; + int line; + int counter; +} MooCodeLoc; + +G_INLINE_FUNC MooCodeLoc +moo_default_code_loc (void) +{ + MooCodeLoc loc = { "", "", 0, 0 }; + return loc; +} + +G_INLINE_FUNC MooCodeLoc +moo_make_code_loc (const char *file, const char *func, int line, int counter) +{ + MooCodeLoc loc; + loc.file = file; + loc.func = func; + loc.line = line; + loc.counter = counter; + return loc; +} + +void _moo_log (MooCodeLoc loc, GLogLevelFlags flags, const char *format, ...) G_GNUC_PRINTF (3, 4); +void _moo_logv (MooCodeLoc loc, GLogLevelFlags flags, const char *format, va_list args) G_GNUC_PRINTF(3, 0); +void MOO_NORETURN _moo_error (MooCodeLoc loc, const char *format, ...) G_GNUC_PRINTF (2, 3); +void MOO_NORETURN _moo_errorv (MooCodeLoc loc, const char *format, va_list args) G_GNUC_PRINTF(2, 0); + +void MOO_NORETURN _moo_assert_message (MooCodeLoc loc, const char *message); + +void _moo_abort_debug_ignore (MooCodeLoc loc, const char *message); + +#define moo_return_val_if_fail(cond, val) \ +MOO_STMT_START { \ + if (cond) \ + { \ + } \ + else \ + { \ + moo_critical("Condition '%s' failed", #cond); \ + return val; \ + } \ +} MOO_STMT_END + +#define moo_return_if_fail(cond) moo_return_val_if_fail(cond,;) + +#define moo_return_val_if_reached(val) \ +MOO_STMT_START { \ + moo_critical("should not be reached"); \ + return val; \ +} MOO_STMT_END + +#define moo_return_if_reached() moo_return_val_if_reached(;) + + +GQuark moo_error_quark (void) G_GNUC_CONST; + +#define MOO_ERROR (moo_error_quark ()) + +enum { + MOO_ERROR_UNEXPECTED = 1 +}; + +#define moo_return_error_if_fail_val(cond, val) \ +MOO_STMT_START { \ + if (cond) \ + { \ + } \ + else \ + { \ + moo_critical("Condition '%s' failed", #cond); \ + g_set_error (error, MOO_ERROR, MOO_ERROR_UNEXPECTED,\ + "unexpected error"); \ + return val; \ + } \ +} MOO_STMT_END + +#define moo_return_error_if_fail(cond) \ + moo_return_error_if_fail_val (cond, FALSE) + +#define moo_return_error_if_fail_p(cond) \ + moo_return_error_if_fail_val (cond, NULL) + +/* + * Suppress warnings when GCC is in -pedantic mode and not -std=c99 + */ +#ifdef __GNUC__ +#pragma GCC system_header +#endif + +#if defined(G_HAVE_ISO_VARARGS) + +# define moo_error(...) _moo_error (MOO_CODE_LOC, __VA_ARGS__) +# define moo_message(...) _moo_log (MOO_CODE_LOC, G_LOG_LEVEL_MESSAGE, __VA_ARGS__) +# define moo_critical(...) _moo_log (MOO_CODE_LOC, G_LOG_LEVEL_CRITICAL, __VA_ARGS__) +# define moo_warning(...) _moo_log (MOO_CODE_LOC, G_LOG_LEVEL_WARNING, __VA_ARGS__) +# define moo_debug(...) _moo_log (MOO_CODE_LOC, G_LOG_LEVEL_DEBUG, __VA_ARGS__) +# define moo_error_noloc(...) _moo_error (MOO_CODE_LOC_UNKNOWN, __VA_ARGS__) +# define moo_message_noloc(...) _moo_log (MOO_CODE_LOC_UNKNOWN, G_LOG_LEVEL_MESSAGE, __VA_ARGS__) +# define moo_critical_noloc(...) _moo_log (MOO_CODE_LOC_UNKNOWN, G_LOG_LEVEL_CRITICAL, __VA_ARGS__) +# define moo_warning_noloc(...) _moo_log (MOO_CODE_LOC_UNKNOWN, G_LOG_LEVEL_WARNING, __VA_ARGS__) +# define moo_debug_noloc(...) _moo_log (MOO_CODE_LOC_UNKNOWN, G_LOG_LEVEL_DEBUG, __VA_ARGS__) + +#elif defined(G_HAVE_GNUC_VARARGS) + +# define moo_error(format...) _moo_error (MOO_CODE_LOC, format) +# define moo_message(format...) _moo_log (MOO_CODE_LOC, G_LOG_LEVEL_MESSAGE, format) +# define moo_critical(format...) _moo_log (MOO_CODE_LOC, G_LOG_LEVEL_CRITICAL, format) +# define moo_warning(format...) _moo_log (MOO_CODE_LOC, G_LOG_LEVEL_WARNING, format) +# define moo_debug(format...) _moo_log (MOO_CODE_LOC, G_LOG_LEVEL_DEBUG, format) +# define moo_error_noloc(format...) _moo_error (MOO_CODE_LOC_UNKNOWN, format) +# define moo_message_noloc(format...) _moo_log (MOO_CODE_LOC_UNKNOWN, G_LOG_LEVEL_MESSAGE, format) +# define moo_critical_noloc(format...) _moo_log (MOO_CODE_LOC_UNKNOWN, G_LOG_LEVEL_CRITICAL, format) +# define moo_warning_noloc(format...) _moo_log (MOO_CODE_LOC_UNKNOWN, G_LOG_LEVEL_WARNING, format) +# define moo_debug_noloc(format...) _moo_log (MOO_CODE_LOC_UNKNOWN, G_LOG_LEVEL_DEBUG, format) + +#else /* no varargs macros */ + +static void MOO_NORETURN +moo_error (const char *format, ...) G_GNUC_PRINTF (1, 2) +{ + va_list args; + va_start (args, format); + _moo_errorv (MOO_CODE_LOC_UNKNOWN, format, args); + // _moo_errorv does not return +} + +#define _MOO_DEFINE_LOG_FUNC(func, FUNC) \ +static void \ +moo_##func (const gchar *format, ...) \ +G_GNUC_PRINTF (1, 2) \ +{ \ + va_list args; \ + va_start (args, format); \ + _moo_logv (MOO_CODE_LOC_UNKNOWN, \ + G_LOG_LEVEL_##FUNC, \ + format, args); \ + va_end (args); \ +} + +_MOO_DEFINE_LOG_FUNC (message, MESSAGE) +_MOO_DEFINE_LOG_FUNC (warning, WARNING) +_MOO_DEFINE_LOG_FUNC (critical, CRITICAL) +_MOO_DEFINE_LOG_FUNC (debug, DEBUG) + +#undef _MOO_DEFINE_LOG_FUNC + +#define moo_error_noloc moo_error +#define moo_message_noloc moo_message +#define moo_critical_noloc moo_critical +#define moo_warning_noloc moo_warning +#define moo_debug_noloc moo_debug + +#endif /* varargs macros */ + +#undef g_critical +#undef g_error +#undef g_warning +#undef g_message +#undef g_debug +#define g_critical moo_critical +#define g_error moo_error +#define g_warning moo_warning +#define g_message moo_message +#define g_debug moo_debug + +#undef g_return_if_fail +#undef g_return_if_reached +#undef g_return_val_if_fail +#undef g_return_val_if_reached +#define g_return_if_fail moo_return_if_fail +#define g_return_val_if_fail moo_return_val_if_fail +#define g_return_if_reached moo_return_if_reached +#define g_return_val_if_reached moo_return_val_if_reached + +G_END_DECLS + +#endif /* MOO_UTILS_MESSAGES_H */ diff --git a/moo/mooutils/mooutils-misc.cpp b/moo/mooutils/mooutils-misc.c similarity index 75% rename from moo/mooutils/mooutils-misc.cpp rename to moo/mooutils/mooutils-misc.c index 926453f1..6b2b6db3 100644 --- a/moo/mooutils/mooutils-misc.cpp +++ b/moo/mooutils/mooutils-misc.c @@ -28,7 +28,6 @@ #include "mooutils/mootype-macros.h" #include "mooutils/mooarray.h" #include "mooutils/moologwindow-gxml.h" -#include "moocpp/moocpp.h" #include #include #ifdef HAVE_UNISTD_H @@ -54,32 +53,8 @@ #include #endif -#include -#include - -using namespace moo; - -MOO_DEFINE_QUARK(moo-error, moo_error_quark) - -static gpointer copy_pointer(gpointer p) -{ - return p; -} - -static void free_pointer(gpointer) -{ -} - -MOO_DEFINE_OBJECT_ARRAY_FULL(MooObjectArray, moo_object_array, GObject) -MOO_DEFINE_PTR_ARRAY_FULL(MooPtrArray, moo_ptr_array, void, copy_pointer, free_pointer) - -void moo_boxed_array_free(MooPtrArray* ar, GType elm_type) -{ - gsize i; - for (i = 0; i < ar->n_elms; ++i) - g_boxed_free (elm_type, ar->elms[i]); - moo_ptr_array_free (ar); -} +MOO_DEFINE_OBJECT_ARRAY_FULL (MooObjectArray, moo_object_array, GObject) +MOO_DEFINE_QUARK (moo-error, moo_error_quark) G_LOCK_DEFINE_STATIC (moo_user_data_dir); G_LOCK_DEFINE_STATIC (moo_user_cache_dir); @@ -88,25 +63,6 @@ static char *moo_display_app_name; static char *moo_user_data_dir; static char *moo_user_cache_dir; -static GThread* main_thread = nullptr; - -void -moo_thread_init () -{ -#if !GLIB_CHECK_VERSION(2,32,0) - g_thread_init (NULL); -#endif - - g_assert (main_thread == nullptr); - main_thread = g_thread_self (); -} - -gboolean -moo_is_main_thread () -{ - return main_thread == g_thread_self (); -} - #ifdef __WIN32__ static gboolean @@ -122,11 +78,12 @@ static gboolean open_uri (const char *uri, G_GNUC_UNUSED gboolean email) { - gerrp error; + GError *error = NULL; if (!gtk_show_uri (NULL, uri, gtk_get_current_event_time (), &error)) { g_warning ("Unable to show '%s': %s", uri, error->message); + g_error_free (error); return FALSE; } @@ -141,18 +98,22 @@ moo_open_email (const char *address, const char *subject, const char *body) { + GString *uri; + gboolean res; + g_return_val_if_fail (address != NULL, FALSE); - - strbuilder uri ("mailto:"); - uri.append_printf("%s%s", address, subject || body ? "?" : ""); - + uri = g_string_new ("mailto:"); + g_string_append_printf (uri, "%s%s", address, + subject || body ? "?" : ""); if (subject) - uri.append_printf ("subject=%s%s", subject, body ? "&" : ""); - + g_string_append_printf (uri, "subject=%s%s", subject, + body ? "&" : ""); if (body) - uri.append_printf ("body=%s", body); + g_string_append_printf (uri, "body=%s", body); - return open_uri (uri.get(), TRUE); + res = open_uri (uri->str, TRUE); + g_string_free (uri, TRUE); + return res; } @@ -167,12 +128,18 @@ moo_open_url (const char *url) gboolean moo_open_file (const char *path) { + char *uri; + gboolean ret; + g_return_val_if_fail (path != NULL, FALSE); - gstr uri = _moo_filename_to_uri (path); - g_return_val_if_fail (!uri.empty(), FALSE); + uri = _moo_filename_to_uri (path, NULL); + g_return_val_if_fail (uri != NULL, FALSE); - return open_uri (uri, FALSE); + ret = open_uri (uri, FALSE); + + g_free (uri); + return ret; } @@ -291,7 +258,7 @@ find_by_xid (GSList *windows, XID w) for (l = windows; l != NULL; l = l->next) if (GDK_WINDOW_XID (GTK_WIDGET(l->data)->window) == w) - return reinterpret_cast (l->data); + return l->data; return NULL; } @@ -317,7 +284,7 @@ _moo_get_top_window (GSList *windows) g_return_val_if_fail (windows != NULL, NULL); if (!windows->next) - return reinterpret_cast (windows->data); + return windows->data; for (l = windows; l != NULL; l = l->next) { @@ -421,12 +388,12 @@ _moo_window_is_hidden (GtkWindow *window) #define get_handle(w) \ - ((HWND) gdk_win32_drawable_get_handle (GTK_WIDGET(w)->window)) + gdk_win32_drawable_get_handle (GTK_WIDGET(w)->window) static gboolean _moo_window_is_hidden (GtkWindow *window) { - HWND h; + HANDLE h; WINDOWPLACEMENT info; g_return_val_if_fail (GTK_IS_WINDOW (window), FALSE); @@ -463,7 +430,7 @@ _moo_get_top_window (GSList *windows) g_return_val_if_fail (windows != NULL, NULL); if (!windows->next) - return GTK_WINDOW (windows->data); + return windows->data; for (l = windows; l != NULL; l = l->next) { @@ -660,12 +627,12 @@ moo_log_window_new (void) static MooLogWindow* moo_log_window (void) { - static MooLogWindow* log = nullptr; + static gpointer log = NULL; if (!log) { log = moo_log_window_new (); - g_object_add_weak_pointer (G_OBJECT (log->window), (void**) &log); + g_object_add_weak_pointer (G_OBJECT (((MooLogWindow*)log)->window), &log); } return log; @@ -709,221 +676,169 @@ moo_log_window_insert (MooLogWindow *log, /* Custom g_log and g_print handlers */ -class ILogWriter +static GLogFunc moo_log_func; +static GPrintFunc moo_print_func; +static GPrintFunc moo_printerr_func; +static gboolean moo_log_handlers_set; + +static void +set_print_funcs (GLogFunc log_func, + GPrintFunc print_func, + GPrintFunc printerr_func) { -public: - virtual ~ILogWriter() {} + moo_log_func = log_func; + moo_print_func = print_func; + moo_printerr_func = printerr_func; + moo_log_handlers_set = TRUE; - virtual void log (const gchar *log_domain, - GLogLevelFlags log_level, - const gchar *message) = 0; + g_set_print_handler (print_func); + g_set_printerr_handler (printerr_func); - virtual void print (const gchar *string) = 0; +#define set(domain) \ + g_log_set_handler (domain, G_LOG_LEVEL_MASK | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION, log_func, NULL) - virtual void printerr (const gchar *string) - { - print(string); - } -}; + set ("Glib"); + set ("Glib-GObject"); + set ("GModule"); + set ("GThread"); + set ("Gtk"); + set ("Gdk"); + set ("GdkPixbuf"); + set ("Pango"); + set ("Moo"); + set (NULL); +#undef set -class LogHandler + g_log_set_default_handler (log_func, NULL); +} + + +/* it doesn't care about encoding, but well, noone cares */ +static void +default_print (const char *string) { -public: - static void set_writer(std::unique_ptr writer) - { - g_static_rec_mutex_lock(&m_big_lock); + fputs (string, stdout); + fflush (stdout); +} - if (m_writer == writer) - return; +static void +default_printerr (const char *string) +{ + fputs (string, stderr); + fflush (stderr); +} - if (m_writer && writer) - set_writer(nullptr); +void +moo_reset_log_func (void) +{ + if (moo_log_handlers_set) + set_print_funcs (moo_log_func, moo_print_func, moo_printerr_func); + else + set_print_funcs (g_log_default_handler, default_print, default_printerr); +} - m_writer = std::move(writer); - - if (m_writer) - { - m_saved_print_func = g_set_print_handler(print); - m_saved_printerr_func = g_set_printerr_handler(printerr); - g_log_set_default_handler(log, NULL); - - set_log_handler ("Glib"); - set_log_handler ("Glib-GObject"); - set_log_handler ("GModule"); - set_log_handler ("GThread"); - set_log_handler ("Gtk"); - set_log_handler ("Gdk"); - set_log_handler ("GdkPixbuf"); - set_log_handler ("Pango"); - set_log_handler ("Moo"); - set_log_handler (nullptr); - } - else - { - g_set_print_handler(m_saved_print_func); - g_set_printerr_handler(m_saved_printerr_func); - g_log_set_default_handler(g_log_default_handler, nullptr); - m_saved_print_func = nullptr; - m_saved_printerr_func = nullptr; - - for (const auto& pr: m_log_handlers) - g_log_remove_handler(pr.first.empty() ? nullptr : pr.first.c_str(), pr.second); - m_log_handlers.clear(); - } - - g_static_rec_mutex_unlock(&m_big_lock); - } - -private: - static void set_log_handler(const char* domain) - { - guint handler_id = g_log_set_handler (domain, G_LOG_LEVEL_MASK | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION, log, nullptr); - m_log_handlers.emplace(domain ? domain : "", handler_id); - } - - static void print (const gchar* string) - { - g_static_rec_mutex_lock(&m_big_lock); - - if (m_writer) - m_writer->print(string); - else - moo_debug_break(); - - g_static_rec_mutex_unlock(&m_big_lock); - } - - static void printerr (const gchar* string) - { - g_static_rec_mutex_lock(&m_big_lock); - - if (m_writer) - m_writer->printerr(string); - else - moo_debug_break(); - - g_static_rec_mutex_unlock(&m_big_lock); - } - - static void log (const gchar *log_domain, - GLogLevelFlags log_level, - const gchar *message, - gpointer) - { - if (!log_domain || strcmp(log_domain, G_LOG_DOMAIN) != 0) - moo_check_break_in_debugger(log_level); - - win32_filter_fatal_errors (log_domain, log_level, message); - - g_static_rec_mutex_lock(&m_big_lock); - - if (m_writer) - m_writer->log(log_domain, log_level, message); - else - moo_debug_break(); - - g_static_rec_mutex_unlock(&m_big_lock); - } - - #ifdef __WIN32__ - static void win32_filter_fatal_errors (const gchar *log_domain, - GLogLevelFlags flags, - const gchar *message) - { - if (flags & (G_LOG_LEVEL_ERROR | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION)) - _moo_win32_show_fatal_error (log_domain, message); - } - #else /* __WIN32__ */ - static void win32_filter_fatal_errors (const gchar*, GLogLevelFlags, const gchar*) - { - } - #endif /* __WIN32__ */ - -private: - static GStaticRecMutex m_big_lock; - static std::unique_ptr m_writer; - static GPrintFunc m_saved_print_func; - static GPrintFunc m_saved_printerr_func; - static std::unordered_map m_log_handlers; -}; - -GStaticRecMutex LogHandler::m_big_lock = G_STATIC_REC_MUTEX_INIT; -std::unique_ptr LogHandler::m_writer; -GPrintFunc LogHandler::m_saved_print_func = nullptr; -GPrintFunc LogHandler::m_saved_printerr_func = nullptr; -std::unordered_map LogHandler::m_log_handlers; /* * Display log messages in a window */ -class LogWriterWindow : public ILogWriter +#ifdef __WIN32__ +static void +win32_filter_fatal_errors (const gchar *log_domain, + GLogLevelFlags flags, + const gchar *message) { -public: - void log(const gchar* log_domain, GLogLevelFlags flags, const gchar* message) override + if (flags & (G_LOG_LEVEL_ERROR | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION)) { - if (!moo_is_main_thread ()) + _moo_win32_show_fatal_error (log_domain, message); + return; + } +} +#else /* __WIN32__ */ +static void +win32_filter_fatal_errors (G_GNUC_UNUSED const gchar *log_domain, + G_GNUC_UNUSED GLogLevelFlags flags, + G_GNUC_UNUSED const gchar *message) +{ +} +#endif /* __WIN32__ */ + +static char * +format_log_message (const char *log_domain, + const char *message) +{ + char *text = NULL; + + if (!g_utf8_validate (message, -1, NULL)) + message = ""; + + if (log_domain) + text = g_strdup_printf ("%s: %s\n", log_domain, message); + else + text = g_strdup_printf ("%s\n", message); + + return text; +} + +static void +log_func_window (const gchar *log_domain, + GLogLevelFlags flags, + const gchar *message, + G_GNUC_UNUSED gpointer dummy) +{ + char *text; + + win32_filter_fatal_errors (log_domain, flags, message); + + text = format_log_message (log_domain, message); + + { + GtkTextTag *tag; + MooLogWindow *log; + + gdk_threads_enter (); + + if ((log = moo_log_window ())) { - moo_break_if_in_debugger (); - return; - } - - gstr text = format_log_message (log_domain, message); - - if (MooLogWindow *log = moo_log_window ()) - { - GtkTextTag *tag = nullptr; - - if (flags & (G_LOG_LEVEL_CRITICAL | G_LOG_LEVEL_ERROR)) - tag = log->critical_tag; - else if (flags & G_LOG_LEVEL_WARNING) + if (flags >= G_LOG_LEVEL_MESSAGE) + tag = log->message_tag; + else if (flags >= G_LOG_LEVEL_WARNING) tag = log->warning_tag; else - tag = log->message_tag; + tag = log->critical_tag; moo_log_window_insert (log, text, tag); - - if (flags & (G_LOG_LEVEL_CRITICAL | G_LOG_LEVEL_ERROR | G_LOG_LEVEL_WARNING)) + if (flags <= G_LOG_LEVEL_WARNING) gtk_window_present (GTK_WINDOW (log->window)); } + + gdk_threads_leave (); } - void print(const gchar* string) override - { - if (!moo_is_main_thread ()) - { - moo_break_if_in_debugger (); - return; - } + g_free (text); +} - if (MooLogWindow *log = moo_log_window ()) - moo_log_window_insert (log, string, NULL); - } - void printerr(const gchar* string) override - { - if (!moo_is_main_thread ()) - { - moo_break_if_in_debugger (); - return; - } +static void +print_func_window (const char *string) +{ + MooLogWindow *log; + gdk_threads_enter (); + if ((log = moo_log_window ())) + moo_log_window_insert (log, string, NULL); + gdk_threads_leave (); +} - if (MooLogWindow *log = moo_log_window ()) - moo_log_window_insert (log, string, log->warning_tag); - } +static void +printerr_func_window (const char *string) +{ + MooLogWindow *log; + gdk_threads_enter (); + if ((log = moo_log_window ())) + moo_log_window_insert (log, string, log->warning_tag); + gdk_threads_leave (); +} -private: - gstr format_log_message (const char *log_domain, const char *message) - { - if (!g_utf8_validate (message, -1, NULL)) - message = ""; - - if (log_domain) - return gstr::printf ("%s: %s\n", log_domain, message); - else - return gstr::printf ("%s\n", message); - } -}; void moo_set_log_func_window (gboolean show_now) @@ -933,7 +848,7 @@ moo_set_log_func_window (gboolean show_now) if (show_now) gtk_widget_show (GTK_WIDGET (moo_log_window()->window)); - LogHandler::set_writer(make_unique()); + set_print_funcs (log_func_window, print_func_window, printerr_func_window); } @@ -941,68 +856,101 @@ moo_set_log_func_window (gboolean show_now) * Write to a file */ -class LogWriterFile : public ILogWriter +static char *moo_log_file; +static gboolean moo_log_file_written; +#if GLIB_CHECK_VERSION(2,32,0) +static GRecMutex moo_log_file_mutex; + +static void moo_static_rec_mutex_lock (GRecMutex *mutex) { -public: - LogWriterFile(gstr file) - : m_file(std::move(file)) - , m_file_written(false) + g_rec_mutex_lock (mutex); +} + +static void moo_static_rec_mutex_unlock (GRecMutex *mutex) +{ + g_rec_mutex_unlock (mutex); +} +#else +static GStaticRecMutex moo_log_file_mutex = G_STATIC_REC_MUTEX_INIT; + +static void moo_static_rec_mutex_lock (GStaticRecMutex *mutex) +{ + g_static_rec_mutex_lock (mutex); +} + +static void moo_static_rec_mutex_unlock (GStaticRecMutex *mutex) +{ + g_static_rec_mutex_unlock (mutex); +} +#endif + +static void +print_func_file (const char *string) +{ + MGW_FILE *file; + mgw_errno_t err; + + moo_static_rec_mutex_lock (&moo_log_file_mutex); + + if (!moo_log_file) { + moo_static_rec_mutex_unlock (&moo_log_file_mutex); + g_return_if_reached (); } - void print(const char* string) override + if (!moo_log_file_written) { - MGW_FILE *file; - mgw_errno_t err; - - g_return_if_fail (!m_file.empty()); - - if (!m_file_written) - { - file = mgw_fopen (m_file, "w+", &err); - m_file_written = true; - } - else - { - file = mgw_fopen (m_file, "a+", &err); - } - - if (file) - { - mgw_fwrite (string, strlen(string), 1, file); - mgw_fclose (file); - } - else - { - moo_break_if_in_debugger(); - } + file = mgw_fopen (moo_log_file, "w+", &err); + moo_log_file_written = TRUE; + } + else + { + file = mgw_fopen (moo_log_file, "a+", &err); } - void log(const char *log_domain, - GLogLevelFlags, - const char *message) override + if (file) { - gstr string; - - if (log_domain) - string = gstr::printf ("%s: %s\n", log_domain, message); - else - string = gstr::printf ("%s\n", message); - - print(string); - + mgw_fwrite (string, strlen(string), 1, file); + mgw_fclose (file); + } + else + { + /* TODO ??? */ } -private: - gstr m_file; - bool m_file_written; -}; + moo_static_rec_mutex_unlock (&moo_log_file_mutex); +} + + +static void +log_func_file (const char *log_domain, + GLogLevelFlags flags, + const char *message, + G_GNUC_UNUSED gpointer dummy) +{ + char *string; + + if (log_domain) + string = g_strdup_printf ("%s: %s\n", log_domain, message); + else + string = g_strdup_printf ("%s\n", message); + + print_func_file (string); + + win32_filter_fatal_errors (log_domain, flags, message); + + g_free (string); +} void moo_set_log_func_file (const char *log_file) { - LogHandler::set_writer(make_unique(gstr::wrap(log_file))); + moo_static_rec_mutex_lock (&moo_log_file_mutex); + g_free (moo_log_file); + moo_log_file = g_strdup (log_file); + set_print_funcs (log_func_file, print_func_file, print_func_file); + moo_static_rec_mutex_unlock (&moo_log_file_mutex); } @@ -1010,22 +958,26 @@ moo_set_log_func_file (const char *log_file) * Do nothing */ -class LogWriterSilent : public ILogWriter +static void +log_func_silent (const gchar *log_domain, + GLogLevelFlags flags, + const gchar *message, + G_GNUC_UNUSED gpointer data_unused) { -public: - void print(const char*) override - { - } + win32_filter_fatal_errors (log_domain, flags, message); +} - void log(const char*, GLogLevelFlags, const char*) override - { - } -}; +static void +print_func_silent (G_GNUC_UNUSED const char *s) +{ +} void moo_set_log_func_silent (void) { - LogHandler::set_writer(make_unique()); + set_print_funcs ((GLogFunc) log_func_silent, + (GPrintFunc) print_func_silent, + (GPrintFunc) print_func_silent); } @@ -1059,8 +1011,7 @@ moo_selection_data_set_pointer (GtkSelectionData *data, { g_return_if_fail (data != NULL); gtk_selection_data_set (data, type, 8, /* 8 bits per byte */ - reinterpret_cast (&ptr), - sizeof (ptr)); + (gpointer) &ptr, sizeof (ptr)); } @@ -1097,11 +1048,11 @@ _moo_get_modifiers (GtkWidget *widget) GdkModifierType mask; GdkDisplay *display; - g_return_val_if_fail (GTK_IS_WIDGET (widget), GdkModifierType (0)); - g_return_val_if_fail (GTK_WIDGET_REALIZED (widget), GdkModifierType (0)); + g_return_val_if_fail (GTK_IS_WIDGET (widget), 0); + g_return_val_if_fail (GTK_WIDGET_REALIZED (widget), 0); display = gtk_widget_get_display (widget); - g_return_val_if_fail (display != NULL, GdkModifierType (0)); + g_return_val_if_fail (display != NULL, 0); gdk_display_get_pointer (display, NULL, NULL, NULL, &mask); @@ -1126,7 +1077,7 @@ accel_label_set_string (GtkWidget *accel_label, static void accel_label_screen_changed (GtkWidget *accel_label) { - const char *label = reinterpret_cast (g_object_get_data (G_OBJECT (accel_label), "moo-accel-label-accel")); + const char *label = g_object_get_data (G_OBJECT (accel_label), "moo-accel-label-accel"); accel_label_set_string (accel_label, label); } @@ -1203,29 +1154,31 @@ moo_getenv_bool (const char *var) } -gstr +char * moo_get_user_cache_dir (void) { G_LOCK (moo_user_cache_dir); if (!moo_user_cache_dir) - moo_user_cache_dir = g_build_filename (g_get_user_cache_dir (), MOO_PACKAGE_NAME, nullptr); + moo_user_cache_dir = g_build_filename (g_get_user_cache_dir (), MOO_PACKAGE_NAME, NULL); G_UNLOCK (moo_user_cache_dir); - return gstr::wrap_const (moo_user_cache_dir); + return g_strdup (moo_user_cache_dir); } void moo_set_user_cache_dir (const char *path) { - g_return_if_fail (moo_is_main_thread ()); + G_LOCK (moo_user_cache_dir); if (moo_user_cache_dir) g_critical ("user cache dir already set"); g_free (moo_user_cache_dir); moo_user_cache_dir = g_strdup (path); + + G_UNLOCK (moo_user_cache_dir); } #ifdef __WIN32__ @@ -1244,7 +1197,7 @@ get_special_folder (int csidl) { b = SHGetPathFromIDListW (pidl, path); if (b) - retval = g_utf16_to_utf8 (reinterpret_cast (path), -1, NULL, NULL, NULL); + retval = g_utf16_to_utf8 (path, -1, NULL, NULL, NULL); CoTaskMemFree (pidl); } @@ -1293,7 +1246,7 @@ moo_get_user_data_dir (void) moo_user_data_dir = g_build_filename (basedir, MOO_PACKAGE_NAME, - nullptr); + NULL); g_free (freeme); } @@ -1306,13 +1259,15 @@ moo_get_user_data_dir (void) void moo_set_user_data_dir (const char *path) { - g_return_if_fail (moo_is_main_thread ()); + G_LOCK (moo_user_data_dir); if (moo_user_data_dir) g_critical ("user data dir already set"); g_free (moo_user_data_dir); moo_user_data_dir = g_strdup (path); + + G_UNLOCK (moo_user_data_dir); } void @@ -1356,7 +1311,7 @@ moo_make_user_data_dir (const char *path) user_dir = moo_get_user_data_dir (); g_return_val_if_fail (user_dir != NULL, FALSE); - full_path = g_build_filename (user_dir, path, nullptr); + full_path = g_build_filename (user_dir, path, NULL); result = _moo_mkdir_with_parents (full_path, &err); if (result != 0) @@ -1388,23 +1343,29 @@ cmp_dirs (const char *dir1, } static void -add_dir_list_from_env (gstrvec& list, +add_dir_list_from_env (GPtrArray *list, const char *var) { + char **dirs, **p; + #ifdef __WIN32__ - gstrvec dirs = convert (g_strsplit (var, ";", 0)); - dirs = moo_filenames_from_locale (std::move (dirs)); + dirs = g_strsplit (var, ";", 0); + p = moo_filenames_from_locale (dirs); + g_strfreev (dirs); + dirs = p; #else - gstrvec dirs = convert (g_strsplit (var, ":", 0)); + dirs = g_strsplit (var, ":", 0); #endif - for (auto &f : dirs) - list.emplace_back (std::move (f)); + for (p = dirs; p && *p; ++p) + g_ptr_array_add (list, *p); + + g_free (dirs); } static void -enumerate_data_dirs (MooDataDirType type, - gstrvec& dirs) +enumerate_data_dirs (MooDataDirType type, + GPtrArray *dirs) { const char *env[2]; @@ -1415,7 +1376,7 @@ enumerate_data_dirs (MooDataDirType type, return; } - dirs.emplace_back (gstr::wrap_new (moo_get_user_data_dir ())); + g_ptr_array_add (dirs, moo_get_user_data_dir ()); env[0] = g_getenv ("MOO_APP_DIRS"); env[1] = type == MOO_DATA_SHARE ? g_getenv ("MOO_DATA_DIRS") : g_getenv ("MOO_LIB_DIRS"); @@ -1438,36 +1399,49 @@ enumerate_data_dirs (MooDataDirType type, const char* const *p; for (p = g_get_system_data_dirs (); p && *p; ++p) - dirs.push_back (g::build_filename (*p, MOO_PACKAGE_NAME, nullptr)); + g_ptr_array_add (dirs, g_build_filename (*p, MOO_PACKAGE_NAME, NULL)); - dirs.push_back (gstr::wrap_const (MOO_DATA_DIR)); + g_ptr_array_add (dirs, g_strdup (MOO_DATA_DIR)); } else { - dirs.push_back (gstr::wrap_const (MOO_LIB_DIR)); + g_ptr_array_add (dirs, g_strdup (MOO_LIB_DIR)); } #endif } } -static gstrvec -do_get_data_dirs (MooDataDirType type) +static char ** +do_get_data_dirs (MooDataDirType type, + guint *n_dirs) { - gstrvec all_dirs; + GPtrArray *dirs; + GPtrArray *all_dirs; + char **ptr; + guint i; + + all_dirs = g_ptr_array_new (); enumerate_data_dirs (type, all_dirs); + g_ptr_array_add (all_dirs, NULL); - gstrvec dirs; + dirs = g_ptr_array_new (); - for (gstr& path: all_dirs) + for (ptr = (char**) all_dirs->pdata; *ptr; ++ptr) { gboolean found = FALSE; + char *path; - if (path.empty()) - continue; + path = *ptr; - for (const auto& d: dirs) + if (!path || !path[0]) { - if (cmp_dirs (path, d)) + g_free (path); + continue; + } + + for (i = 0; i < dirs->len; ++i) + { + if (cmp_dirs (path, dirs->pdata[i])) { found = TRUE; break; @@ -1475,10 +1449,15 @@ do_get_data_dirs (MooDataDirType type) } if (!found) - dirs.emplace_back (std::move (path)); + g_ptr_array_add (dirs, path); + else + g_free (path); } - return dirs; + g_ptr_array_add (dirs, NULL); + *n_dirs = dirs->len - 1; + g_ptr_array_free (all_dirs, TRUE); + return (char**) g_ptr_array_free (dirs, FALSE); } static char ** @@ -1498,10 +1477,7 @@ moo_get_data_dirs_real (MooDataDirType type_requested, { int type; for (type = 0; type < 3; ++type) - { - moo_data_dirs[type] = gstrv::convert(do_get_data_dirs(MooDataDirType(type))).release(); - n_data_dirs[type] = g_strv_length(moo_data_dirs[type]); - } + moo_data_dirs[type] = do_get_data_dirs (type, &n_data_dirs[type]); } G_UNLOCK (moo_data_dirs); @@ -1560,19 +1536,20 @@ moo_get_stuff_subdirs (const char *subdir, MooDataDirType type, gboolean include_user) { - char **dirs; + char **data_dirs, **dirs; guint n_dirs, i; g_return_val_if_fail (subdir != NULL, NULL); - gstrv data_dirs = moo_get_data_dirs_real (type, include_user, &n_dirs); - g_return_val_if_fail (data_dirs != nullptr, NULL); + data_dirs = moo_get_data_dirs_real (type, include_user, &n_dirs); + g_return_val_if_fail (data_dirs != NULL, NULL); dirs = g_new0 (char*, n_dirs + 1); for (i = 0; i < n_dirs; ++i) - dirs[i] = g_build_filename (data_dirs[i], subdir, nullptr); + dirs[i] = g_build_filename (data_dirs[i], subdir, NULL); + g_strfreev (data_dirs); return dirs; } @@ -1629,22 +1606,25 @@ moo_get_data_and_lib_subdirs (const char *subdir) } -static gstr +static char * get_user_data_file (const char *basename, gboolean cache) { - g_return_val_if_fail (basename && basename[0], NULL); + char *dir, *file; - gstr dir; + g_return_val_if_fail (basename && basename[0], NULL); if (cache) dir = moo_get_user_cache_dir (); else - dir = gstr::wrap_new (moo_get_user_data_dir ()); + dir = moo_get_user_data_dir (); - g_return_val_if_fail (!dir.empty(), NULL); + g_return_val_if_fail (dir != NULL, NULL); - return g::build_filename (dir, basename); + file = g_build_filename (dir, basename, NULL); + + g_free (dir); + return file; } /** @@ -1657,17 +1637,21 @@ get_user_data_file (const char *basename, char * moo_get_named_user_data_file (const char *basename) { - g_return_val_if_fail (basename && basename[0], NULL); + char *freeme = NULL; + char *file; - gstr tmp; + g_return_val_if_fail (basename && basename[0], NULL); if (moo_app_instance_name) { - tmp = gstr::printf ("%s-%s", moo_app_instance_name, basename); - basename = tmp; + freeme = g_strdup_printf ("%s-%s", moo_app_instance_name, basename); + basename = freeme; } - return moo_get_user_data_file (basename); + file = moo_get_user_data_file (basename); + + g_free (freeme); + return file; } /** @@ -1680,7 +1664,7 @@ moo_get_named_user_data_file (const char *basename) char * moo_get_user_data_file (const char *basename) { - return get_user_data_file (basename, FALSE).release_owned (); + return get_user_data_file (basename, FALSE); } /** @@ -1692,35 +1676,30 @@ moo_get_user_data_file (const char *basename) */ char * moo_get_user_cache_file (const char *basename) -{ - return get_user_data_file (basename, TRUE).release_owned (); -} - -g::gstr -moo_get_user_cache_file(const g::gstr& basename) { return get_user_data_file (basename, TRUE); } static gboolean -save_config_file (const char *filename, - const char *content, - gssize len, - GError **error) +save_config_file (const char *filename, + const char *content, + gssize len, + GError **error) { MooFileWriter *writer; + gboolean retval; g_return_val_if_fail (filename != NULL, FALSE); g_return_val_if_fail (content != NULL, FALSE); - gerrp error_here(error); - - if (!(writer = moo_config_writer_new (filename, TRUE, error_here))) + if (!(writer = moo_config_writer_new (filename, TRUE, error))) return FALSE; moo_file_writer_write (writer, content, len); - return moo_file_writer_close (writer, error_here); + retval = moo_file_writer_close (writer, error); + + return retval; } static gboolean @@ -1730,17 +1709,21 @@ save_user_data_file (const char *basename, gssize len, GError **error) { + char *file; + gboolean result; + g_return_val_if_fail (basename != NULL, FALSE); g_return_val_if_fail (content != NULL, FALSE); - gstr file; - if (cache) - file.set_new (moo_get_user_cache_file (basename)); + file = moo_get_user_cache_file (basename); else - file.set_new (moo_get_user_data_file (basename)); + file = moo_get_user_data_file (basename); - return save_config_file (file, content, len, error); + result = save_config_file (file, content, len, error); + + g_free (file); + return result; } gboolean @@ -1798,12 +1781,7 @@ _moo_widget_set_tooltip (GtkWidget *widget, NORETURN void _moo_assert_message (MooCodeLoc loc, const char *message) { - moo_debug_break(); - - if (!loc.empty()) - g_error ("file '%s', function '%s', line %d: %s\n", loc.file, loc.func, loc.line, message); - else - g_error ("%s", message); + g_error ("file '%s', function '%s', line %d: %s\n", loc.file, loc.func, loc.line, message); } void @@ -1833,46 +1811,24 @@ moo_log_debug_enabled (void) return enabled; } -void _moo_log_impl(MooCodeLoc loc, GLogLevelFlags flags, g::gstr message) -{ - if (flags >= G_LOG_LEVEL_DEBUG && !moo_log_debug_enabled ()) - return; - - if (!loc.empty()) - g_log (G_LOG_DOMAIN, flags, - /* Translators: remove the part before and including | */ - Q_("console message|in file %s, line %d, function %s: %s"), - loc.file, loc.line, loc.func, message.get ()); - else - g_log (G_LOG_DOMAIN, flags, "%s", message.get ()); -} - -void _moo_log_c (MooCodeLoc loc, GLogLevelFlags flags, const char *format, ...) -{ - if (flags >= G_LOG_LEVEL_DEBUG && !moo_log_debug_enabled ()) - return; - - va_list args; - va_start (args, format); - _moo_log_impl (loc, flags, gstr::vprintf (format, args)); - va_end (args); -} - void _moo_logv (MooCodeLoc loc, GLogLevelFlags flags, const char *format, va_list args) { + char *message; + if (flags >= G_LOG_LEVEL_DEBUG && !moo_log_debug_enabled ()) return; - _moo_log_impl (loc, flags, gstr::vprintf (format, args)); + message = g_strdup_vprintf (format, args); + + g_log (G_LOG_DOMAIN, flags, + /* Translators: remove the part before and including | */ + Q_("console message|in file %s, line %d, function %s: %s"), + loc.file, loc.line, loc.func, message); + + g_free (message); } -void MOO_NORETURN _moo_error_impl(MooCodeLoc, g::gstr message) -{ - g_log (G_LOG_DOMAIN, G_LOG_LEVEL_ERROR, "%s", message.get_non_null ()); - moo_abort (); -} - -void MOO_NORETURN _moo_error_c (MooCodeLoc loc, const char *format, ...) +void MOO_NORETURN _moo_error (MooCodeLoc loc, const char *format, ...) { va_list args; va_start (args, format); @@ -1888,6 +1844,65 @@ void MOO_NORETURN _moo_errorv (MooCodeLoc loc, const char *format, va_list args) } +/******************************************************************************* + * Former eggregex stuff + */ +gboolean +_moo_regex_escape (const char *string, + gssize bytes, + GString *dest) +{ + const char *p, *piece, *end; + gboolean escaped = FALSE; + + g_return_val_if_fail (string != NULL, TRUE); + g_return_val_if_fail (dest != NULL, TRUE); + + if (bytes < 0) + bytes = strlen (string); + + end = string + bytes; + p = piece = string; + + while (p < end) + { + switch (*p) + { + case '\\': + case '|': + case '(': + case ')': + case '[': + case ']': + case '{': + case '}': + case '^': + case '$': + case '*': + case '+': + case '?': + case '.': + escaped = TRUE; + if (p != piece) + g_string_append_len (dest, piece, p - piece); + g_string_append_c (dest, '\\'); + g_string_append_c (dest, *p); + piece = ++p; + break; + + default: + p = g_utf8_next_char (p); + break; + } + } + + if (escaped && piece < end) + g_string_append_len (dest, piece, end - piece); + + return escaped; +} + + char ** moo_strnsplit_lines (const char *string, gssize len, @@ -2123,12 +2138,59 @@ typedef struct { static void source_data_free (gpointer data) { - SourceData *sd = reinterpret_cast (data); + SourceData *sd = data; if (sd && sd->notify) sd->notify (sd->data); g_free (sd); } +static gboolean +thread_io_func (GIOChannel *source, + GIOCondition condition, + gpointer data) +{ + SourceData *sd = data; + gboolean ret = FALSE; + + gdk_threads_enter (); + + if (!g_source_is_destroyed (g_main_current_source ())) + ret = ((GIOFunc) sd->func) (source, condition, sd->data); + + gdk_threads_leave (); + return ret; +} + +guint +_moo_io_add_watch (GIOChannel *channel, + GIOCondition condition, + GIOFunc func, + gpointer data) +{ + return _moo_io_add_watch_full (channel, G_PRIORITY_DEFAULT, + condition, func, data, NULL); +} + + +guint +_moo_io_add_watch_full (GIOChannel *channel, + int priority, + GIOCondition condition, + GIOFunc func, + gpointer data, + GDestroyNotify notify) +{ + SourceData *sd; + + sd = g_new (SourceData, 1); + sd->func = (GSourceFunc) func; + sd->data = data; + sd->notify = notify; + + return g_io_add_watch_full (channel, priority, condition, + thread_io_func, sd, source_data_free); +} + GdkAtom moo_atom_uri_list (void) @@ -2147,12 +2209,6 @@ moo_error_message (GError *error) return error->message; } -g::gstr -moo_error_message(const g::gerrp& err) -{ - return gstr::wrap (moo_error_message (err.get ())); -} - gboolean moo_signal_accumulator_continue_cancel (G_GNUC_UNUSED GSignalInvocationHint *ihint, diff --git a/moo/mooutils/mooutils-misc.h b/moo/mooutils/mooutils-misc.h index 3b3ebd03..47831977 100644 --- a/moo/mooutils/mooutils-misc.h +++ b/moo/mooutils/mooutils-misc.h @@ -1,7 +1,7 @@ /* * mooutils-misc.h * - * Copyright (C) 2004-2016 by Yevgen Muntyan + * Copyright (C) 2004-2010 by Yevgen Muntyan * * This file is part of medit. medit is free software; you can * redistribute it and/or modify it under the terms of the @@ -13,13 +13,11 @@ * License along with medit. If not, see . */ -#pragma once +#ifndef MOO_UTILS_MISC_H +#define MOO_UTILS_MISC_H -#include -#ifdef __cplusplus -#include -#endif #include +#include #include G_BEGIN_DECLS @@ -44,6 +42,7 @@ void moo_log_window_hide (void); void moo_set_log_func_window (gboolean show_now); void moo_set_log_func_file (const char *log_file); void moo_set_log_func_silent (void); +void moo_reset_log_func (void); void MOO_NORETURN moo_segfault (void); void MOO_NORETURN moo_abort (void); @@ -76,18 +75,8 @@ gboolean moo_save_user_data_file (const char *basename, const char *content, gssize len, GError **error); - +char *moo_get_user_cache_dir (void); char *moo_get_user_cache_file (const char *basename); - -G_END_DECLS -#ifdef __cplusplus - -g::gstr moo_get_user_cache_dir (); -g::gstr moo_get_user_cache_file (const g::gstr& basename); - -#endif // __cplusplus -G_BEGIN_DECLS - gboolean moo_save_user_cache_file (const char *basename, const char *content, gssize len, @@ -205,15 +194,28 @@ moo_assign_obj (void** dest, void* src) const char *_moo_get_pid_string (void); +guint _moo_io_add_watch (GIOChannel *channel, + GIOCondition condition, + GIOFunc func, + gpointer data); +guint _moo_io_add_watch_full (GIOChannel *channel, + int priority, + GIOCondition condition, + GIOFunc func, + gpointer data, + GDestroyNotify notify); + + +gboolean _moo_regex_escape (const char *string, + gssize bytes, + GString *dest); + const char *moo_error_message (GError *error); -gboolean moo_signal_accumulator_continue_cancel (GSignalInvocationHint *ihint, - GValue *return_accu, - const GValue *handler_return, - gpointer val_continue); - -void moo_thread_init (void); -gboolean moo_is_main_thread (void); +gboolean moo_signal_accumulator_continue_cancel (GSignalInvocationHint *ihint, + GValue *return_accu, + const GValue *handler_return, + gpointer val_continue); G_END_DECLS @@ -222,32 +224,30 @@ G_END_DECLS #include #include -#ifdef __cplusplus +G_BEGIN_DECLS -g::gstr moo_win32_get_app_dir(void); -g::gstr moo_win32_get_dll_dir(const char* dll); -void _moo_win32_add_data_dirs(g::gstrvec& list, - const char* prefix); +char *moo_win32_get_app_dir (void); +char *moo_win32_get_dll_dir (const char *dll); -g::gstr _moo_win32_get_locale_dir(void); +void _moo_win32_add_data_dirs (GPtrArray *list, + const char *prefix); + +const char *_moo_win32_get_locale_dir (void); gboolean _moo_win32_open_uri (const char *uri); void _moo_win32_show_fatal_error (const char *domain, const char *logmsg); +char **_moo_win32_lame_parse_cmd_line (const char *cmd_line, + GError **error); + int _moo_win32_message_box (GtkWidget *parent, guint type, const char *title, const char *format, ...) G_GNUC_PRINTF (4, 5); -#endif // __cplusplus - -G_BEGIN_DECLS - -char **_moo_win32_lame_parse_cmd_line(const char *cmd_line, - GError **error); G_END_DECLS @@ -263,68 +263,4 @@ moo_os_win32 (void) #endif } -#ifdef __cplusplus - -g::gstrvec moo_get_data_subdirs(const g::gstr& subdir); -g::gstr moo_error_message(const g::gerrp& err); - -#endif // __cplusplus - -G_BEGIN_DECLS - -GQuark moo_error_quark (void) G_GNUC_CONST; - -#define MOO_ERROR (moo_error_quark ()) - -enum { - MOO_ERROR_UNEXPECTED = 1 -}; - -G_END_DECLS - -#ifdef __cplusplus - -#define moo_err_false_ret__ false -#define moo_err_null_ret__ nullptr - -inline void moo_err_set_unexpected_error(GError** error) -{ - g_set_error (error, MOO_ERROR, MOO_ERROR_UNEXPECTED, "unexpected error"); -} - -inline void moo_err_set_unexpected_error(g::gerrp& error) -{ - moo_err_set_unexpected_error(&error); -} - -#else // !__cplusplus - -#define moo_err_false_ret__ FALSE -#define moo_err_null_ret__ NULL - -#define moo_err_set_unexpected_error(error) \ - g_set_error (error, \ - MOO_ERROR, \ - MOO_ERROR_UNEXPECTED, \ - "unexpected error") - -#endif // !__cplusplus - -#define moo_return_error_if_fail_val(cond, val) \ -MOO_STMT_START { \ - if (cond) \ - { \ - } \ - else \ - { \ - moo_critical("Condition '%s' failed", #cond); \ - moo_err_set_unexpected_error(error); \ - return val; \ - } \ -} MOO_STMT_END - -#define moo_return_error_if_fail(cond) \ - moo_return_error_if_fail_val (cond, moo_err_false_ret__) - -#define moo_return_error_if_fail_p(cond) \ - moo_return_error_if_fail_val (cond, moo_err_null_ret__) +#endif /* MOO_UTILS_MISC_H */ diff --git a/moo/mooutils/mooutils-script.cpp b/moo/mooutils/mooutils-script.c similarity index 95% rename from moo/mooutils/mooutils-script.cpp rename to moo/mooutils/mooutils-script.c index 8f976f87..10f973ea 100644 --- a/moo/mooutils/mooutils-script.cpp +++ b/moo/mooutils/mooutils-script.c @@ -43,9 +43,11 @@ moo_spin_main_loop (double sec) g_return_if_fail (sec > 0); main_loop = g_main_loop_new (NULL, FALSE); - g_timeout_add (sec * 1000, (GSourceFunc) quit_main_loop, main_loop); + gdk_threads_add_timeout (sec * 1000, (GSourceFunc) quit_main_loop, main_loop); + gdk_threads_leave (); g_main_loop_run (main_loop); + gdk_threads_enter (); g_main_loop_unref (main_loop); } @@ -102,7 +104,7 @@ moo_tempdir (void) * moo_tempnam: * * Generate a unique filename for a temporary file. Generated filename - * is located inside the directory returned by moo_tempdir(), and it + * is located inside directory returned by moo_tempdir(), and it * will be automatically removed on exit. * * @extension: (type const-filename) (allow-none) (default NULL) diff --git a/moo/mooutils/mooutils-thread.cpp b/moo/mooutils/mooutils-thread.c similarity index 96% rename from moo/mooutils/mooutils-thread.cpp rename to moo/mooutils/mooutils-thread.c index 92877add..4f1dcda6 100644 --- a/moo/mooutils/mooutils-thread.cpp +++ b/moo/mooutils/mooutils-thread.c @@ -262,7 +262,7 @@ init_queue (void) queue.io = mgw_io_channel_unix_new (queue.pipe_out); #endif - if (!queue.io) + if (queue.io) { g_critical ("g_io_channel_new failed"); goto out; @@ -386,11 +386,11 @@ static volatile int print_event_id = 0; static void message_callback (GList *events, G_GNUC_UNUSED gpointer data) { - g_assert (moo_is_main_thread ()); - while (events) { - moo_message_noloc ("%s", (char*) events->data); + gdk_threads_enter (); + _moo_message ("%s", (char*) events->data); + gdk_threads_leave (); events = events->next; } } @@ -398,11 +398,11 @@ message_callback (GList *events, G_GNUC_UNUSED gpointer data) static void print_callback (GList *events, G_GNUC_UNUSED gpointer data) { - g_assert (moo_is_main_thread ()); - while (events) { + gdk_threads_enter (); g_print ("%s", (char*) events->data); + gdk_threads_leave (); events = events->next; } } @@ -610,3 +610,17 @@ moo_async_job_cancel (MooAsyncJob *job) job->cancelled = TRUE; g_mutex_unlock (job->mutex); } + +void +moo_async_job_ref (MooAsyncJob *job) +{ + g_return_if_fail (job != NULL); + g_object_ref (job); +} + +void +moo_async_job_unref (MooAsyncJob *job) +{ + g_return_if_fail (job != NULL); + g_object_unref (job); +} diff --git a/moo/mooutils/mooutils-thread.h b/moo/mooutils/mooutils-thread.h index bdc58395..9340f556 100644 --- a/moo/mooutils/mooutils-thread.h +++ b/moo/mooutils/mooutils-thread.h @@ -32,6 +32,8 @@ MooAsyncJob *moo_async_job_new (MooAsyncJobCallback callback, GDestroyNotify data_notify); void moo_async_job_start (MooAsyncJob *job); void moo_async_job_cancel (MooAsyncJob *job); +void moo_async_job_ref (MooAsyncJob *job); +void moo_async_job_unref (MooAsyncJob *job); guint _moo_event_queue_connect (MooEventQueueCallback callback, gpointer data, diff --git a/moo/mooutils/mooutils-treeview.cpp b/moo/mooutils/mooutils-treeview.c similarity index 95% rename from moo/mooutils/mooutils-treeview.cpp rename to moo/mooutils/mooutils-treeview.c index 26a8c0ab..57c2c466 100644 --- a/moo/mooutils/mooutils-treeview.cpp +++ b/moo/mooutils/mooutils-treeview.c @@ -18,12 +18,10 @@ #include "mooutils/mooutils-gobject.h" #include "mooutils/moocompat.h" #include "mooutils/mootype-macros.h" -#include "moocpp/moocpp.h" #include "marshals.h" #include #include -using namespace moo; typedef enum { TREE_VIEW, @@ -78,7 +76,7 @@ tree_selection_changed (GtkTreeSelection *selection, GtkTreeIter iter; GtkTreePath *path, *old_path; - old_row = reinterpret_cast (g_object_get_data (G_OBJECT (selection), "moo-tree-helper-current-row")); + old_row = g_object_get_data (G_OBJECT (selection), "moo-tree-helper-current-row"); old_path = old_row ? gtk_tree_row_reference_get_path (old_row) : NULL; if (old_row && !old_path) @@ -140,7 +138,7 @@ combo_changed (GtkComboBox *combo, g_return_if_fail (MOO_IS_TREE_HELPER (helper)); g_return_if_fail (combo == helper->widget); - old_row = reinterpret_cast (g_object_get_data (G_OBJECT (combo), "moo-tree-helper-current-row")); + old_row = g_object_get_data (G_OBJECT (combo), "moo-tree-helper-current-row"); old_path = old_row ? gtk_tree_row_reference_get_path (old_row) : NULL; if (old_row && !old_path) @@ -206,7 +204,7 @@ moo_tree_helper_destroy (GtkObject *object) switch (helper->type) { case TREE_VIEW: - selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (helper->widget)); + selection = gtk_tree_view_get_selection (helper->widget); g_signal_handlers_disconnect_by_func (selection, (gpointer) tree_selection_changed, helper); @@ -290,7 +288,7 @@ tree_helper_move_row_default (G_GNUC_UNUSED MooTreeHelper *helper, GtkTreePath *new_path) { GtkTreeIter old_iter, new_iter; - int new_, old; + int new, old; if (!GTK_IS_LIST_STORE (model)) return FALSE; @@ -299,9 +297,9 @@ tree_helper_move_row_default (G_GNUC_UNUSED MooTreeHelper *helper, g_return_val_if_fail (gtk_tree_path_get_depth (old_path) == 1, FALSE); g_return_val_if_fail (gtk_tree_path_get_depth (new_path) == 1, FALSE); - new_ = gtk_tree_path_get_indices(new_path)[0]; + new = gtk_tree_path_get_indices(new_path)[0]; old = gtk_tree_path_get_indices(old_path)[0]; - g_return_val_if_fail (ABS (new_ - old) == 1, FALSE); + g_return_val_if_fail (ABS (new - old) == 1, FALSE); gtk_tree_model_get_iter (model, &old_iter, old_path); gtk_tree_model_get_iter (model, &new_iter, new_path); @@ -512,9 +510,9 @@ moo_tree_helper_get_model (MooTreeHelper *helper) switch (helper->type) { case TREE_VIEW: - return gtk_tree_view_get_model (GTK_TREE_VIEW (helper->widget)); + return gtk_tree_view_get_model (helper->widget); case COMBO_BOX: - return gtk_combo_box_get_model (GTK_COMBO_BOX (helper->widget)); + return gtk_combo_box_get_model (helper->widget); } g_return_val_if_reached (NULL); @@ -531,13 +529,13 @@ moo_tree_helper_get_selected (MooTreeHelper *helper, switch (helper->type) { case TREE_VIEW: - selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (helper->widget)); + selection = gtk_tree_view_get_selection (helper->widget); return gtk_tree_selection_get_selected (selection, model, iter); case COMBO_BOX: if (model) - *model = gtk_combo_box_get_model (GTK_COMBO_BOX (helper->widget)); - return gtk_combo_box_get_active_iter (GTK_COMBO_BOX (helper->widget), iter); + *model = gtk_combo_box_get_model (helper->widget); + return gtk_combo_box_get_active_iter (helper->widget, iter); } g_return_val_if_reached (FALSE); @@ -575,7 +573,7 @@ moo_tree_helper_new_row (MooTreeHelper *helper) g_return_if_fail (helper->type == TREE_VIEW); - selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (helper->widget)); + selection = gtk_tree_view_get_selection (helper->widget); if (!gtk_tree_selection_get_selected (selection, &model, &iter)) index = gtk_tree_model_iter_n_children (model, NULL); @@ -607,7 +605,7 @@ moo_tree_helper_delete_row (MooTreeHelper *helper) g_return_if_fail (helper->type == TREE_VIEW); - selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (helper->widget)); + selection = gtk_tree_view_get_selection (helper->widget); if (!gtk_tree_selection_get_selected (selection, &model, &iter)) { @@ -644,7 +642,7 @@ moo_tree_helper_row_move (MooTreeHelper *helper, g_return_if_fail (helper->type == TREE_VIEW); - selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (helper->widget)); + selection = gtk_tree_view_get_selection (helper->widget); if (!gtk_tree_selection_get_selected (selection, &model, &iter)) { @@ -726,7 +724,7 @@ _moo_tree_helper_connect (MooTreeHelper *helper, switch (helper->type) { case TREE_VIEW: - selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (helper->widget)); + selection = gtk_tree_view_get_selection (helper->widget); g_signal_connect (selection, "changed", G_CALLBACK (tree_selection_changed), helper); @@ -769,7 +767,7 @@ _moo_tree_helper_new (GtkWidget *widget, g_return_val_if_fail (GTK_IS_TREE_VIEW (widget) || GTK_IS_COMBO_BOX (widget), NULL); - helper = new_object(); + helper = g_object_new (MOO_TYPE_TREE_HELPER, (const char*) NULL); g_object_ref_sink (helper); _moo_tree_helper_connect (helper, widget, new_btn, delete_btn, up_btn, down_btn); @@ -1002,7 +1000,7 @@ moo_expander_cell_render (GtkCellRenderer *cell, !gdk_rectangle_intersect (expose_area, &draw_rect, &draw_rect)) return; - state = GtkStateType (GTK_WIDGET_STATE (widget)); + state = GTK_WIDGET_STATE (widget); if (!cell->sensitive) { @@ -1207,17 +1205,17 @@ _moo_tree_view_setup_expander (GtkTreeView *tree_view, g_object_set (tree_view, "show-expanders", FALSE, "level-indentation", LEVEL_INDENTATION, - nullptr); + NULL); - cell = GTK_CELL_RENDERER (g_object_new (MOO_TYPE_EXPANDER_CELL, nullptr)); + cell = g_object_new (MOO_TYPE_EXPANDER_CELL, (const char*) NULL); gtk_tree_view_column_pack_start (column, cell, FALSE); gtk_tree_view_column_set_cell_data_func (column, cell, (GtkTreeCellDataFunc) expander_cell_data_func, tree_view, NULL); data = g_slice_new0 (ExpanderData); - data->column = object_ref (column); - data->cell = object_ref (cell); + data->column = g_object_ref (column); + data->cell = g_object_ref (cell); g_object_set_data_full (G_OBJECT (tree_view), "moo-tree-view-expander-data", data, (GDestroyNotify) expander_data_free); diff --git a/moo/mooutils/mooutils-treeview.h b/moo/mooutils/mooutils-treeview.h index 4a12730d..0119cee7 100644 --- a/moo/mooutils/mooutils-treeview.h +++ b/moo/mooutils/mooutils-treeview.h @@ -13,12 +13,10 @@ * License along with medit. If not, see . */ -#pragma once +#ifndef MOO_UTILS_TREE_VIEW_H +#define MOO_UTILS_TREE_VIEW_H #include -#ifdef __cplusplus -#include -#endif G_BEGIN_DECLS @@ -106,11 +104,4 @@ void _moo_tree_view_setup_expander (GtkTreeView *tree_vi G_END_DECLS -#ifdef __cplusplus - -namespace moo -{ -MOO_DEFINE_SIMPLE_GOBJ_CLASS(TreeHelper, g::Object, MooTreeHelper, MOO_TYPE_TREE_HELPER); -} - -#endif // __cplusplus +#endif /* MOO_UTILS_TREE_VIEW_H */ diff --git a/moo/mooutils/mooutils-win32.cpp b/moo/mooutils/mooutils-win32.c similarity index 79% rename from moo/mooutils/mooutils-win32.cpp rename to moo/mooutils/mooutils-win32.c index 7d665436..25108c4a 100644 --- a/moo/mooutils/mooutils-win32.cpp +++ b/moo/mooutils/mooutils-win32.c @@ -41,7 +41,6 @@ #include "mooutils/moowin32/mingw/fnmatch.h" #include #include -#include "moocpp/moocpp.h" #include #include @@ -51,8 +50,6 @@ #include #include -using namespace moo; - #if 0 #ifdef _MSC_VER /* This is stuff from newer Microsoft C runtime, but we want msvcrt.dll @@ -99,7 +96,7 @@ get_moo_dll_name (void) #endif } -gstr +const char * _moo_win32_get_locale_dir (void) { G_LOCK_DEFINE_STATIC (moo_locale_dir); @@ -109,56 +106,73 @@ _moo_win32_get_locale_dir (void) if (!moo_locale_dir) { - gstrp dir (g_win32_get_package_installation_directory_of_module (_moo_hinst)); - gstrp subdir (g_build_filename (dir, "share", "locale", NULL)); + char *dir, *subdir; + + dir = g_win32_get_package_installation_directory_of_module (_moo_hinst); + subdir = g_build_filename (dir, "share", "locale", NULL); + moo_locale_dir = g_win32_locale_filename_from_utf8 (subdir); + + g_free (subdir); + g_free (dir); } G_UNLOCK (moo_locale_dir); - return gstr::wrap_const (moo_locale_dir); + return moo_locale_dir; } static void -add_win32_data_dirs_for_dll (gstrvec& list, - const char* subdir_name, - const char* dllname) +add_win32_data_dirs_for_dll (GPtrArray *list, + const char *subdir_name, + const char *dllname) { - gstr dlldir = moo_win32_get_dll_dir (dllname); + char *dlldir, *datadir; + + dlldir = moo_win32_get_dll_dir (dllname); if (g_str_has_suffix (dlldir, "\\")) { - char* p = dlldir.get_mutable(); - p[strlen(p) - 1] = 0; + char *tmp = g_strndup (dlldir, strlen(dlldir) - 1); + g_free (dlldir); + dlldir = tmp; } if (g_str_has_suffix (dlldir, "bin") || g_str_has_suffix (dlldir, "lib")) { - gstr tmp = g::path_get_dirname (dlldir); - gstr datadir = g::build_filename (tmp, subdir_name); - list.emplace_back (std::move (datadir)); + char *tmp = g_path_get_dirname (dlldir); + datadir = g_build_filename (tmp, subdir_name, NULL); + g_free (tmp); } else { - list.emplace_back (std::move (dlldir)); + datadir = g_strdup (dlldir); } + + g_free (dlldir); + g_ptr_array_add (list, datadir); } void -_moo_win32_add_data_dirs(g::gstrvec& list, - const char* prefix) +_moo_win32_add_data_dirs (GPtrArray *list, + const char *prefix) { - gstr subdir = gstr::printf ("%s\\" MOO_PACKAGE_NAME, prefix); + char *subdir; + const char *dll_name; + + subdir = g_strdup_printf ("%s\\" MOO_PACKAGE_NAME, prefix); add_win32_data_dirs_for_dll (list, subdir, NULL); - if (const char *dll_name = get_moo_dll_name ()) + if ((dll_name = get_moo_dll_name ())) add_win32_data_dirs_for_dll (list, subdir, dll_name); + + g_free (subdir); } -gstr +char * moo_win32_get_app_dir (void) { static char *moo_app_dir; @@ -167,17 +181,19 @@ moo_win32_get_app_dir (void) G_LOCK (moo_app_dir); if (!moo_app_dir) - moo_app_dir = moo_win32_get_dll_dir (NULL).release_owned (); + moo_app_dir = moo_win32_get_dll_dir (NULL); G_UNLOCK (moo_app_dir); - return gstr::wrap_const (moo_app_dir); + return g_strdup (moo_app_dir); } -gstr +char * moo_win32_get_dll_dir (const char *dll) { - gbuf dll_utf16; + wchar_t *dll_utf16 = NULL; + char *dir; + char *dllname = NULL; HMODULE handle; wchar_t buf[MAX_PATH+1]; @@ -185,27 +201,31 @@ moo_win32_get_dll_dir (const char *dll) { GError *error = NULL; - dll_utf16.set_new (reinterpret_cast (g_utf8_to_utf16 (dll, -1, NULL, NULL, &error))); + dll_utf16 = g_utf8_to_utf16 (dll, -1, NULL, NULL, &error); if (!dll_utf16) { g_critical ("could not convert name '%s' to UTF16: %s", dll, moo_error_message (error)); g_error_free (error); - return gstr::wrap_const ("."); + return g_strdup ("."); } } handle = GetModuleHandleW (dll_utf16); - g_return_val_if_fail (handle != NULL, gstr::wrap_const (".")); + g_return_val_if_fail (handle != NULL, g_strdup (".")); if (GetModuleFileNameW (handle, buf, G_N_ELEMENTS (buf)) > 0) - { - gstr dllname = g::utf16_to_utf8 (buf); - return g::path_get_dirname (dllname); - } + dllname = g_utf16_to_utf8 (buf, -1, NULL, NULL, NULL); - return gstr::wrap_const ("."); + if (dllname) + dir = g_path_get_dirname (dllname); + else + dir = g_strdup ("."); + + g_free (dllname); + g_free (dll_utf16); + return dir; } @@ -234,6 +254,8 @@ void _moo_win32_show_fatal_error (const char *domain, const char *logmsg) { + char *msg = NULL; + #define PLEASE_REPORT \ "Please report it to " PACKAGE_BUGREPORT " and provide "\ "steps needed to reproduce this error." @@ -246,6 +268,8 @@ _moo_win32_show_fatal_error (const char *domain, "Error", "Fatal error:\n---\n%s\n---\n" PLEASE_REPORT, logmsg); #undef PLEASE_REPORT + + g_free (msg); } @@ -256,31 +280,37 @@ _moo_win32_message_box(GtkWidget *parent, const char *format, ...) { - gstr text; + int ret; + char *text = NULL; HWND parenthwnd = NULL; + wchar_t *wtitle = NULL; + wchar_t *wtext = NULL; if (format) { va_list args; va_start (args, format); - text.set_new (g_strdup_vprintf (format, args)); + text = g_strdup_vprintf (format, args); va_end (args); } if (parent) parent = gtk_widget_get_toplevel (parent); if (parent) - parenthwnd = (HWND) GDK_WINDOW_HWND (parent->window); - - gbuf wtitle; - gbuf wtext; + parenthwnd = GDK_WINDOW_HWND (parent->window); if (title) - wtitle.set_new (reinterpret_cast (g_utf8_to_utf16 (title, -1, NULL, NULL, NULL))); - if (!text.empty ()) - wtext.set_new (reinterpret_cast (g_utf8_to_utf16 (text, -1, NULL, NULL, NULL))); + wtitle = g_utf8_to_utf16 (title, -1, NULL, NULL, NULL); + if (text) + wtext = g_utf8_to_utf16 (text, -1, NULL, NULL, NULL); - return MessageBox (parenthwnd, wtext, wtitle, type); + ret = MessageBox(parenthwnd, wtext, wtitle, type); + + g_free (wtext); + g_free (wtitle); + g_free (text); + + return ret; } @@ -337,7 +367,7 @@ _moo_win32_fnmatch (const char *pattern, const char *string, int flags) { - g_return_val_if_fail (flags == 0, -1); + g_return_val_if_fail (flags != 0, -1); return _moo_glob_match_simple (pattern, string) ? 0 : 1; } diff --git a/moo/mooutils/mooutils.cmake b/moo/mooutils/mooutils.cmake index d7e597e9..b3fb21ff 100644 --- a/moo/mooutils/mooutils.cmake +++ b/moo/mooutils/mooutils.cmake @@ -1,259 +1,243 @@ -SET(moo_utils_enum_headers - mooutils/moodialogs.h - mooutils/moofiledialog.h - mooutils/moouixml.h - mooutils/moowindow.h -) - -SET(mooutils_sources - mooutils/mooutils.cmake - ${moo_utils_enum_headers} - mooutils/mooarray.h - mooutils/mooutils-thread.cpp - mooutils/mooutils-thread.h - mooutils/moohistorymgr.cpp - mooutils/moohistorymgr.h - mooutils/moo-environ.h - mooutils/mooaccel.cpp - mooutils/mooaccel.h - mooutils/mooaccelbutton.cpp - mooutils/mooaccelbutton.h - mooutils/mooaccelprefs.cpp - mooutils/mooaccelprefs.h - mooutils/mooaction-private.h - mooutils/mooaction.cpp - mooutils/mooaction.h - mooutils/mooactionbase-private.h - mooutils/mooactionbase.cpp - mooutils/mooactionbase.h - mooutils/mooactioncollection.cpp - mooutils/mooactioncollection.h - mooutils/mooactionfactory.cpp - mooutils/mooactionfactory.h - mooutils/mooactiongroup.cpp - mooutils/mooactiongroup.h - mooutils/mooapp-ipc.cpp - mooutils/mooapp-ipc.h - mooutils/mooappinput-common.cpp - mooutils/mooappinput-priv.h - mooutils/mooappinput.h - mooutils/mooappinput-win32.cpp - mooutils/mooatom.h - mooutils/moobigpaned.cpp - mooutils/moobigpaned.h - mooutils/mooclosure.cpp - mooutils/mooclosure.h - mooutils/moocombo.cpp - mooutils/moocombo.h - mooutils/moocompat.h - mooutils/moodialogs.cpp - mooutils/mooeditops.cpp - mooutils/mooeditops.h - mooutils/mooencodings-data.h - mooutils/mooencodings.cpp - mooutils/mooencodings.h - mooutils/mooentry.cpp - mooutils/mooentry.h - mooutils/moofiledialog.cpp - mooutils/moofileicon.cpp - mooutils/moofileicon.h - mooutils/moofilewatch.cpp - mooutils/moofilewatch.h - mooutils/moofilewriter.cpp - mooutils/moofilewriter.h - mooutils/moofilewriter-private.h - mooutils/moofiltermgr.cpp - mooutils/moofiltermgr.h - mooutils/moofontsel.c - mooutils/moofontsel.h - mooutils/mooglade.cpp - mooutils/mooglade.h - mooutils/moohelp.cpp - mooutils/moohelp.h - mooutils/moohistorycombo.cpp - mooutils/moohistorycombo.h - mooutils/moohistorylist.cpp - mooutils/moohistorylist.h - mooutils/mooi18n.cpp - mooutils/mooi18n.h - mooutils/moolist.h - mooutils/moomarkup.cpp - mooutils/moomarkup.h - mooutils/moomenu.cpp - mooutils/moomenu.h - mooutils/moomenuaction.cpp - mooutils/moomenuaction.h - mooutils/moomenumgr.cpp - mooutils/moomenumgr.h - mooutils/moomenutoolbutton.cpp - mooutils/moomenutoolbutton.h - mooutils/moo-mime.cpp - mooutils/moo-mime.h - mooutils/moonotebook.cpp - mooutils/moonotebook.h - mooutils/mooonce.h - mooutils/moopane.cpp - mooutils/moopane.h - mooutils/moopaned.cpp - mooutils/moopaned.h - mooutils/mooprefs.cpp - mooutils/mooprefs.h - mooutils/mooprefsdialog.cpp - mooutils/mooprefsdialog.h - mooutils/mooprefspage.cpp - mooutils/mooprefspage.h - mooutils/moospawn.cpp - mooutils/moospawn.h - mooutils/moostock.cpp - mooutils/moostock.h - mooutils/mootype-macros.h - mooutils/moouixml.cpp - mooutils/mooundo.cpp - mooutils/mooundo.h - mooutils/mooundo2.cpp - mooutils/mooundo2.h - mooutils/mooutils.h - mooutils/mooutils-debug.h - mooutils/mooutils-enums.c - mooutils/mooutils-enums.h - mooutils/mooutils-file.cpp - mooutils/mooutils-file.h - mooutils/mooutils-fs.cpp - mooutils/mooutils-fs.h - mooutils/mooutils-gobject-private.h - mooutils/mooutils-gobject.cpp - mooutils/mooutils-gobject.h - mooutils/mooutils-macros.h - mooutils/mooutils-mem.h - mooutils/mooutils-messages.h - mooutils/mooutils-misc.cpp - mooutils/mooutils-misc.h - mooutils/mooutils-script.cpp - mooutils/mooutils-script.h - mooutils/mooutils-tests.h - mooutils/mooutils-treeview.cpp - mooutils/mooutils-treeview.h - mooutils/moowindow.cpp - mooutils/stock-file-24.h - mooutils/stock-file-selector-24.h - mooutils/stock-terminal-24.h -) - -FILE(WRITE ${CMAKE_CURRENT_BINARY_DIR}/genmarshals_c.cmake -"FILE(WRITE marshals.c.tmp \"#include \\\"marshals.h\\\"\") -EXECUTE_PROCESS(COMMAND ${GLIB_GENMARSHAL} --prefix=_moo_marshal --body ${CMAKE_CURRENT_SOURCE_DIR}/marshals.list - OUTPUT_VARIABLE _marshals_body) -FILE(APPEND marshals.c.tmp \"\${_marshals_body}\") -file(RENAME marshals.c.tmp marshals.c) -") -add_custom_command(OUTPUT marshals.c - COMMAND ${CMAKE_COMMAND} -P genmarshals_c.cmake - MAIN_DEPENDENCY marshals.list) -LIST(APPEND built_mooutils_sources marshals.c) - - -# if MOO_DEV_MODE -# built_moo_sources += mooutils/mooutils-enums.h.stamp mooutils/mooutils-enums.c.stamp -# mooutils/mooutils-enums.h.stamp: $(moo_utils_enum_headers) Makefile mooutils/mooutils-enums.tmpl.h -# $(AM_V_at)$(MKDIR_P) mooutils -# $(AM_V_GEN)( cd $(srcdir) && \ -# $(GLIB_MKENUMS) --template mooutils/mooutils-enums.tmpl.h $(moo_utils_enum_headers) ) > mooutils/mooutils-enums.h.tmp -# $(AM_V_at)cmp -s mooutils/mooutils-enums.h.tmp $(srcdir)/mooutils/mooutils-enums.h || \ -# mv mooutils/mooutils-enums.h.tmp $(srcdir)/mooutils/mooutils-enums.h -# $(AM_V_at)rm -f mooutils/mooutils-enums.h.tmp -# $(AM_V_at)echo stamp > mooutils/mooutils-enums.h.stamp -# mooutils/mooutils-enums.c.stamp: $(moo_utils_enum_headers) Makefile mooutils/mooutils-enums.tmpl.c -# $(AM_V_at)$(MKDIR_P) mooutils -# $(AM_V_GEN)( cd $(srcdir) && \ -# $(GLIB_MKENUMS) --template mooutils/mooutils-enums.tmpl.c $(moo_utils_enum_headers) ) > mooutils/mooutils-enums.c.tmp -# $(AM_V_at)cmp -s mooutils/mooutils-enums.c.tmp $(srcdir)/mooutils/mooutils-enums.c || \ -# mv mooutils/mooutils-enums.c.tmp $(srcdir)/mooutils/mooutils-enums.c -# $(AM_V_at)rm -f mooutils/mooutils-enums.c.tmp -# $(AM_V_at)echo stamp > mooutils/mooutils-enums.c.stamp -# endif - -SET(mooutils_win32_sources - mooutils/moofiledialog-win32.cpp - mooutils/moofiledialog-win32.h - mooutils/mooutils-dialog-win32.cpp - mooutils/mooutils-dialog-win32.h - mooutils/mooutils-win32.cpp -) - -if(MOO_BUILD_FROM_MSVC) - LIST(APPEND mooutils_sources - mooglib/moo-stat.h - mooglib/moo-time.h - mooglib/moo-glib.c - mooglib/moo-glib.h - ) -endif() - -SET(mooutils_unittest_sources - mooutils/moo-test-utils.cpp - mooutils/moo-test-utils.h - mooutils/moo-test-macros.h -) - -LIST(APPEND mooutils_extra_dist ${mooutils_win32_sources} ${mooutils_unittest_sources}) - -if(WIN32) - LIST(APPEND mooutils_sources ${mooutils_win32_sources}) -endif() - -LIST(APPEND mooutils_sources ${mooutils_unittest_sources}) - -foreach(input_file - mooutils/glade/mooaccelprefs.glade - mooutils/glade/mooaccelbutton.glade - mooutils/glade/moologwindow.glade -) - ADD_GXML(${input_file}) -endforeach(input_file) - -SET(PIXMAPS - mooutils/pixmaps/hide.png - mooutils/pixmaps/close.png - mooutils/pixmaps/sticky.png - mooutils/pixmaps/detach.png - mooutils/pixmaps/attach.png - mooutils/pixmaps/keepontop.png - mooutils/pixmaps/medit.png -) - -FILE(WRITE ${CMAKE_CURRENT_BINARY_DIR}/genpixbufs.cmake -"EXECUTE_PROCESS(COMMAND ${GDK_PIXBUF_CSOURCE} --static --build-list - MOO_HIDE_ICON ${CMAKE_CURRENT_SOURCE_DIR}/mooutils/pixmaps/hide.png - MOO_CLOSE_ICON ${CMAKE_CURRENT_SOURCE_DIR}/mooutils/pixmaps/close.png - MOO_STICKY_ICON ${CMAKE_CURRENT_SOURCE_DIR}/mooutils/pixmaps/sticky.png - MOO_DETACH_ICON ${CMAKE_CURRENT_SOURCE_DIR}/mooutils/pixmaps/detach.png - MOO_ATTACH_ICON ${CMAKE_CURRENT_SOURCE_DIR}/mooutils/pixmaps/attach.png - MOO_KEEP_ON_TOP_ICON ${CMAKE_CURRENT_SOURCE_DIR}/mooutils/pixmaps/keepontop.png - MEDIT_ICON ${CMAKE_CURRENT_SOURCE_DIR}/mooutils/pixmaps/medit.png - SYMLINK_ARROW ${CMAKE_CURRENT_SOURCE_DIR}/mooutils/pixmaps/symlink.png - SYMLINK_ARROW_SMALL ${CMAKE_CURRENT_SOURCE_DIR}/mooutils/pixmaps/symlink-small.png - OUTPUT_FILE moo-pixbufs.h.tmp) -file(RENAME moo-pixbufs.h.tmp moo-pixbufs.h) -") -add_custom_command(OUTPUT moo-pixbufs.h - COMMAND ${CMAKE_COMMAND} -P genpixbufs.cmake - DEPENDS ) -LIST(APPEND built_mooutils_sources moo-pixbufs.h) - -# built_moo_sources += stock-moo.h moofileicon-symlink.h -# EXTRA_DIST += $(PIXMAPS) -# stock-moo.h: $(PIXMAPS) -# $(AM_V_GEN)$(GDK_PIXBUF_CSOURCE) --static --build-list \ -# MOO_HIDE_ICON $(moo_srcdir)/mooutils/pixmaps/hide.png \ -# MOO_CLOSE_ICON $(moo_srcdir)/mooutils/pixmaps/close.png \ -# MOO_STICKY_ICON $(moo_srcdir)/mooutils/pixmaps/sticky.png \ -# MOO_DETACH_ICON $(moo_srcdir)/mooutils/pixmaps/detach.png \ -# MOO_ATTACH_ICON $(moo_srcdir)/mooutils/pixmaps/attach.png \ -# MOO_KEEP_ON_TOP_ICON $(moo_srcdir)/mooutils/pixmaps/keepontop.png \ -# MEDIT_ICON $(moo_srcdir)/mooutils/pixmaps/medit.png \ -# > $@.tmp && mv $@.tmp $@ -# -# EXTRA_DIST += mooutils/pixmaps/symlink.png mooutils/pixmaps/symlink-small.png -# moofileicon-symlink.h: mooutils/pixmaps/symlink.png mooutils/pixmaps/symlink-small.png -# $(AM_V_GEN)$(GDK_PIXBUF_CSOURCE) --static --build-list \ -# > $@.tmp && mv $@.tmp $@ +SET(moo_utils_enum_headers + mooutils/moodialogs.h + mooutils/moofiledialog.h + mooutils/moouixml.h + mooutils/moowindow.h +) + +SET(mooutils_sources + mooutils/mooutils.cmake + ${moo_utils_enum_headers} + mooutils/mooarray.h + mooutils/mooutils-thread.c + mooutils/mooutils-thread.h + mooutils/moohistorymgr.c + mooutils/moohistorymgr.h + mooutils/moo-environ.h + mooutils/mooaccel.c + mooutils/mooaccel.h + mooutils/mooaccelbutton.c + mooutils/mooaccelbutton.h + mooutils/mooaccelprefs.c + mooutils/mooaccelprefs.h + mooutils/mooaction-private.h + mooutils/mooaction.c + mooutils/mooaction.h + mooutils/mooactionbase-private.h + mooutils/mooactionbase.c + mooutils/mooactionbase.h + mooutils/mooactioncollection.c + mooutils/mooactioncollection.h + mooutils/mooactionfactory.c + mooutils/mooactionfactory.h + mooutils/mooactiongroup.c + mooutils/mooactiongroup.h + mooutils/mooapp-ipc.c + mooutils/mooapp-ipc.h + mooutils/mooappinput-common.c + mooutils/mooappinput-priv.h + mooutils/mooappinput.h + mooutils/mooappinput-win32.c + mooutils/mooatom.h + mooutils/moobigpaned.c + mooutils/moobigpaned.h + mooutils/mooclosure.c + mooutils/mooclosure.h + mooutils/moocombo.c + mooutils/moocombo.h + mooutils/moocompat.h + mooutils/moodialogs.c + mooutils/mooeditops.c + mooutils/mooeditops.h + mooutils/mooencodings-data.h + mooutils/mooencodings.c + mooutils/mooencodings.h + mooutils/mooentry.c + mooutils/mooentry.h + mooutils/moofiledialog.c + mooutils/moofileicon.c + mooutils/moofileicon.h + mooutils/moofilewatch.c + mooutils/moofilewatch.h + mooutils/moofilewriter.c + mooutils/moofilewriter.h + mooutils/moofilewriter-private.h + mooutils/moofiltermgr.c + mooutils/moofiltermgr.h + mooutils/moofontsel.c + mooutils/moofontsel.h + mooutils/mooglade.c + mooutils/mooglade.h + mooutils/moohelp.c + mooutils/moohelp.h + mooutils/moohistorycombo.c + mooutils/moohistorycombo.h + mooutils/moohistorylist.c + mooutils/moohistorylist.h + mooutils/mooi18n.c + mooutils/mooi18n.h + mooutils/moolist.h + mooutils/moomarkup.c + mooutils/moomarkup.h + mooutils/moomenu.c + mooutils/moomenu.h + mooutils/moomenuaction.c + mooutils/moomenuaction.h + mooutils/moomenumgr.c + mooutils/moomenumgr.h + mooutils/moomenutoolbutton.c + mooutils/moomenutoolbutton.h + mooutils/moo-mime.c + mooutils/moo-mime.h + mooutils/moonotebook.c + mooutils/moonotebook.h + mooutils/mooonce.h + mooutils/moopane.c + mooutils/moopane.h + mooutils/moopaned.c + mooutils/moopaned.h + mooutils/mooprefs.c + mooutils/mooprefs.h + mooutils/mooprefsdialog.c + mooutils/mooprefsdialog.h + mooutils/mooprefspage.c + mooutils/mooprefspage.h + mooutils/moospawn.c + mooutils/moospawn.h + mooutils/moostock.c + mooutils/moostock.h + mooutils/mootype-macros.h + mooutils/moouixml.c + mooutils/mooundo.c + mooutils/mooundo.h + mooutils/mooutils.h + mooutils/mooutils-debug.h + mooutils/mooutils-enums.c + mooutils/mooutils-enums.h + mooutils/mooutils-file.c + mooutils/mooutils-file.h + mooutils/mooutils-fs.c + mooutils/mooutils-fs.h + mooutils/mooutils-gobject-private.h + mooutils/mooutils-gobject.c + mooutils/mooutils-gobject.h + mooutils/mooutils-macros.h + mooutils/mooutils-mem.h + mooutils/mooutils-messages.h + mooutils/mooutils-misc.c + mooutils/mooutils-misc.h + mooutils/mooutils-script.c + mooutils/mooutils-script.h + mooutils/mooutils-tests.h + mooutils/mooutils-treeview.c + mooutils/mooutils-treeview.h + mooutils/moowindow.c + mooutils/stock-file-24.h + mooutils/stock-file-selector-24.h + mooutils/stock-terminal-24.h +) + +FILE(WRITE ${CMAKE_CURRENT_BINARY_DIR}/genmarshals_c.cmake +"FILE(WRITE marshals.c.tmp \"#include \\\"marshals.h\\\"\") +EXECUTE_PROCESS(COMMAND ${GLIB_GENMARSHAL} --prefix=_moo_marshal --body ${CMAKE_CURRENT_SOURCE_DIR}/marshals.list + OUTPUT_VARIABLE _marshals_body) +FILE(APPEND marshals.c.tmp \"\${_marshals_body}\") +file(RENAME marshals.c.tmp marshals.c) +") +add_custom_command(OUTPUT marshals.c + COMMAND ${CMAKE_COMMAND} -P genmarshals_c.cmake + MAIN_DEPENDENCY marshals.list) +LIST(APPEND built_mooutils_sources marshals.c) + + +# if MOO_DEV_MODE +# built_moo_sources += mooutils/mooutils-enums.h.stamp mooutils/mooutils-enums.c.stamp +# mooutils/mooutils-enums.h.stamp: $(moo_utils_enum_headers) Makefile mooutils/mooutils-enums.tmpl.h +# $(AM_V_at)$(MKDIR_P) mooutils +# $(AM_V_GEN)( cd $(srcdir) && \ +# $(GLIB_MKENUMS) --template mooutils/mooutils-enums.tmpl.h $(moo_utils_enum_headers) ) > mooutils/mooutils-enums.h.tmp +# $(AM_V_at)cmp -s mooutils/mooutils-enums.h.tmp $(srcdir)/mooutils/mooutils-enums.h || \ +# mv mooutils/mooutils-enums.h.tmp $(srcdir)/mooutils/mooutils-enums.h +# $(AM_V_at)rm -f mooutils/mooutils-enums.h.tmp +# $(AM_V_at)echo stamp > mooutils/mooutils-enums.h.stamp +# mooutils/mooutils-enums.c.stamp: $(moo_utils_enum_headers) Makefile mooutils/mooutils-enums.tmpl.c +# $(AM_V_at)$(MKDIR_P) mooutils +# $(AM_V_GEN)( cd $(srcdir) && \ +# $(GLIB_MKENUMS) --template mooutils/mooutils-enums.tmpl.c $(moo_utils_enum_headers) ) > mooutils/mooutils-enums.c.tmp +# $(AM_V_at)cmp -s mooutils/mooutils-enums.c.tmp $(srcdir)/mooutils/mooutils-enums.c || \ +# mv mooutils/mooutils-enums.c.tmp $(srcdir)/mooutils/mooutils-enums.c +# $(AM_V_at)rm -f mooutils/mooutils-enums.c.tmp +# $(AM_V_at)echo stamp > mooutils/mooutils-enums.c.stamp +# endif + +SET(mooutils_win32_sources + mooutils/mooutils-win32.c +) +SET(mooutils_unittest_sources + mooutils/moo-test-utils.c + mooutils/moo-test-utils.h + mooutils/moo-test-macros.h +) + +LIST(APPEND mooutils_extra_dist ${mooutils_win32_sources} ${mooutils_unittest_sources}) + +if(WIN32) + LIST(APPEND mooutils_sources ${mooutils_win32_sources}) +endif() + +LIST(APPEND mooutils_sources ${mooutils_unittest_sources}) + +foreach(input_file + mooutils/glade/mooaccelprefs.glade + mooutils/glade/mooaccelbutton.glade + mooutils/glade/moologwindow.glade +) + ADD_GXML(${input_file}) +endforeach(input_file) + +SET(PIXMAPS + mooutils/pixmaps/hide.png + mooutils/pixmaps/close.png + mooutils/pixmaps/sticky.png + mooutils/pixmaps/detach.png + mooutils/pixmaps/attach.png + mooutils/pixmaps/keepontop.png + mooutils/pixmaps/medit.png +) + +FILE(WRITE ${CMAKE_CURRENT_BINARY_DIR}/genpixbufs.cmake +"EXECUTE_PROCESS(COMMAND ${GDK_PIXBUF_CSOURCE} --static --build-list + MOO_HIDE_ICON ${CMAKE_CURRENT_SOURCE_DIR}/mooutils/pixmaps/hide.png + MOO_CLOSE_ICON ${CMAKE_CURRENT_SOURCE_DIR}/mooutils/pixmaps/close.png + MOO_STICKY_ICON ${CMAKE_CURRENT_SOURCE_DIR}/mooutils/pixmaps/sticky.png + MOO_DETACH_ICON ${CMAKE_CURRENT_SOURCE_DIR}/mooutils/pixmaps/detach.png + MOO_ATTACH_ICON ${CMAKE_CURRENT_SOURCE_DIR}/mooutils/pixmaps/attach.png + MOO_KEEP_ON_TOP_ICON ${CMAKE_CURRENT_SOURCE_DIR}/mooutils/pixmaps/keepontop.png + MEDIT_ICON ${CMAKE_CURRENT_SOURCE_DIR}/mooutils/pixmaps/medit.png + SYMLINK_ARROW ${CMAKE_CURRENT_SOURCE_DIR}/mooutils/pixmaps/symlink.png + SYMLINK_ARROW_SMALL ${CMAKE_CURRENT_SOURCE_DIR}/mooutils/pixmaps/symlink-small.png + OUTPUT_FILE moo-pixbufs.h.tmp) +file(RENAME moo-pixbufs.h.tmp moo-pixbufs.h) +") +add_custom_command(OUTPUT moo-pixbufs.h + COMMAND ${CMAKE_COMMAND} -P genpixbufs.cmake + DEPENDS ) +LIST(APPEND built_mooutils_sources moo-pixbufs.h) + +# built_moo_sources += stock-moo.h moofileicon-symlink.h +# EXTRA_DIST += $(PIXMAPS) +# stock-moo.h: $(PIXMAPS) +# $(AM_V_GEN)$(GDK_PIXBUF_CSOURCE) --static --build-list \ +# MOO_HIDE_ICON $(moo_srcdir)/mooutils/pixmaps/hide.png \ +# MOO_CLOSE_ICON $(moo_srcdir)/mooutils/pixmaps/close.png \ +# MOO_STICKY_ICON $(moo_srcdir)/mooutils/pixmaps/sticky.png \ +# MOO_DETACH_ICON $(moo_srcdir)/mooutils/pixmaps/detach.png \ +# MOO_ATTACH_ICON $(moo_srcdir)/mooutils/pixmaps/attach.png \ +# MOO_KEEP_ON_TOP_ICON $(moo_srcdir)/mooutils/pixmaps/keepontop.png \ +# MEDIT_ICON $(moo_srcdir)/mooutils/pixmaps/medit.png \ +# > $@.tmp && mv $@.tmp $@ +# +# EXTRA_DIST += mooutils/pixmaps/symlink.png mooutils/pixmaps/symlink-small.png +# moofileicon-symlink.h: mooutils/pixmaps/symlink.png mooutils/pixmaps/symlink-small.png +# $(AM_V_GEN)$(GDK_PIXBUF_CSOURCE) --static --build-list \ +# > $@.tmp && mv $@.tmp $@ diff --git a/moo/mooutils/moowin32/mingw/fnmatch.h b/moo/mooutils/moowin32/mingw/fnmatch.h index 991cc885..ce218300 100644 --- a/moo/mooutils/moowin32/mingw/fnmatch.h +++ b/moo/mooutils/moowin32/mingw/fnmatch.h @@ -1,13 +1,13 @@ -#pragma once +#ifndef MOO_FNMATCH_H +#define MOO_FNMATCH_H // #include "mooutils/mooutils-misc.h" // #include "mooutils/mooutils-fs.h" -G_BEGIN_DECLS - #define fnmatch _moo_win32_fnmatch int _moo_win32_fnmatch (const char *pattern, const char *string, int flags); -G_END_DECLS + +#endif /* MOO_FNMATCH_H */ diff --git a/moo/mooutils/moowin32/ms/fnmatch.h b/moo/mooutils/moowin32/ms/fnmatch.h index 22b394bf..ce218300 100644 --- a/moo/mooutils/moowin32/ms/fnmatch.h +++ b/moo/mooutils/moowin32/ms/fnmatch.h @@ -1,13 +1,13 @@ -#pragma once +#ifndef MOO_FNMATCH_H +#define MOO_FNMATCH_H // #include "mooutils/mooutils-misc.h" // #include "mooutils/mooutils-fs.h" #define fnmatch _moo_win32_fnmatch - -#ifdef __cplusplus -extern "C" -#endif int _moo_win32_fnmatch (const char *pattern, const char *string, int flags); + + +#endif /* MOO_FNMATCH_H */ diff --git a/moo/mooutils/moowin32/ms/sys/time.h b/moo/mooutils/moowin32/ms/sys/time.h index 404421e4..30816ee2 100644 --- a/moo/mooutils/moowin32/ms/sys/time.h +++ b/moo/mooutils/moowin32/ms/sys/time.h @@ -1,12 +1,11 @@ -#pragma once +#ifndef MOO_SYS_TIME_H +#define MOO_SYS_TIME_H /* for struct timeval */ #include -G_BEGIN_DECLS - #define gettimeofday _moo_win32_gettimeofday int _moo_win32_gettimeofday (struct timeval *tp, void *tzp); -G_END_DECLS +#endif /* MOO_SYS_TIME_H */ diff --git a/moo/mooutils/moowindow.cpp b/moo/mooutils/moowindow.c similarity index 92% rename from moo/mooutils/moowindow.cpp rename to moo/mooutils/moowindow.c index dfecbc2b..1af858f1 100644 --- a/moo/mooutils/moowindow.cpp +++ b/moo/mooutils/moowindow.c @@ -37,18 +37,17 @@ #include #include -using namespace moo; -const gstr PREFS_REMEMBER_SIZE = gstr::wrap_const ("window/remember_size"); -const gstr PREFS_X = gstr::wrap_const ("window/x"); -const gstr PREFS_Y = gstr::wrap_const ("window/y"); -const gstr PREFS_WIDTH = gstr::wrap_const ("window/width"); -const gstr PREFS_HEIGHT = gstr::wrap_const ("window/height"); -const gstr PREFS_MAXIMIZED = gstr::wrap_const ("window/maximized"); -const gstr PREFS_SHOW_TOOLBAR = gstr::wrap_const ("window/show_toolbar"); -const gstr PREFS_SHOW_MENUBAR = gstr::wrap_const ("window/show_menubar"); -const gstr PREFS_SHOW_STATUSBAR = gstr::wrap_const ("window/show_statusbar"); -const gstr PREFS_TOOLBAR_STYLE = gstr::wrap_const ("window/toolbar_style"); +#define PREFS_REMEMBER_SIZE "window/remember_size" +#define PREFS_X "window/x" +#define PREFS_Y "window/y" +#define PREFS_WIDTH "window/width" +#define PREFS_HEIGHT "window/height" +#define PREFS_MAXIMIZED "window/maximized" +#define PREFS_SHOW_TOOLBAR "window/show_toolbar" +#define PREFS_SHOW_MENUBAR "window/show_menubar" +#define PREFS_SHOW_STATUSBAR "window/show_statusbar" +#define PREFS_TOOLBAR_STYLE "window/toolbar_style" #define DEFAULT_X -1000000 // an impossible window position #define DEFAULT_Y -1000000 // an impossible window position @@ -59,41 +58,33 @@ static char *default_geometry = NULL; static GSList *window_instances = NULL; -struct MooWindowPrivate -{ - MooWindowPrivate() - { - global_accels_mode = false; - } +struct _MooWindowPrivate { + guint save_size_id; - guint save_size_id = 0; - - gstr toolbar_ui_name; - GtkWidget *toolbar_holder = nullptr; + char *toolbar_ui_name; + GtkWidget *toolbar_holder; gboolean toolbar_visible; - gstr menubar_ui_name; - GtkWidget *menubar_holder = nullptr; + char *menubar_ui_name; + GtkWidget *menubar_holder; gboolean menubar_visible; gboolean statusbar_visible; - gobj_ptr ui_xml; - gobj_ptr actions; - gstr name; - gstr id; + MooUiXml *ui_xml; + MooActionCollection *actions; + char *name; + char *id; - GSList *global_accels = nullptr; - guint update_accels_idle = 0; + GSList *global_accels; + guint update_accels_idle; - GtkWidget *eo_widget = nullptr; - GtkWidget *default_eo_widget = nullptr; - GtkWidget *uo_widget = nullptr; - GtkWidget *default_uo_widget = nullptr; + GtkWidget *eo_widget; + GtkWidget *default_eo_widget; + GtkWidget *uo_widget; + GtkWidget *default_uo_widget; guint global_accels_mode : 1; - - gstrmap settings; }; typedef struct { @@ -102,23 +93,19 @@ typedef struct { GtkAction *action; } AccelEntry; -static const gstr& setting (MooWindow *window, const gstr& s) +static const char *setting (MooWindow *window, const char *s) { - g_return_val_if_fail (!s.empty(), gstr::null); + static GString *key = NULL; - auto itr = window->priv->settings.find(s); - if (itr != window->priv->settings.end()) - return itr->second; + if (!key) + key = g_string_new (NULL); - gstr key; - - if (!window->priv->id.empty()) - key = gstr::printf ("%s/%s", window->priv->id, s); + if (window->priv->id) + g_string_printf (key, "%s/%s", window->priv->id, s); else - key = s; + g_string_assign (key, s); - auto pr = window->priv->settings.insert (std::make_pair (s, std::move (key))); - return pr.first->second; + return key->str; } static void init_prefs (MooWindow *window); @@ -480,9 +467,9 @@ moo_window_constructor (GType type, window = MOO_WINDOW (object); - klass = MOO_WINDOW_CLASS (g_type_class_ref (type)); + klass = g_type_class_ref (type); moo_window_set_id (window, moo_window_class_get_id (klass)); - window->priv->name.set_new (g_strdup (moo_window_class_get_name (klass))); + window->priv->name = g_strdup (moo_window_class_get_name (klass)); init_prefs (window); @@ -593,7 +580,7 @@ moo_window_init (MooWindow *window) { GtkWidget *rg; - window->priv = new (MooWindowPrivate); + window->priv = g_new0 (MooWindowPrivate, 1); window->vbox = gtk_vbox_new (FALSE, 0); gtk_widget_show (window->vbox); @@ -601,23 +588,20 @@ moo_window_init (MooWindow *window) parse_shadow_style (); window->status_area = gtk_hbox_new (FALSE, 0); - window->statusbar = GTK_STATUSBAR (g_object_new (GTK_TYPE_STATUSBAR, - "has-resize-grip", FALSE, - nullptr)); + window->statusbar = g_object_new (GTK_TYPE_STATUSBAR, + "has-resize-grip", FALSE, + (const char*) NULL); gtk_widget_set_name (GTK_WIDGET (window->statusbar), "no-shadow"); gtk_box_pack_start (GTK_BOX (window->status_area), GTK_WIDGET (window->statusbar), TRUE, TRUE, 0); - + rg = g_object_new (GTK_TYPE_STATUSBAR, #ifdef GDK_WINDOWING_QUARTZ - const gboolean has_resize_grip = FALSE; + "has-resize-grip", FALSE, #else - const gboolean has_resize_grip = TRUE; + "has-resize-grip", TRUE, #endif - - rg = GTK_WIDGET (g_object_new (GTK_TYPE_STATUSBAR, - "has-resize-grip", has_resize_grip, - nullptr)); + (const char*) NULL); gtk_widget_set_name (rg, "no-shadow"); gtk_box_pack_end (GTK_BOX (window->status_area), rg, FALSE, FALSE, 0); @@ -649,10 +633,13 @@ moo_window_dispose (GObject *object) window->priv->default_uo_widget = NULL; moo_window_disconnect_uo_widget (window); + if (window->priv->ui_xml) + g_object_unref (window->priv->ui_xml); + if (window->priv->actions) { - _moo_action_collection_set_window (window->priv->actions.gobj (), NULL); - window->priv->actions.reset (); + _moo_action_collection_set_window (window->priv->actions, NULL); + g_object_unref (window->priv->actions); } g_slist_foreach (window->priv->global_accels, @@ -662,6 +649,11 @@ moo_window_dispose (GObject *object) if (window->priv->update_accels_idle) g_source_remove (window->priv->update_accels_idle); + g_free (window->priv->name); + g_free (window->priv->id); + g_free (window->priv->menubar_ui_name); + g_free (window->priv->toolbar_ui_name); + if (window->accel_group) g_object_unref (window->accel_group); @@ -669,7 +661,7 @@ moo_window_dispose (GObject *object) g_source_remove (window->priv->save_size_id); window->priv->save_size_id = 0; - delete window->priv; + g_free (window->priv); window->priv = NULL; } @@ -681,7 +673,7 @@ static gboolean moo_window_delete_event (GtkWidget *widget, G_GNUC_UNUSED GdkEventAny *event) { - MooCloseResponse result = MooCloseResponse (0); + MooCloseResponse result = FALSE; g_signal_emit_by_name (widget, "close", &result); return TRUE; } @@ -695,7 +687,7 @@ accel_entry_new (guint key, AccelEntry *entry = g_slice_new0 (AccelEntry); entry->keyval = key; entry->modifiers = mods; - entry->action = object_ref (action); + entry->action = g_object_ref (action); return entry; } @@ -720,16 +712,16 @@ update_accels (MooWindow *window) g_slist_free (window->priv->global_accels); window->priv->global_accels = NULL; - for (l = moo_action_collection_get_groups (window->priv->actions.gobj ()); l != NULL; l = l->next) + for (l = moo_action_collection_get_groups (window->priv->actions); l != NULL; l = l->next) { - GtkActionGroup *group = GTK_ACTION_GROUP (l->data); + GtkActionGroup *group = l->data; GList *actions; actions = gtk_action_group_list_actions (group); while (actions != NULL) { - GtkAction *action = GTK_ACTION (actions->data); + GtkAction *action = actions->data; const char *accel_path = NULL; if (MOO_IS_ACTION (action) && @@ -764,7 +756,7 @@ accels_changed (MooWindow *window) { if (!window->priv->update_accels_idle) window->priv->update_accels_idle = - g_idle_add ((GSourceFunc) update_accels, window); + gdk_threads_add_idle ((GSourceFunc) update_accels, window); } static gboolean @@ -782,7 +774,7 @@ activate_global_accel (MooWindow *window, for (l = window->priv->global_accels; l != NULL; l = l->next) { - AccelEntry *entry = reinterpret_cast (l->data); + AccelEntry *entry = l->data; if (entry->keyval == keyval && entry->modifiers == mods) { @@ -867,7 +859,7 @@ moo_window_save_size (MooWindow *window) { if (!window->priv->save_size_id) window->priv->save_size_id = - g_idle_add ((GSourceFunc) save_size, window); + gdk_threads_add_idle ((GSourceFunc)save_size, window); return FALSE; } @@ -923,18 +915,18 @@ moo_window_set_property (GObject *object, { case PROP_TOOLBAR_UI_NAME: name = g_value_get_string (value); - window->priv->toolbar_ui_name.set (name); + MOO_ASSIGN_STRING (window->priv->toolbar_ui_name, MOO_NZS (name)); g_object_notify (object, "toolbar-ui-name"); break; case PROP_MENUBAR_UI_NAME: name = g_value_get_string (value); - window->priv->menubar_ui_name.set (name); + MOO_ASSIGN_STRING (window->priv->menubar_ui_name, MOO_NZS (name)); g_object_notify (object, "menubar-ui-name"); break; case PROP_UI_XML: - moo_window_set_ui_xml (window, object_cast_opt (g_value_get_object (value))); + moo_window_set_ui_xml (window, g_value_get_object (value)); break; case PROP_TOOLBAR_VISIBLE: @@ -986,7 +978,7 @@ moo_window_get_property (GObject *object, break; case PROP_UI_XML: - g_value_set_object (value, window->priv->ui_xml.gobj ()); + g_value_set_object (value, window->priv->ui_xml); break; case PROP_MENUBAR: @@ -1070,30 +1062,32 @@ moo_window_update_toolbar (MooWindow *window) { MooUiXml *xml; GtkToolbarStyle style; + char *ui_name; MooActionCollection *actions; g_return_if_fail (MOO_IS_WINDOW (window)); actions = moo_window_get_actions (window); xml = moo_window_get_ui_xml (window); - const gstr& ui_name = window->priv->toolbar_ui_name; + ui_name = window->priv->toolbar_ui_name; + ui_name = ui_name && ui_name[0] ? ui_name : NULL; if (window->toolbar) { MooUiXml *old_xml; char *old_name; - old_xml = object_cast_opt (g_object_get_data (G_OBJECT (window->toolbar), "moo-window-ui-xml")); - old_name = reinterpret_cast (g_object_get_data (G_OBJECT (window->toolbar), "moo-window-ui-name")); + old_xml = g_object_get_data (G_OBJECT (window->toolbar), "moo-window-ui-xml"); + old_name = g_object_get_data (G_OBJECT (window->toolbar), "moo-window-ui-name"); - if (!old_xml || old_xml != xml || ui_name != old_name) + if (!old_xml || old_xml != xml || !ui_name || strcmp (ui_name, old_name)) { gtk_widget_destroy (window->toolbar); window->toolbar = NULL; } } - if (window->toolbar || !xml || ui_name.empty()) + if (window->toolbar || !xml || !ui_name) return; window->toolbar = moo_ui_xml_create_widget (xml, MOO_UI_TOOLBAR, @@ -1120,30 +1114,32 @@ static void moo_window_update_menubar (MooWindow *window) { MooUiXml *xml; + char *ui_name; MooActionCollection *actions; g_return_if_fail (MOO_IS_WINDOW (window)); actions = moo_window_get_actions (window); xml = moo_window_get_ui_xml (window); - const gstr& ui_name = window->priv->menubar_ui_name; + ui_name = window->priv->menubar_ui_name; + ui_name = ui_name && ui_name[0] ? ui_name : NULL; if (window->menubar) { MooUiXml *old_xml; char *old_name; - old_xml = object_cast_opt (g_object_get_data (G_OBJECT (window->menubar), "moo-window-ui-xml")); - old_name = reinterpret_cast (g_object_get_data (G_OBJECT (window->menubar), "moo-window-ui-name")); + old_xml = g_object_get_data (G_OBJECT (window->menubar), "moo-window-ui-xml"); + old_name = g_object_get_data (G_OBJECT (window->menubar), "moo-window-ui-name"); - if (!old_xml || old_xml != xml || ui_name != old_name) + if (!old_xml || old_xml != xml || !ui_name || strcmp (ui_name, old_name)) { gtk_widget_destroy (window->menubar); window->menubar = NULL; } } - if (window->menubar || !xml || ui_name.empty ()) + if (window->menubar || !xml || !ui_name) return; window->menubar = moo_ui_xml_create_widget (xml, MOO_UI_MENUBAR, @@ -1184,7 +1180,7 @@ static void set_ui_elm_visible (MooWindow *window, gboolean *flag, const char *prop, - const gstr& prefs_key, + const char *prefs_key, GtkWidget *widget, gboolean visible) { @@ -1232,7 +1228,7 @@ static void toolbar_style_toggled (MooWindow *window, gpointer data) { - GtkToolbarStyle style = GtkToolbarStyle (GPOINTER_TO_INT (data)); + GtkToolbarStyle style = GPOINTER_TO_INT (data); if (window->toolbar) gtk_toolbar_set_style (GTK_TOOLBAR (window->toolbar), style); moo_prefs_set_int (setting (window, PREFS_TOOLBAR_STYLE), style); @@ -1301,7 +1297,7 @@ get_toolbar_style_gtk (MooWindow *window) g_object_get (settings, "gtk-toolbar-style", &style, NULL); g_type_class_unref (toolbar_class); - g_return_val_if_fail (style < N_STYLES, GtkToolbarStyle (0)); + g_return_val_if_fail (style < N_STYLES, 0); return style; } @@ -1325,7 +1321,7 @@ init_prefs (MooWindow *window) static GtkToolbarStyle get_toolbar_style (MooWindow *window) { - GtkToolbarStyle s = GtkToolbarStyle (moo_prefs_get_int (setting (window, PREFS_TOOLBAR_STYLE))); + GtkToolbarStyle s = moo_prefs_get_int (setting (window, PREFS_TOOLBAR_STYLE)); g_return_val_if_fail (s < N_STYLES, GTK_TOOLBAR_ICONS); return s; } @@ -1376,7 +1372,7 @@ action_info_new (MooActionFactory *action, g_return_val_if_fail (MOO_IS_ACTION_FACTORY (action), NULL); info = g_new0 (ActionInfo, 1); - info->action = object_ref (action); + info->action = g_object_ref (action); info->group = g_strdup (group); info->conditions = g_strdupv (conditions); info->closure = closure; @@ -1420,14 +1416,14 @@ action_store_new (void) static ActionStore * type_get_store (GType type) { - return reinterpret_cast (g_type_get_qdata (type, MOO_WINDOW_ACTIONS_QUARK)); + return g_type_get_qdata (type, MOO_WINDOW_ACTIONS_QUARK); } static ActionStore * type_ensure_store (GType type) { - ActionStore *store = reinterpret_cast (g_type_get_qdata (type, MOO_WINDOW_ACTIONS_QUARK)); + ActionStore *store = g_type_get_qdata (type, MOO_WINDOW_ACTIONS_QUARK); if (!store) { @@ -1448,7 +1444,7 @@ action_activated (GtkAction *action, GValue *retval_ptr = NULL; GValue *instance_and_params; - closure = reinterpret_cast (g_object_get_data (G_OBJECT (action), "moo-window-action-closure")); + closure = g_object_get_data (G_OBJECT (action), "moo-window-action-closure"); g_return_if_fail (closure != NULL); instance_and_params = g_new (GValue, info->n_args + 1); @@ -1565,7 +1561,7 @@ moo_window_class_get_id (MooWindowClass *klass) g_return_val_if_fail (MOO_IS_WINDOW_CLASS (klass), NULL); type = G_OBJECT_CLASS_TYPE (klass); - return reinterpret_cast (g_type_get_qdata (type, MOO_WINDOW_ID_QUARK)); + return g_type_get_qdata (type, MOO_WINDOW_ID_QUARK); } @@ -1577,7 +1573,7 @@ moo_window_class_get_name (MooWindowClass *klass) g_return_val_if_fail (MOO_IS_WINDOW_CLASS (klass), NULL); type = G_OBJECT_CLASS_TYPE (klass); - return reinterpret_cast (g_type_get_qdata (type, MOO_WINDOW_NAME_QUARK)); + return g_type_get_qdata (type, MOO_WINDOW_NAME_QUARK); } @@ -1611,11 +1607,11 @@ moo_window_class_install_action (MooWindowClass *klass, { if (g_type_is_a (G_OBJECT_TYPE (l->data), type)) { - GtkAction *action = create_action (action_id, info, MOO_WINDOW (l->data)); + GtkAction *action = create_action (action_id, info, l->data); if (action) { - moo_window_add_action (MOO_WINDOW (l->data), group, action); + moo_window_add_action (l->data, group, action); g_object_unref (action); } } @@ -1632,7 +1628,7 @@ custom_action_factory_func (MooWindow *window, g_return_val_if_fail (MOO_IS_WINDOW (window), NULL); - func = reinterpret_cast (g_object_get_data (G_OBJECT (factory), "moo-window-class-action-func")); + func = g_object_get_data (G_OBJECT (factory), "moo-window-class-action-func"); func_data = g_object_get_data (G_OBJECT (factory), "moo-window-class-action-func-data"); g_return_val_if_fail (func != NULL, NULL); @@ -1656,7 +1652,7 @@ moo_window_class_new_action_custom (MooWindowClass *klass, g_return_if_fail (func != NULL); action_factory = moo_action_factory_new_func ((MooActionFactoryFunc) custom_action_factory_func, NULL); - g_object_set_data (G_OBJECT (action_factory), "moo-window-class-action-func", reinterpret_cast (func)); + g_object_set_data (G_OBJECT (action_factory), "moo-window-class-action-func", func); g_object_set_data_full (G_OBJECT (action_factory), "moo-window-class-action-func-data", data, notify); @@ -1713,7 +1709,7 @@ moo_window_class_remove_action (MooWindowClass *klass, for (l = window_instances; l != NULL; l = l->next) if (g_type_is_a (G_OBJECT_TYPE (l->data), type)) - moo_window_remove_action (MOO_WINDOW (l->data), action_id); + moo_window_remove_action (l->data, action_id); } @@ -1739,8 +1735,8 @@ moo_window_class_new_group (MooWindowClass *klass, { if (g_type_is_a (G_OBJECT_TYPE (l->data), type)) { - MooWindow *window = MOO_WINDOW (l->data); - moo_action_collection_add_group (window->priv->actions.gobj (), name, display_name); + MooWindow *window = l->data; + moo_action_collection_add_group (window->priv->actions, name, display_name); } } } @@ -1784,10 +1780,10 @@ moo_window_class_remove_group (MooWindowClass *klass, { if (g_type_is_a (G_OBJECT_TYPE (l->data), type)) { - MooWindow *window = MOO_WINDOW (l->data); - GtkActionGroup *group = moo_action_collection_get_group (window->priv->actions.gobj (), name); + MooWindow *window = l->data; + GtkActionGroup *group = moo_action_collection_get_group (window->priv->actions, name); if (group) - moo_action_collection_remove_group (window->priv->actions.gobj (), group); + moo_action_collection_remove_group (window->priv->actions, group); } } } @@ -1797,7 +1793,7 @@ MooUiXml* moo_window_get_ui_xml (MooWindow *window) { g_return_val_if_fail (MOO_IS_WINDOW (window), NULL); - return window->priv->ui_xml.gobj (); + return window->priv->ui_xml; } @@ -1811,7 +1807,10 @@ moo_window_set_ui_xml (MooWindow *window, if (xml && xml == window->priv->ui_xml) return; - window->priv->ui_xml.set_new (xml ? object_ref (xml) : moo_ui_xml_new ()); + if (window->priv->ui_xml) + g_object_unref (window->priv->ui_xml); + + window->priv->ui_xml = xml ? g_object_ref (xml) : moo_ui_xml_new (); g_object_notify (G_OBJECT (window), "ui-xml"); } @@ -1821,7 +1820,7 @@ MooActionCollection * moo_window_get_actions (MooWindow *window) { g_return_val_if_fail (MOO_IS_WINDOW (window), NULL); - return window->priv->actions.gobj (); + return window->priv->actions; } @@ -1831,7 +1830,7 @@ moo_window_get_action (MooWindow *window, { g_return_val_if_fail (MOO_IS_WINDOW (window), NULL); g_return_val_if_fail (action != NULL, NULL); - return moo_action_collection_get_action (window->priv->actions.gobj (), action); + return moo_action_collection_get_action (window->priv->actions, action); } @@ -1840,7 +1839,10 @@ moo_window_set_id (MooWindow *window, const char *id) { if (id) - window->priv->id.set (id); + { + g_free (window->priv->id); + window->priv->id = g_strdup (id); + } } @@ -1863,7 +1865,7 @@ add_group (const char *name, const char *display_name, MooWindow *window) { - moo_action_collection_add_group (window->priv->actions.gobj (), name, display_name); + moo_action_collection_add_group (window->priv->actions, name, display_name); } static void @@ -1873,9 +1875,9 @@ moo_window_create_class_actions (MooWindow *window) g_return_if_fail (MOO_IS_WINDOW (window)); - window->priv->actions.set_new (moo_action_collection_new (window->priv->id, - window->priv->name)); - _moo_action_collection_set_window (window->priv->actions.gobj (), window); + window->priv->actions = moo_action_collection_new (window->priv->id, + window->priv->name); + _moo_action_collection_set_window (window->priv->actions, window); type = G_OBJECT_TYPE (window); @@ -2034,7 +2036,7 @@ G_STMT_START { break; \ } \ \ - *(action_class__) = G_OBJECT_CLASS (g_type_class_ref (*(action_type__))); \ + *(action_class__) = g_type_class_ref (*(action_type__)); \ } \ else if (!strncmp ((prop_name__), "condition::", strlen ("condition::"))) \ { \ @@ -2069,7 +2071,7 @@ G_STMT_START { { \ if (!*(action_type__)) \ *(action_type__) = MOO_TYPE_ACTION; \ - *(action_class__) = G_OBJECT_CLASS (g_type_class_ref (*(action_type__))); \ + *(action_class__) = g_type_class_ref (*(action_type__)); \ } \ \ pspec__ = g_object_class_find_property (*(action_class__), (prop_name__)); \ @@ -2402,7 +2404,7 @@ moo_window_connect_eo_widget (MooWindow *window, { g_return_if_fail (_moo_edit_ops_check (G_OBJECT (widget))); - window->priv->eo_widget = object_ref (widget); + window->priv->eo_widget = g_object_ref (widget); _moo_edit_ops_connect (G_OBJECT (widget)); g_signal_connect_swapped (widget, "moo-edit-ops-can-do-op-changed", @@ -2459,7 +2461,7 @@ check_edit_ops_widget (MooWindow *window) moo_window_connect_eo_widget (window, widget); for (i = 0; i < MOO_N_EDIT_OPS; i++) - emit_can_do_op_changed (window, MooEditOpType (i)); + emit_can_do_op_changed (window, i); } } @@ -2482,7 +2484,7 @@ moo_window_connect_uo_widget (MooWindow *window, { g_return_if_fail (_moo_undo_ops_check (G_OBJECT (widget))); - window->priv->uo_widget = object_ref (widget); + window->priv->uo_widget = g_object_ref (widget); g_signal_connect_swapped (widget, "moo-undo-ops-can-undo-changed", G_CALLBACK (emit_can_undo_changed), window); diff --git a/moo/mooutils/moowindow.h b/moo/mooutils/moowindow.h index 7a11f4ba..d2c65a4d 100644 --- a/moo/mooutils/moowindow.h +++ b/moo/mooutils/moowindow.h @@ -42,11 +42,11 @@ typedef enum { MOO_CLOSE_RESPONSE_CANCEL } MooCloseResponse; -typedef struct MooWindow MooWindow; -typedef struct MooWindowPrivate MooWindowPrivate; -typedef struct MooWindowClass MooWindowClass; +typedef struct _MooWindow MooWindow; +typedef struct _MooWindowPrivate MooWindowPrivate; +typedef struct _MooWindowClass MooWindowClass; -struct MooWindow +struct _MooWindow { GtkWindow gtkwindow; @@ -60,7 +60,7 @@ struct MooWindow GtkStatusbar *statusbar; }; -struct MooWindowClass +struct _MooWindowClass { GtkWindowClass parent_class; diff --git a/moo/plugins/moofilelist.c b/moo/plugins/moofilelist.c index ca29f698..2adf18ab 100644 --- a/moo/plugins/moofilelist.c +++ b/moo/plugins/moofilelist.c @@ -1160,6 +1160,8 @@ file_list_add_group (FileList *list, } else if (!file_list_iter_is_auto (list, &iter)) { + GtkTreeIter parent_iter; + if (gtk_tree_model_iter_parent (GTK_TREE_MODEL (list), &parent_iter, &iter)) { parent = gtk_tree_path_copy (path); diff --git a/moo/plugins/usertools/moocommand-exe.c b/moo/plugins/usertools/moocommand-exe.c index 2adc5541..35784f2c 100644 --- a/moo/plugins/usertools/moocommand-exe.c +++ b/moo/plugins/usertools/moocommand-exe.c @@ -190,8 +190,7 @@ save_input_file (MooEdit *doc) file = NULL; } - if (info) - g_object_unref (info); + moo_save_info_free (info); return file; } @@ -646,15 +645,11 @@ run_async (const char *cmd_line, real_env = _moo_env_add (envp); if (screen) - { result = gdk_spawn_on_screen (screen, working_dir, (char**) argv, real_env, flags, NULL, NULL, NULL, &error); - } else - { - result = g_spawn_async(working_dir, (char**) argv, real_env, - flags, NULL, NULL, NULL, &error); - } + result = g_spawn_async (working_dir, (char**) argv, real_env, + flags, NULL, NULL, NULL, &error); g_strfreev (real_env); } diff --git a/moo/plugins/usertools/moousertools.c b/moo/plugins/usertools/moousertools.c index e0ae59ab..9f643487 100644 --- a/moo/plugins/usertools/moousertools.c +++ b/moo/plugins/usertools/moousertools.c @@ -1030,6 +1030,8 @@ info_equal (MooUserToolInfo *info1, return FALSE; return info1->position == info2->position && + info1->position == info2->position && + info1->position == info2->position && info1->cmd_factory == info2->cmd_factory && moo_str_equal (info1->name, info2->name) && moo_str_equal (info1->accel, info2->accel) && diff --git a/plat/win32/gtk-win/Makefile b/plat/win32/gtk-win/Makefile new file mode 100644 index 00000000..8efb3d39 --- /dev/null +++ b/plat/win32/gtk-win/Makefile @@ -0,0 +1,78 @@ +top: + @echo "Do you want 'build' target?" + @exit 1 + +check-make: + @if [ ! -e $(mgwdir)/mjhbuild.sh ]; then echo "use make.sh"; exit 1; fi + +build-gtk: check-make + $(mgwdir)/mjhbuild.sh build + +build-data: check-make + mkdir -p $(mgwtargetdir)/bin + cp -f $(libgccdll) $(mgwtargetdir)/bin/ + cp -f $(libstdcppdll) $(mgwtargetdir)/bin/ + +build-medit-data: check-make + mkdir -p $(mgwtargetdir) + cp -flR $(mgwdir)/extra/medit-data/* $(mgwtargetdir)/ + mkdir -p $(mgwtargetdir)/share/icons/hicolor/48x48/apps/ + cp -fl $(moosrcdir)/mooutils/pixmaps/medit.png $(mgwtargetdir)/share/icons/hicolor/48x48/apps/ + gtk-update-icon-cache --force $(mgwtargetdir)/share/icons/hicolor + +build-python: check-make + mkdir -p $(mgwtargetdir)/bin $(mgwtargetdir)/lib $(mgwtargetdir)/include/python +# cp -fl $(mgwpythoninstdir)/*.exe $(mgwtargetdir)/bin/ + cp -fl $(mgwpythonsystem32dir)/python2*.dll $(mgwtargetdir)/bin/ +# cp -flR $(mgwpythoninstdir)/DLLs $(mgwpythoninstdir)/Lib $(mgwtargetdir)/bin/ + cp -fl $(mgwpythoninstdir)/libs/python2*.lib $(mgwtargetdir)/lib/ + cp -fl $(mgwpythoninstdir)/libs/libpython2*.a $(mgwtargetdir)/lib/ + cp -fl $(mgwpythoninstdir)/include/* $(mgwtargetdir)/include/python/ + +build-defs: check-make + cd $(mgwtargetdir)/lib && gendef ../bin/*.dll + +pre-build: build-python +post-build: build-data build-medit-data build-defs + +build: pre-build build-gtk post-build +rebuild: clean build + +RSYNC = rsync --recursive --verbose --copy-links --update +tmpdir = $(mgwbuildroot)/tmp-$(mgwconfig)$(mgwplatsuffix) +tmpbdist = $(tmpdir)/bdist +copy-win: check-make + mkdir -p ~/projects/win/$(mgwconfig)$(mgwplatsuffix) + $(RSYNC) $(mgwtargetdir) ~/projects/win/$(mgwconfig)$(mgwplatsuffix)/ + rm -fr $(tmpbdist) + mkdir -p $(tmpdir) + cp -flR $(mgwdestdir) $(tmpbdist) + $(RSYNC) $(tmpbdist) ~/projects/win/$(mgwconfig)$(mgwplatsuffix)/ + rm -fr $(tmpdir) + +bdist-en: + rm -fr $(mgwdestdir)-en + $(mgwdir)/copyuser.sh --en $(mgwtargetdir) $(mgwdestdir)-en + +bdist: + rm -fr $(mgwdestdir) + $(mgwdir)/copyuser.sh $(mgwtargetdir) $(mgwdestdir) + +bdist-all: bdist-en bdist + +dist-src-dbg: + $(mgwdir)/copysrcdbg.sh + +dist-src: + $(mgwdir)/copysrc.sh + +dist-bin: + $(mgwdir)/copybin.sh + +dist: dist-src dist-bin bdist dist-src-dbg + +clean-dist: + rm -rf $(mgwbuildroot)/dist-$(mgwconfig)$(mgwplatsuffix) + +clean: clean-dist + rm -rf $(mgwbuilddir) $(mgwdestdir) $(mgwdestdir)-en $(mgwdistdir) diff --git a/plat/win32/gtk-win/config.sh b/plat/win32/gtk-win/config.sh new file mode 100644 index 00000000..fd916ad0 --- /dev/null +++ b/plat/win32/gtk-win/config.sh @@ -0,0 +1,89 @@ +export mgwx64=false + +if $mgwx64; then + export mgwplatform="x64" +else + export mgwplatform="x86" +fi + +if [ -z "$OSTYPE" -o "$OSTYPE" != "cygwin" ]; then + export mgwsystem=linux +else + export mgwsystem=cygwin +fi +if [ $mgwsystem = linux ]; then + export mgwlinux=true + export mgwcygwin=false +else + export mgwlinux=false + export mgwcygwin=true +fi + +if [ $mgwplatform = 'x64' ]; then + export libgccdll=/usr/lib/gcc/x86_64-w64-mingw32/*-win32/libgcc_s_sjlj-1.dll + export libstdcppdll=/usr/lib/gcc/x86_64-w64-mingw32/*-win32/libstdc++*.dll +else + export libgccdll=/usr/lib/gcc/i686-w64-mingw32/*-win32/libgcc_s_sjlj-1.dll + export libstdcppdll=/usr/lib/gcc/i686-w64-mingw32/*-win32/libstdc++*.dll +fi + +export moosrcdir=$HOME/projects/medit/moo +export mgwbuildroot=$HOME/projects/gtk-win-build +export mgwpythondotver=2.7 + +export mgwpythonver=`echo $mgwpythondotver | sed 's/[.]//'` + +if $mgwlinux; then + if [ $mgwplatform = 'x64' ]; then + export mgwpythoninstdir=$HOME/.wine64/drive_c/Python$mgwpythonver + export mgwpythonsystem32dir=$HOME/.wine64/drive_c/windows/system32 + export mgwprogramfilesdir="$HOME/.wine64/drive_c/Program Files (x86)" + else + export mgwpythoninstdir=$HOME/.wine/drive_c/Python$mgwpythonver + export mgwpythonsystem32dir=$HOME/.wine/drive_c/windows/system32 + export mgwprogramfilesdir="$HOME/.wine/drive_c/Program Files" + fi +else + export mgwpythoninstdir=/cygdrive/c/Tools/Python$mgwpythonver + export mgwpythonsystem32dir=/cygdrive/c/Windows/SysWOW64 +fi + +export mgwdir_s=$mgwdir +export mgwdir=`cd $mgwdir && pwd` + +if [ -z "$mgwconfig" ]; then + export mgwconfig=release +fi + +case "$1" in + --debug) + mgwconfig=debug + shift + ;; + --release) + mgwconfig=release + shift + ;; + --reldbg) + mgwconfig=reldbg + shift + ;; +esac + +export mgwplatsuffix= +if [ $mgwplatform = 'x64' ]; then + export mgwplatsuffix="-x64" +fi + +export mgwjhbuildsrcdir=$mgwbuildroot/jhbuild +export mgwjhbuilddir=$mgwbuildroot/jhbuild-bin + +export mgwdestdir=$mgwbuildroot/bdist-$mgwconfig$mgwplatsuffix + +export mgwbuilddir=$mgwbuildroot/$mgwconfig$mgwplatsuffix +export mgwbuilddir_s=$mgwbuildroot/$mgwconfig$mgwplatsuffix +export mgwsourcedir=$mgwbuilddir/source +export mgwtargetdir=$mgwbuilddir/target +export mgwsourcedir_s=$mgwbuilddir_s/source +export mgwtargetdir_s=$mgwbuilddir_s/target +export mgwdistdir=$mgwbuildroot/dist-$mgwconfig$mgwplatsuffix diff --git a/plat/win32/gtk-win/copybin.sh b/plat/win32/gtk-win/copybin.sh new file mode 100644 index 00000000..7a51022f --- /dev/null +++ b/plat/win32/gtk-win/copybin.sh @@ -0,0 +1,24 @@ +#! /bin/sh + +export mgwdir=`dirname $0` +. $mgwdir/config.sh || exit 1 + +jhtargetdir=$mgwbuilddir/target +destdir=$mgwbuildroot/dist-$mgwconfig$mgwplatsuffix +tmpdir=$destdir/medit-deps-bin-tmp +suffix=`date +%Y%m%d` +tarball=medit-deps-bin-$mgwconfig-$suffix.zip + +do_or_die() { + echo "$@" + "$@" || exit 1 +} + +do_or_die rm -fr $tmpdir $destdir/$tarball +do_or_die mkdir -p $tmpdir/gtk-win-build/$mgwconfig +do_or_die cp -lfR $jhtargetdir $tmpdir/gtk-win-build/$mgwconfig$mgwplatsuffix/ +do_or_die cd $tmpdir +do_or_die zip -r9 $tarball gtk-win-build +do_or_die mv $tarball $destdir/ +do_or_die cd $destdir +do_or_die rm -fr $tmpdir diff --git a/plat/win32/gtk-win/copysrc.sh b/plat/win32/gtk-win/copysrc.sh new file mode 100644 index 00000000..9f100fa7 --- /dev/null +++ b/plat/win32/gtk-win/copysrc.sh @@ -0,0 +1,36 @@ +#! /bin/sh + +export mgwdir=`dirname $0` +. $mgwdir/config.sh || exit 1 + +jhtarballdir=$mgwbuildroot/tarballs +jhsourcedir=$mgwbuilddir/source +destname=medit-deps-sources$mgwplatsuffix-`date +%Y%m%d` +destdir=$mgwbuildroot/dist-$mgwconfig$mgwplatsuffix/$destname + +do_or_die() { + echo "$@" + "$@" || exit 1 +} + +cd $mgwbuildroot + +do_or_die rm -fr $destdir $destdir.zip +do_or_die mkdir -p $destdir +do_or_die cp -lfR $jhtarballdir/* $destdir/ + +do_or_die mkdir -p $destdir/tmp +for proj in pycairo pygobject pygtk; do + cd $destdir/tmp || exit 1 + hg clone $jhsourcedir/$proj + tar cjf medit-$proj.tar.bz2 $proj + mv medit-$proj.tar.bz2 .. +done +do_or_die cd $destdir +do_or_die rm -fr $destdir/tmp +do_or_die cp -lfR $mgwdir $destdir/gtk-win +do_or_die mv $destdir/gtk-win/extra/readme-medit-deps.txt $destdir/readme.txt + +do_or_die cd $destdir/.. +do_or_die zip -r $destname.zip $destname +do_or_die rm -fr $destname diff --git a/plat/win32/gtk-win/copysrcdbg.sh b/plat/win32/gtk-win/copysrcdbg.sh new file mode 100644 index 00000000..bb094b96 --- /dev/null +++ b/plat/win32/gtk-win/copysrcdbg.sh @@ -0,0 +1,84 @@ +#! /bin/sh + +export mgwdir=`dirname $0` +. $mgwdir/config.sh || exit 1 + +jhsourcedir=$mgwbuilddir/source +jhbuilddir=$mgwbuilddir/build +destdir=medit-deps-dbg-src-$mgwconfig-`date +%Y%m%d` + +do_or_die() { + echo "$@" + "$@" || exit 1 +} + +do_or_die mkdir -p $mgwbuildroot/dist-$mgwconfig +cd $mgwbuildroot/dist-$mgwconfig + +do_or_die rm -fr $destdir.zip $destdir +do_or_die mkdir -p $destdir +do_or_die cp -lfR $jhsourcedir/* $destdir/ +do_or_die cp -lfR $jhbuilddir/* $destdir/ + +cd $destdir + +{ find . -type d \( -name 'tests' \) -print0 | xargs -0 rm -r ; } || exit 1 +{ find . -type d \( -name '.libs' -o -name '.deps' \) -print0 | xargs -0 rm -r ; } || exit 1 +rm -rf */test */docs */doc */man */demos */examples */po */.hg */.git \ + gettext-*/gettext-tools/examples gettext-*/gettext-tools/man gettext-*/gettext-tools/po \ + gettext-*/gettext-tools/doc gettext-*/gettext-tools/gnulib-tests \ + */autom4te.cache libxml2-*/result || exit 1 + +find . -type f \( \ + -name '*.o' -o \ + -name '*.lo' -o \ + -name '*.Plo' -o \ + -name '*.Po' -o \ + -name '*.dll' -o \ + -name '*.a' -o \ + -name '*.la' -o \ + -name '*.html' -o \ + -name '*.sgml' -o \ + -name '*.xml' -o \ + -name '*.txt' -o \ + -name '*.po' -o \ + -name '*.gmo' -o \ + -name '*.in' -o \ + -name '*.m4' -o \ + -name '*.pc' -o \ + -name '*.spec' -o \ + -name '*.sh' -o \ + -name '*.guess' -o \ + -name '*.log' -o \ + -name '*.status' -o \ + -name '*.sub' -o \ + -name 'AUTHORS' -o \ + -name 'ChangeLog' -o \ + -name 'ChangeLog.*' -o \ + -name 'configure' -o \ + -name 'COPYING' -o \ + -name 'depcomp' -o \ + -name 'INSTALL' -o \ + -name 'install-sh' -o \ + -name 'libtool' -o \ + -name 'MAINTAINERS' -o \ + -name 'Makefile' -o \ + -name 'Makefile.*' -o \ + -name 'missing' -o \ + -name 'NEWS' -o \ + -name 'mkinstalldirs' -o \ + -name 'README' -o \ + -name 'stamp-h1' -o \ + -name '*.make' -o \ + -name '*.def' -o \ + -name '*.rc' -o \ + -name '*.symbols' -o \ + -name '*.png' -o \ + -name '*.override' -o \ + -name '*.defs' -o \ + -name '*.lai' \ +\) -delete || exit 1 + +cd $mgwbuildroot/dist-$mgwconfig +do_or_die zip -r9 $destdir.zip $destdir +do_or_die rm -rf $destdir diff --git a/plat/win32/gtk-win/copyuser.sh b/plat/win32/gtk-win/copyuser.sh new file mode 100644 index 00000000..478bddec --- /dev/null +++ b/plat/win32/gtk-win/copyuser.sh @@ -0,0 +1,226 @@ +#! /bin/sh + +export mgwdir=`dirname $0` +. $mgwdir/config.sh || exit 1 + +usage() { + echo "Usage: copyuser.sh [--en|--min] src dest" + exit 1 +} + +en_only=false +no_python=false +min=false + +for arg; do + case "$arg" in + -h|--help) + usage + ;; + --en) + en_only=true + shift + ;; + --no-python) + no_python=true + shift + ;; + --min) + min=true + shift + ;; + -*) + usage + ;; + *) + break + ;; + esac +done + +srcdir="$1" +dstdir="$2" + +{ [ -n "$srcdir" ] && [ -n "$dstdir" ] ; } || usage +[ -e "$srcdir" ] || { echo "Directory '$srcdir' doesn't exist"; exit 1; } +[ -d "$srcdir" ] || { echo "'$srcdir' is not a directory"; exit 1; } + +srcdir=`cd $srcdir && pwd` + +mkdir -p "$dstdir" || exit 1 +dstdir=`cd $dstdir && pwd` + +do_or_die() { + echo "$@" + "$@" || exit 1 +} + +old_grep_bin_files=' +grep.exe +intl.dll +' + +new_grep_bin_files=' +grep.exe +' + +bin_files=' +gspawn-win32-helper-console.exe +gspawn-win32-helper.exe +libatk-1.0-0.dll +libcairo-2.dll +libgdk_pixbuf-2.0-0.dll +libgdk-win32-2.0-0.dll +libgio-2.0-0.dll +libglib-2.0-0.dll +libgmodule-2.0-0.dll +libgobject-2.0-0.dll +libgthread-2.0-0.dll +libgtk-win32-2.0-0.dll +libintl-8.dll +libpango-1.0-0.dll +libpangocairo-1.0-0.dll +libxml2-2.dll +libpixman-1-0.dll +libpng14-14.dll +zlib1-m314-128.dll +libgailutil-18.dll +libpangowin32-1.0-0.dll +libiconv-2.dll +' + +etc_files=' +gtk-2.0/gtkrc +gtk-2.0/im-multipress.conf +' + +lib_files=' +gtk-2.0/2.10.0/engines/*.dll +gtk-2.0/modules/*.dll +' + +share_files=' +themes/*/gtk-2.0/gtkrc +themes/*/gtk-2.0-key/gtkrc +locale/locale.alias +' + +lc_modules=' +atk10 +glib20 +grep +gtk20 +' + +copy_files_from_dir() { + op=$1 + shift + subdir=$1 + shift + copy_cmd="cp -f" + if [ "$op" = "link" ]; then + copy_cmd="$copy_cmd -l" + fi + cd $srcdir/$subdir || exit 1 + for f in $@; do + subsubdir=`dirname $f` + dstsubdir="$dstdir/$subdir/$subsubdir" + if [ "$subsubdir" = "." ]; then + dstsubdir="$dstdir/$subdir" + fi + if [ ! -d "$dstsubdir" ]; then + mkdir -p "$dstsubdir" || exit 1 + fi + echo " -- $dstsubdir/`basename $f`" + $copy_cmd $f "$dstsubdir/" || exit 1 + done +} + +copy_files() { + copy_files_from_dir copy bin $bin_files + copy_files_from_dir copy bin `basename $libgccdll` + copy_files_from_dir copy bin `basename $libstdcppdll` + copy_files_from_dir copy bin $old_grep_bin_files +# copy_files_from_dir link bin $new_grep_bin_files + copy_files_from_dir link etc $etc_files + copy_files_from_dir link lib $lib_files + copy_files_from_dir link share $share_files +} + +copy_locale() { + cd $srcdir/share/locale || exit 1 + for locale in *; do + if [ -d $locale ]; then + mkdir -p "$dstdir/share/locale/$locale/LC_MESSAGES" || exit 1 + for module in $lc_modules; do + mo=$locale/LC_MESSAGES/$module.mo + if [ -f $mo ]; then + echo " -- $dstdir/share/locale/$mo" + cp -fl $mo "$dstdir/share/locale/$mo" || exit 1 + fi + done + fi + done +} + +copy_icons() { + do_or_die mkdir -p "$dstdir/share/icons" + themes="hicolor" + for theme in $themes; do + do_or_die cp -flR "$srcdir/share/icons/$theme" "$dstdir/share/icons/" + do_or_die rm -fr "$dstdir/share/icons/$theme/scalable" + do_or_die gtk-update-icon-cache "$srcdir/share/icons/$theme" + done + + ( + cd $dstdir/share/icons/hicolor + for d in [0-9][0-9]x[0-9][0-9] [0-9][0-9][0-9]x[0-9][0-9][0-9] scalable; do + do_or_die rm -fr $d + done + ) +} + +copy_mime() { + do_or_die cp -R /usr/share/mime "$dstdir/share/mime-tmp" + do_or_die update-mime-database "$dstdir/share/mime-tmp" + do_or_die mkdir -p "$dstdir/share/mime" + do_or_die mv "$dstdir/share/mime-tmp/mime.cache" "$dstdir/share/mime/" + do_or_die rm -fr "$dstdir/share/mime-tmp" +} + +copy_python() { + do_or_die cp -lfR $mgwpythoninstdir/*.exe "$dstdir/bin/" + do_or_die cp -lfR $mgwpythoninstdir/LICENSE.txt "$dstdir/bin/LICENSE-python.txt" + do_or_die cp -lfR $mgwpythoninstdir/DLLs $mgwpythoninstdir/Lib "$dstdir/bin/" + do_or_die cp -lfR $mgwpythonsystem32dir/python2*.dll "$dstdir/bin/" + do_or_die cp -lfR $srcdir/lib/python2.*/site-packages/* "$dstdir/bin/Lib/site-packages/" + do_or_die cp -lfR $srcdir/bin/libpyglib-*.dll "$dstdir/bin/" + do_or_die find $dstdir/bin/Lib/ -name '*.py[co]' -delete + do_or_die find $dstdir/bin/Lib/site-packages/ -name '*.a' -delete + do_or_die find $dstdir/bin/Lib/site-packages/ -name '*.la' -delete + do_or_die rm $dstdir/bin/DLLs/_ctypes_test.pyd + for dir in bsddb/test ctypes/test distutils/tests email/test json/tests \ + lib-tk/test lib2to3/tests sqlite3/test test unittest/test; + do + do_or_die rm -r $dstdir/bin/Lib/$dir + done +} + +copy_files +if ! $en_only; then + copy_locale +fi +if ! $no_python; then + copy_python +fi +copy_icons +copy_mime + +tarball=medit-bdist-$mgwconfig$mgwplatsuffix-`date +%Y%m%d`.zip +cd `dirname $dstdir` +do_or_die rm -f $mgwdistdir/$tarball +do_or_die zip -r9 $tarball.tmp `basename $dstdir` +do_or_die mkdir -p $mgwdistdir +do_or_die mv $tarball.tmp $mgwdistdir/$tarball + +# -%- indent-width:2 -%- diff --git a/plat/win32/medit-data/bin/grep.exe b/plat/win32/gtk-win/extra/medit-data/bin/grep.exe similarity index 100% rename from plat/win32/medit-data/bin/grep.exe rename to plat/win32/gtk-win/extra/medit-data/bin/grep.exe diff --git a/plat/win32/gtk-win/extra/medit-data/bin/intl.dll b/plat/win32/gtk-win/extra/medit-data/bin/intl.dll new file mode 100644 index 00000000..393e714d Binary files /dev/null and b/plat/win32/gtk-win/extra/medit-data/bin/intl.dll differ diff --git a/plat/win32/medit-data/etc/gtk-2.0/gtkrc b/plat/win32/gtk-win/extra/medit-data/etc/gtk-2.0/gtkrc similarity index 100% rename from plat/win32/medit-data/etc/gtk-2.0/gtkrc rename to plat/win32/gtk-win/extra/medit-data/etc/gtk-2.0/gtkrc diff --git a/plat/win32/gtk-win/extra/readme-medit-deps.txt b/plat/win32/gtk-win/extra/readme-medit-deps.txt new file mode 100644 index 00000000..0d95ea9a --- /dev/null +++ b/plat/win32/gtk-win/extra/readme-medit-deps.txt @@ -0,0 +1,23 @@ +These are sources of the binaries built and distributed with medit. Most of the tarballs +(except those named medit-*.tar.bz2) are stock source tarballs distributed by their project +authors/owners. They are collected here to satisfy requirements of GPL and LGPL, and to +ensure that they are present for as long as they are needed to build medit (non-gnome +source tarballs do disappear from their websites sometimes). + +Pygtk, pygobject, and pycairo are special: when they are built, sources are downloaded +from Mercurial repositories at https://bitbucket.org/muntyan. Tarballs present here +are clones of corresponding Mercurial reporsitories. + +gtk-win.tar.bz2 contains scripts used to build all these projects, see +readme-win32-build.txt inside. + +To build medit using these tarballs (as opposed to letting jhbuild go and download +everything from internet), place the stock tarballs into: + +/tarballs/ + +and unpack medit-py*.tar.bz2 tarballs into + +/release/source/ + +Here is the root of medit jhbuild environment, see readme-win32-build.txt. diff --git a/plat/win32/gtk-win/fixx64.sh b/plat/win32/gtk-win/fixx64.sh new file mode 100644 index 00000000..03cc4a4a --- /dev/null +++ b/plat/win32/gtk-win/fixx64.sh @@ -0,0 +1,27 @@ +#! /bin/bash + +for f in `find . '(' -iname "*.[ch]" -o -iname "*.h.in" -o -iname "*.cpp" -o -iname "*.hpp" ')'` +do + echo $f + sed -i -r \ + -e 's/`.*/__escaped1__&__escaped1__/g' \ + -e 's|/\*.*|__escaped5__&__escaped5__|g' \ + -e 's/__escaped[0-9]__(.*)long\s+long(.*)__escaped[0-9]__/__escaped2__\1__LiteralLongLong__\2__escaped2__/g' \ + -e 's/__escaped[0-9]__(.*)long(.*)__escaped[0-9]__/__escaped2__\1__LiteralLong__\2__escaped2__/g' \ + -e 's/__escaped[0-9]__(.*)long(.*)__escaped[0-9]__/__escaped2__\1__LiteralLong__\2__escaped2__/g' \ + -e 's/((arbitrarily|too|the|how|few|potentially|to|very)\s+)long/__escaped3__\1__LiteralLong____escaped3__/g' \ + -e 's/long(-|\s+(as|double|option))/__escaped3____LiteralLong__\1__escaped3__/g' \ + -e 's/([^[:alnum:]_]|^)(long\s+long)([^[:alnum:]_]|$)/\1long\3/g' \ + -e 's/([^[:alnum:]_]|^)(long\s+int)([^[:alnum:]_]|$)/\1long\3/g' \ + -e 's/([^[:alnum:]_]|^)(unsigned\s+long)([^[:alnum:]_]|$)/\1__TypeUnsignedLongLong__\3/g' \ + -e 's/([^[:alnum:]_]|^)long([^[:alnum:]_]|$)/\1__TypeLongLong__\2/g' \ + -e 's/__LiteralLong__/long/g' \ + -e 's/__LiteralLongLong__/long long/g' \ + -e 's/__TypeLongLong__/long long/g' \ + -e 's/__TypeUnsignedLongLong__/unsigned long long/g' \ + -e 's/__escaped[0-9]__(.*)__escaped[0-9]__/\1/g' \ + -e 's/__escaped[0-9]__(.*)__escaped[0-9]__/\1/g' \ + -e 's/volatile long long started/volatile long started/g' \ + $f + # +done diff --git a/plat/win32/gtk-win/genlib.bat b/plat/win32/gtk-win/genlib.bat new file mode 100644 index 00000000..baa4c30e --- /dev/null +++ b/plat/win32/gtk-win/genlib.bat @@ -0,0 +1,11 @@ +@echo off +setlocal + +call "c:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin\vcvars32.bat" + +cd C:\Projects\gtk\release\target\lib + +FOR %%d IN (*.def) DO ( + echo %%d + lib /def:%%d /machine:x86 +) diff --git a/plat/win32/gtk-win/jhbuildrc/gtk.moduleset b/plat/win32/gtk-win/jhbuildrc/gtk.moduleset new file mode 100644 index 00000000..8766d768 --- /dev/null +++ b/plat/win32/gtk-win/jhbuildrc/gtk.moduleset @@ -0,0 +1,407 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plat/win32/gtk-win/jhbuildrc/jhbuildrc b/plat/win32/gtk-win/jhbuildrc/jhbuildrc new file mode 100644 index 00000000..58beb17b --- /dev/null +++ b/plat/win32/gtk-win/jhbuildrc/jhbuildrc @@ -0,0 +1,234 @@ +# -*- python -*- + +_gtkwindir = os.environ['_GTKWINDIR'] +_gtkwinjhbuilddir = os.path.join(_gtkwindir, 'jhbuildrc') +_gtkwinbuildroot = os.environ['_GTKWINBUILDROOT'] +_gtkwinplatform = os.environ['_GTKWINPLATFORM'] +_moosrcdir = os.environ['_MOOSRCDIR'] + +_gtkwinconfig = os.environ.get('_GTKWINCONFIG') +if _gtkwinconfig is None: + raise RuntimeError() + _gtkwinconfig = 'release' +else: + _gtkwinconfig = _gtkwinconfig.lower() +assert _gtkwinconfig in ['debug', 'reldbg', 'release'] + +_mingw_tool_prefix = None +_configure_target = None +if _gtkwinplatform == 'x64': + __mingw_tool_prefixes = ('x86_64-w64-mingw32',) +else: + __mingw_tool_prefixes = ('i686-w64-mingw32', 'i686-pc-mingw32', 'i586-mingw32msvc', 'i486-mingw32') +for __p in __mingw_tool_prefixes: + if os.path.exists('/usr/bin/%s-gcc' % (__p,)): + _mingw_tool_prefix = '/usr/bin/%s-' % (__p,) + _configure_target = __p + break +if not _mingw_tool_prefix: + raise RuntimeError('Could not find mingw-gcc') + +makeargs = '-j 4' +moduleset = os.path.join(_gtkwinjhbuilddir, 'gtk.moduleset') +use_lib64 = False + +modules = ['medit-gtk-win'] + +_gtkwindirsuffix = _gtkwinplatform == 'x64' and '-x64' or '' +checkoutroot = os.path.join(_gtkwinbuildroot, _gtkwinconfig + _gtkwindirsuffix, 'source') +buildroot = os.path.join(_gtkwinbuildroot, _gtkwinconfig + _gtkwindirsuffix, 'build') +prefix = os.path.join(_gtkwinbuildroot, _gtkwinconfig + _gtkwindirsuffix, 'target') +tarballdir = os.path.join(_gtkwinbuildroot, 'tarballs') + +os.environ['prefix'] = prefix + +os.environ['JHBUILD_PROMPT'] = r'JHBUILD:\w\$ ' + +_mingw_tools = { + 'ADDR2LINE': 'addr2line', + 'AS': 'as', + 'CC': 'gcc', + 'CPP': 'cpp', + 'CPPFILT': 'c++filt', + 'CXX': 'g++', + 'DLLTOOL': 'dlltool', + 'DLLWRAP': 'dllwrap', + 'GCOV': 'gcov', + 'LD': 'ld', + 'NM': 'nm', + 'OBJCOPY': 'objcopy', + 'OBJDUMP': 'objdump', + 'READELF': 'readelf', + 'SIZE': 'size', + 'STRINGS': 'strings', + 'WINDRES': 'windres', + 'RC': 'windres', + 'AR': 'ar', + 'RANLIB': 'ranlib', + 'STRIP': 'strip', +} + +for _var in _mingw_tools: + os.environ[_var] = _mingw_tool_prefix + _mingw_tools[_var] + +_common_cflags = '' + +if _gtkwinconfig == 'debug': + _common_cflags += ' -gstabs+' +elif _gtkwinconfig == 'reldbg': + _common_cflags += ' -gstabs+ -O2' +else: + _common_cflags += ' -O3 -fno-strict-aliasing -fwrapv' + #_common_cflags += ' -gstabs+ -O2' + +# os.environ['CPPFLAGS'] = "-I%s/include" % (prefix,) +# os.environ['CFLAGS'] = "-I%s/include -mms-bitfields -march=i686 %s" % (prefix, _def_cflags) +# os.environ['CXXFLAGS'] = "-I%s/include -mms-bitfields -march=i686 %s" % (prefix, _def_cflags) +# os.environ['OBJCFLAGS'] = "-I%s/include -mms-bitfields -march=i686 %s" % (prefix, _def_cflags) + +_c_warnings = '' +_cxx_warnings = '' + +# x64 warnings are important, everybody confuses long with ssize_t +if _gtkwinplatform == 'x64': + #_common_cflags += ' -Werror -Wall' + _common_cflags += ' -Wall' + +_common_cflags += ' -Wno-unused-but-set-variable -Wno-unused-function -Wno-unused-value ' \ + + '-Wno-unused-variable -Wno-sign-compare -Wno-enum-compare -Wno-array-bounds ' \ + + '-Wno-unused-local-typedefs -Wno-maybe-uninitialized -Wno-attributes ' \ + + '-Wno-logical-not-parentheses -Wno-int-to-pointer-cast' +_c_warnings += ' -Wno-pointer-sign -Wno-incompatible-pointer-types' + +_common_cflags += ' -mms-bitfields' +if _gtkwinplatform != 'x64': + _common_cflags += ' -march=i686' + +_cxxflags = _common_cflags + _cxx_warnings +_cflags = _common_cflags + _c_warnings + +_cflags_cmdline = ' CFLAGS="%(_cflags)s" CXXFLAGS="%(_cxxflags)s"' % {'_cflags': _cflags, '_cxxflags': _cxxflags} +def _remove_gstabs(module): + module_autogenargs[module] = module_autogenargs[module].replace('-gstabs+', '-g').replace('-gstabs', '-g') + +os.environ['PKG_CONFIG_LIBDIR'] = "%s/lib/pkgconfig" % (prefix,) +os.environ['PKG_CONFIG_PATH'] = "%s/lib/pkgconfig" % (prefix,) + +for __dir in os.environ['PATH'].split(':'): + if os.path.exists(os.path.join(__dir, 'install-check')): + os.environ['INSTALL'] = os.path.join(__dir, 'install-check') + break + +#Populating autogenargs + +if os.environ['mgwlinux'] == 'true': + _configure_build = 'i686-pc-linux-gnu' +elif os.environ['mgwcygwin'] == 'true': + _configure_build = 'i686-pc-cygwin' +else: + raise RuntimeError("oops") + +autogenargs = ' --build=' + _configure_build +autogenargs += ' --host=' + _configure_target +autogenargs += ' --target=' + _configure_target +autogenargs += ' --disable-docs --disable-gtk-doc --disable-scrollkeeper' +autogenargs += ' --enable-shared --disable-static' +autogenargs += ' --enable-relocatable --enable-silent-rules --disable-glibtest --disable-pthread' +for _var in ['AR', 'RANLIB', 'STRIP', 'AS', 'DLLTOOL', 'OBJDUMP', 'NM', 'WINDRES', 'RC', 'INSTALL']: + autogenargs += ' ' + _var + '="' + os.environ[_var] + '" ' + +autogenargs += _cflags_cmdline + +# zlib uses custom configure script which doesn't ignore unknown options +module_autogenargs['zlib'] = (_gtkwinplatform == 'x64' and ' --64' or '') + +module_autogenargs['gettext'] = autogenargs + " --without-emacs" \ + + " --disable-java" \ + + " --disable-csharp" \ + + " --with-included-gettext" \ + + " --without-libexpat-prefix" \ + + " --without-libxml2-prefix" \ + + " --without-libglib-2.0-prefix" \ + + " --enable-threads=win32" \ + + " --disable-openmp" \ + + " --disable-rpath" \ + + " --disable-relocatable" + +if _gtkwinconfig == 'debug': + module_autogenargs['gettext'] += " CPPFLAGS=-DHAVE_INLINE" +_remove_gstabs('gettext') + +module_autogenargs['libiconv'] = autogenargs + " --disable-relocatable" + +module_autogenargs['libxml2'] = autogenargs + " --without-python" \ + + " --without-threads" +_remove_gstabs('libxml2') + +module_autogenargs['pkgconfig'] = autogenargs \ + + " --with-installed-glib" + +module_autogenargs['glib'] = autogenargs + " --with-pcre=internal" \ + + " --with-threads=win32" \ + + " --disable-fam" \ + + " --disable-selinux" + +module_autogenargs['cairo'] = autogenargs + " --without-x" \ + + " --disable-ft" \ + + " png_REQUIRES=libpng" +# module_autogenargs['cairo-1.8'] = module_autogenargs['cairo'] +# module_autogenargs['cairo-1.10'] = module_autogenargs['cairo'] + +module_autogenargs['pango'] = autogenargs + " --with-included-modules" + +module_autogenargs['gtk'] = autogenargs \ + + " --without-libjpeg" \ + + " --without-libtiff" \ + + " --disable-cups" \ + + " --without-libjasper" \ + + " --disable-gdiplus" \ + + " --with-included-loaders=ani,icns,pcx,ras,tga,png,pnm,wbmp,xbm,xpm,bmp,gif,ico" \ + + " --with-included-immodules" \ + + " --disable-introspection" \ + + " --disable-visibility" \ + + (" LDFLAGS=-L%s/lib" % prefix) + +module_autogenargs['gdk-pixbuf'] = autogenargs \ + + " --without-libjpeg" \ + + " --without-libtiff" \ + + " --disable-cups" \ + + " --without-libjasper" \ + + " --without-gdiplus" \ + + " --with-included-loaders=ani,icns,pcx,ras,tga,png,pnm,wbmp,xbm,xpm,bmp,gif,ico" \ + + " --with-included-immodules" \ + + " --disable-introspection" + +# module_autogenargs['gtk-2.18'] = autogenargs \ +# + " --without-libjpeg" \ +# + " --without-libtiff" \ +# + " --disable-cups" \ +# + " --without-libjasper" \ +# + " --with-included-loaders=ani,icns,pcx,ras,tga,png,pnm,wbmp,xbm,xpm,bmp,gif,ico" \ +# + " --with-included-immodules" \ +# + " --disable-introspection" +# module_autogenargs['gtk-2.20'] = autogenargs \ +# + " --without-libjpeg" \ +# + " --without-libtiff" \ +# + " --disable-cups" \ +# + " --without-libjasper" \ +# + " --with-included-loaders=ani,icns,pcx,ras,tga,png,pnm,wbmp,xbm,xpm,bmp,gif,ico" \ +# + " --with-included-immodules" \ +# + " --disable-introspection" +# module_autogenargs['gtk-2-20'] = module_autogenargs['gtk-2.20'] + +module_autogenargs['pygobject'] = autogenargs \ + + " --disable-cairo" \ + + " --disable-introspection" \ + + " --disable-docs" + +module_autogenargs['pygtk'] = autogenargs \ + + " --disable-introspection" \ + + " --disable-docs" \ + + " --disable-numpy" + +module_autogenargs['mooglib'] = autogenargs \ + + (" --with-moo-glib-src-dir=\"%s/mooglib\"" % (_moosrcdir)) diff --git a/plat/win32/gtk-win/make.sh b/plat/win32/gtk-win/make.sh new file mode 100644 index 00000000..0d01d2db --- /dev/null +++ b/plat/win32/gtk-win/make.sh @@ -0,0 +1,23 @@ +#! /bin/sh + +if [ "$1" = "--help" -o "$1" = "-h" ]; then + echo "Usage: $0 [--debug|--release|--reldbg|--all] " + exit 0 +fi + +if [ "$1" = "--all" ]; then + shift + echo $0 --debug "$@" + $0 --debug "$@" || exit 1 + echo $0 --release "$@" + $0 --release "$@" || exit 1 + echo $0 --reldbg "$@" + $0 --reldbg "$@" || exit 1 + exit 0 +fi + +export mgwdir=`dirname $0` +. $mgwdir/config.sh || exit 1 + +echo make -f $mgwdir_s/Makefile "$@" +exec make -f $mgwdir_s/Makefile "$@" diff --git a/plat/win32/gtk-win/mjhbuild.sh b/plat/win32/gtk-win/mjhbuild.sh new file mode 100644 index 00000000..6887b3d2 --- /dev/null +++ b/plat/win32/gtk-win/mjhbuild.sh @@ -0,0 +1,20 @@ +#! /bin/sh + +# Usage: mjhbuild.sh [--debug|--release] + +if [ -z "$mgwconfig" ]; then + export mgwdir=`dirname $0` + . $mgwdir/config.sh || exit 1 +fi + +export _GTKWINDIR=`cd $mgwdir && pwd` +export _GTKWINCONFIG=$mgwconfig +export _GTKWINBUILDROOT=$mgwbuildroot +export _GTKWINPLATFORM=$mgwplatform +export _MOOSRCDIR=$moosrcdir + +# JHBUILD=$mgwjhbuilddir/bin/jhbuild +JHBUILD=jhbuild + +echo $JHBUILD -f $mgwdir_s/jhbuildrc/jhbuildrc "$@" +exec $JHBUILD -f $mgwdir_s/jhbuildrc/jhbuildrc "$@" diff --git a/plat/win32/gtk-win/readme-win32-build.txt b/plat/win32/gtk-win/readme-win32-build.txt new file mode 100644 index 00000000..4af07b59 --- /dev/null +++ b/plat/win32/gtk-win/readme-win32-build.txt @@ -0,0 +1,47 @@ +WARNING: this build environment builds binaries for medit, and it may or may +not be suitable for other purposes. + +Windows binaries of medit are built on a Linux system using Mingw cross-compiler +and jhbuild. + +Build requires Windows Python-2.7 to be present on the build machine, by default +it looks for it where wine would install it, see config.sh. Python is required to +build pycairo, pygobject, and pygtk, and to build medit itself (which uses pygtk). + +To build: + 1) check and adjust config.sh + mgwbuildroot: location of the jhbuild environment root - source and build + directories and resulting binaries will be there. + mgwpython*: python version and where its installation can be found. Default + values are where wine installs Python-2.7.msi these days. + 2) Run + ./make.sh [--debug] build + ./make.sh [--debug] bdist + +To build individual jhbuild modules, use + ./mjhbuild [--debug] buildone +mjhbuild is a thin wrapper around jhbuild which reads config.sh and starts jhbuild, +it passes all command line arguments (except --debug) to jhbuild. + +gtk-win (where this file is) directory contents: + mjhbuild.sh: wrapper around jhbuild + extra: extra files which are installed with medit but are not built. + jhbuildrc: directory which contains jhbuild configuration + jhbuildrc: actual jhbuildrc file + gtk.moduleset: jhbuild moduleset file + +Build directory layout: + - gtk-win-build: root directory for the build, set in config.sh. + - release: root directory for the release build. + - build: jhbuild build directory. + - source: jhbuild source directory. + - target: jhbuild target directory - $prefix parameter for configure, + where built software gets installed. + - debug: same as release, but when mjhbuild is invoked with --debug option. + ... + - tarballs: jhbuild tarball directory. + - bdist-release: directory which contains built binaries as they are distributed + with medit. This is the contents of release/target directory with + non-distributed files (e.g. headers) removed, plus extra files + copied by "make.sh bdist" command. + - bdist-debug: same as bdist-release, but for debug configuration. diff --git a/plat/win32/medit.natvis b/plat/win32/medit.natvis deleted file mode 100644 index 1c6841ca..00000000 --- a/plat/win32/medit.natvis +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - (null) - {(char*)m_p} - {((StringData*)m_p)->m_p} - (char*)m_p - ((StringData*)m_p)->m_p - - (char*)m_p - (StringData*)m_p - m_is_inline - m_is_const - - - - - {m_p} - - - - {m_p} - m_p - - - - - {m_p} - - - - {m_ref.m_gobj} - - m_ref.m_gobj - - - - - {m_gobj} - - m_gobj - - - - diff --git a/po-gsv/POTFILES.skip b/po-gsv/POTFILES.skip index 19ad49d9..78cec721 100644 --- a/po-gsv/POTFILES.skip +++ b/po-gsv/POTFILES.skip @@ -13,7 +13,9 @@ moo/moopython/ moo/mooutils/ moo/eggsmclient/ moo/mooedit/medit.xml -moo/mooedit/mooeditaction-factory.cpp +moo/mooedit/mooedit-fileops.c +moo/mooedit/mooeditaction-factory.c +moo/mooedit/mooeditdialogs.c moo/mooedit/mooeditor.c moo/mooedit/mooeditprefs.c moo/mooedit/mooeditprefspage.c diff --git a/po/POTFILES.in b/po/POTFILES.in index d3ae4d3c..dfee1c64 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -20,9 +20,9 @@ moo/mooedit/glade/mootextfind.glade moo/mooedit/glade/mootextfind-prompt.glade moo/mooedit/glade/mootextgotoline.glade moo/mooedit/medit.xml -moo/mooedit/mooeditaction-factory.cpp -moo/mooedit/mooeditdialogs.cpp -moo/mooedit/mooedit-fileops.cpp +moo/mooedit/mooeditaction-factory.c +moo/mooedit/mooeditdialogs.c +moo/mooedit/mooedit-fileops.c moo/mooedit/mooeditor.c moo/mooedit/mooeditprefs.c moo/mooedit/mooeditprefspage.c @@ -54,7 +54,7 @@ moo/mooutils/moofiltermgr.c moo/mooutils/moohelp.c moo/mooutils/moopane.c moo/mooutils/moostock.c -moo/mooutils/mooutils-file.cpp +moo/mooutils/mooutils-file.c moo/mooutils/mooutils-fs.c moo/mooutils/mooutils-misc.c moo/mooutils/moowindow.c