From 8aa2864a515042a32865bc07e6f892439deb6c03 Mon Sep 17 00:00:00 2001 From: Angelo Naselli Date: Sun, 31 Jan 2021 18:19:14 +0100 Subject: [PATCH 01/18] MainDialogs started in fullscreen size for an error evaluating screen size. This patch gets the working area, such as the Qt available size to evaluate default size. Fix #76 --- src/YGDialog.cc | 33 ++++++----------------- src/YGUI.cc | 69 ++++++++++++++++++++++++++++++++----------------- 2 files changed, 53 insertions(+), 49 deletions(-) diff --git a/src/YGDialog.cc b/src/YGDialog.cc index 725caa23..b1cf2625 100644 --- a/src/YGDialog.cc +++ b/src/YGDialog.cc @@ -124,31 +124,14 @@ class YGWindow gtk_window_set_decorated (window, FALSE); } - if (_main_window) { - // window default width is calculated as a proportion of a default - // char and pixel width to compensate for the fact that each widget's - // required size comes from a proportion of both parameters - int width = YGUtils::getCharsWidth (m_widget, DEFAULT_CHAR_WIDTH); - width += DEFAULT_PIXEL_WIDTH; - int height = YGUtils::getCharsHeight (m_widget, DEFAULT_CHAR_HEIGHT); - height += DEFAULT_PIXEL_HEIGHT; - - if (YGUI::ui()->isSwsingle()) - height += YGUtils::getCharsHeight (m_widget, 10); - - width = MIN (width, YUI::app()->displayWidth()); - height = MIN (height, YUI::app()->displayHeight()); - - gtk_window_set_default_size (window, width, height); - gtk_window_resize(window, width, height); - - if (YGUI::ui()->setFullscreen()) - gtk_window_fullscreen (window); - else if (YUI::app()->displayWidth() <= 800 || YUI::app()->displayHeight() <= 600) - // maximize window for small displays - gtk_window_maximize (window); - } - + if (_main_window) { + int width = YUI::app()->defaultWidth(); + int height = YUI::app()->defaultHeight(); + gtk_window_set_default_size ( window, width, height ); + gtk_window_resize( window, width, height ); + if (YGUI::ui()->setFullscreen()) + gtk_window_fullscreen (window); + } gtk_window_set_role (window, "yast2"); } diff --git a/src/YGUI.cc b/src/YGUI.cc index 6bb7723a..bcfc0cbb 100644 --- a/src/YGUI.cc +++ b/src/YGUI.cc @@ -623,30 +623,21 @@ static inline GdkScreen *getScreen () // a reduced display size to compensate for the panel, or the window frame int YGApplication::displayWidth() { -# if GTK_CHECK_VERSION (3, 22, 0) - GdkRectangle monitor; - gdk_monitor_get_geometry ( - gdk_display_get_primary_monitor ( - gdk_display_get_default()), - &monitor); - return monitor.x - 80; -# else - return gdk_screen_get_width (getScreen()) - 80; -# endif + GdkRectangle monitor; + gdk_monitor_get_geometry ( + gdk_display_get_primary_monitor(gdk_display_get_default()), + &monitor); + return monitor.width; + } int YGApplication::displayHeight() { -# if GTK_CHECK_VERSION (3, 22, 0) - GdkRectangle monitor; - gdk_monitor_get_geometry ( - gdk_display_get_primary_monitor ( - gdk_display_get_default()), - &monitor); - return monitor.y - 80; -# else - return gdk_screen_get_height (getScreen()) - 80; -# endif + GdkRectangle monitor; + gdk_monitor_get_geometry ( + gdk_display_get_primary_monitor (gdk_display_get_default()), + &monitor); + return monitor.height; } int YGApplication::displayDepth() @@ -662,10 +653,40 @@ int YGApplication::displayDepth() long YGApplication::displayColors() { return 1L << displayDepth(); /*from yast-qt*/ } -// YCP uses defaultWidth/Height() to use their smaller YWizard impl; we -// want to use a smaller default size than qt though, so assume a bigger size -int YGApplication::defaultWidth() { return MIN (displayWidth(), 1024); } -int YGApplication::defaultHeight() { return MIN (displayHeight(), 768); } +// Get default size as in Qt as much as possible +int YGApplication::defaultWidth() +{ + GdkRectangle availableSize = {0}; + gdk_monitor_get_workarea( + gdk_display_get_primary_monitor(gdk_display_get_default()), + &availableSize); + + int width = availableSize.width; + if ( displayWidth() >= 1024 ) + { + // Scale down to 70% of screen size + width = std::max( (int) (availableSize.width * 0.7), 800 ) ; + } + + return width; +} + +int YGApplication::defaultHeight() +{ + GdkRectangle availableSize = {0}; + gdk_monitor_get_workarea( + gdk_display_get_primary_monitor(gdk_display_get_default()), + &availableSize); + + int height = availableSize.height; + if ( displayWidth() >= 1024 ) + { + // Scale down to 70% of screen size + height = std::max( (int) (availableSize.height * 0.7), 600 ) ; + } + + return height; +} YWidgetFactory *YGUI::createWidgetFactory() { return new YGWidgetFactory; } From e5c5e0b479810b77ec0779c5fb8143a4d397c511 Mon Sep 17 00:00:00 2001 From: Angelo Naselli Date: Sun, 31 Jan 2021 18:27:01 +0100 Subject: [PATCH 02/18] 2.51.0 --- package/libyui-gtk-doc.spec | 2 +- package/libyui-gtk.changes | 6 ++++++ package/libyui-gtk.spec | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/package/libyui-gtk-doc.spec b/package/libyui-gtk-doc.spec index 8f4100f5..ad42937b 100644 --- a/package/libyui-gtk-doc.spec +++ b/package/libyui-gtk-doc.spec @@ -20,7 +20,7 @@ %define so_version 14 Name: %{parent}-doc -Version: 2.50.0 +Version: 2.51.0 Release: 0 Source: %{parent}-%{version}.tar.bz2 diff --git a/package/libyui-gtk.changes b/package/libyui-gtk.changes index bd98be28..d2f6bfca 100644 --- a/package/libyui-gtk.changes +++ b/package/libyui-gtk.changes @@ -1,3 +1,9 @@ +------------------------------------------------------------------- +Sun Jan 31 18:24:20 CET 2021 - anaselli@linux.it + +- Evaluate default size by using working area as in Qt. Issue #76 +- 2.51.0 + ------------------------------------------------------------------- Mon Nov 09 12:01:24 CEST 2020 - anaselli@linux.it diff --git a/package/libyui-gtk.spec b/package/libyui-gtk.spec index 0742e8c4..2dd58eec 100644 --- a/package/libyui-gtk.spec +++ b/package/libyui-gtk.spec @@ -17,7 +17,7 @@ Name: libyui-gtk -Version: 2.50.0 +Version: 2.51.0 Release: 0 Source: %{name}-%{version}.tar.bz2 From 367c6521722db030258e953c07f25da4723f4085 Mon Sep 17 00:00:00 2001 From: Angelo Naselli Date: Sun, 31 Jan 2021 19:23:11 +0100 Subject: [PATCH 03/18] 2.51.0 --- VERSION.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION.cmake b/VERSION.cmake index b644ac53..37fea870 100644 --- a/VERSION.cmake +++ b/VERSION.cmake @@ -1,5 +1,5 @@ SET( VERSION_MAJOR "2" ) -SET( VERSION_MINOR "50" ) +SET( VERSION_MINOR "51" ) SET( VERSION_PATCH "0" ) SET( VERSION "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}${VERSION_SHA1}" ) From 3944236769b1f23581b64abd632ea599957f8335 Mon Sep 17 00:00:00 2001 From: Angelo Naselli Date: Fri, 9 Apr 2021 19:47:54 +0200 Subject: [PATCH 04/18] first attempt to remove legacy buildtools dependency and use GNUInstallDirs macros --- .gitignore | 1 - CMakeLists.txt | 58 ++++++++++++++ Makefile.cvs | 25 ------ Makefile.repo | 63 ++++++++++++++++ bootstrap.sh | 26 ------- src/CMakeLists.txt | 184 ++++++++++++++++++++++++++++++++++++++++++++- 6 files changed, 304 insertions(+), 53 deletions(-) create mode 100644 CMakeLists.txt delete mode 100644 Makefile.cvs create mode 100644 Makefile.repo delete mode 100755 bootstrap.sh diff --git a/.gitignore b/.gitignore index 7d897de2..383f3829 100644 --- a/.gitignore +++ b/.gitignore @@ -39,7 +39,6 @@ Makefile.in # CMake CMakeCache.txt CMakeFiles -CMakeLists.txt Makefile cmake_install.cmake install_manifest.txt diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 00000000..4cadc53b --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,58 @@ +# CMakeLists.txt for libyui-qt +# +# Usage: +# +# mkdir build +# cd build +# cmake .. +# +# make +# sudo make install +# +# Restart with a clean build environment: +# rm -rf build +# +# Show the complete compiler commands with all arguments: +# make VERBOSE=1 + +cmake_minimum_required( VERSION 3.10 ) +project( libyui-qt ) + +# Options usage: +# +# cmake -DBUILD_DOC=on -DBUILD_EXAMPLES=off .. + +option( BUILD_SRC "Build in src/ subdirectory" on ) +option( BUILD_DOC "Build class documentation" off ) +option( WERROR "Treat all compiler warnings as errors" off ) + +# Non-boolean options +set( DOC_DESTDIR "" CACHE STRING "Destination directory prefix for installing docs" ) + +#---------------------------------------------------------------------- + + +set( CMAKE_INSTALL_MESSAGE LAZY ) # Suppress "up-to-date" messages during "make install" + +add_compile_options( "-Wall" ) +IF (NOT CMAKE_BUILD_TYPE STREQUAL "Debug") + # Initialize compiler flags for all targets in all subdirectories + add_compile_options( "-Os" ) # Optimize for size (overrides CMake's -O3 in RELEASE builds) +endif() + +if ( WERROR ) + add_compile_options( "-Werror" ) +endif() + + +# +# Descend into subdirectories +# + +if ( BUILD_SRC ) + add_subdirectory( src ) +endif() + +if ( BUILD_DOC ) + add_subdirectory( doc ) +endif() diff --git a/Makefile.cvs b/Makefile.cvs deleted file mode 100644 index d49dfe60..00000000 --- a/Makefile.cvs +++ /dev/null @@ -1,25 +0,0 @@ -# -# Makefile.cvs -# - -all: configure - -configure: clean - ./bootstrap.sh ; \ - mkdir build ; \ - cd build ; \ - cmake .. \ - -DENABLE_WERROR=OFF \ - -DCMAKE_BUILD_TYPE=RELEASE - -install: configure - cd build ; \ - make && make install - -reconf: - cd build ; \ - cmake rebuild_cache - -clean: - rm -rf build \ - CMakeLists.txt diff --git a/Makefile.repo b/Makefile.repo new file mode 100644 index 00000000..665f1af2 --- /dev/null +++ b/Makefile.repo @@ -0,0 +1,63 @@ +# +# Makefile.repo for libyui-gtk +# + +# Local Variables: +# mode: Makefile +# End: + + +all: clean configure build-hint + +build-hint: + @echo "" + @echo "To build:" + @echo "" + @echo " cd build" + @echo " make" + @echo "" + +configure: + mkdir build; \ + cd build; \ + cmake -DCMAKE_INSTALL_PREFIX=/usr .. + +build: clean configure + cd build; \ + make -j $$(nproc) + +# This needs root privileges, of course +install: configure + cd build; \ + make -j $$(nproc) && make install + +clean: + rm -rf build + +package: + rake package + +doc: + test -d build || mkdir build + cd build; \ + cmake -DBUILD_DOC=on .. ; \ + make doc + +install-doc: doc + cd build; \ + make install-doc + +version-bump: + rake version:bump + +# Just an alias +bump-version: version-bump + + +# Enforce rebuilding some targets unconditionally, even if a file or directory +# with that name exists; otherwise the timestamp of that file or directory +# would be checked. +# +# We need this because we have a subdirectory doc/, a subdirectory package/ +# and possibly a subdirectory build/ here. +.PHONY: doc package build diff --git a/bootstrap.sh b/bootstrap.sh deleted file mode 100755 index 12bc0c9c..00000000 --- a/bootstrap.sh +++ /dev/null @@ -1,26 +0,0 @@ -#!/bin/sh -set -e - -prefix="/usr" - -if [ ! -z $1 ] -then - prefix="$1" -fi - -cmake_common="$prefix/share/libyui/buildtools/CMakeLists.common" -cmake_target="./CMakeLists.txt" - -echo "checking for $cmake_common..." - -if [ -f "$cmake_common" ] -then - ln -fs "$cmake_common" "$cmake_target" - echo "OK: linked to `pwd`/$cmake_target." -else - echo " Use must have libyui(-devel) >= 3.0.4 installed" - echo " in \"$prefix\" first !!!" - exit 1 -fi - -exit 0 diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index b47bd4db..2cd38da1 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1 +1,183 @@ -PROCESS_SOURCES() \ No newline at end of file +# CMakeLists.txt for libyui-qt/src + +include( ../VERSION.cmake ) +include( GNUInstallDirs ) # set CMAKE_INSTALL_INCLUDEDIR, ..._LIBDIR + +# Use the package PkgConfig to detect GTK+ headers/library files +FIND_PACKAGE(PkgConfig REQUIRED) +PKG_CHECK_MODULES(GTK3 REQUIRED gtk+-3.0) + +PKG_CHECK_MODULES(YUI REQUIRED libyui) + +message(" " ${YUI_INCLUDE_DIRS} ${YUI_LIBRARY_DIRS}) + +find_library(YUYU libyui) + + +# +# libyui plugin specific +# + +set( TARGETLIB libyui-gtk ) +set( TARGETLIB_BASE yui-gtk ) + +set( HEADERS_INSTALL_DIR ${CMAKE_INSTALL_INCLUDEDIR}/yui/gtk ) +set( PLUGIN_DIR ${CMAKE_INSTALL_LIBDIR}/yui ) # /usr/lib64/yui + +# if DESTDIR is set, CMAKE_INSTALL_INCLUDEDIR already contains it +# during "make install" (but not for other make targets!): +# +# sudo make install DESTDIR=/work/foo +# or +# DESTDIR=/work/foo sudo make install +# +# -> the include files are installed to /work/foo/usr/include/... +# We need that for RPM builds to install everything to $RPM_BUILD_ROOT. + + +set( SOURCES + YGBarGraph.cc + YGComboBox.cc + YGDialog.cc + ygdkmngloader.c + YGDumbTab.cc + YGFrame.cc + YGImage.cc + YGInputField.cc + YGIntField.cc + YGLabel.cc + YGLayout.cc + YGMenuBar.cc + YGMenuButton.cc + YGPackageSelectorPluginStub.cc + YGProgressBar.cc + YGPushButton.cc + YGRadioButton.cc + YGSelectionStore.cc + YGText.cc + ygtkbargraph.c + ygtkfieldentry.c + ygtkfixed.c + ygtkhtmlwrap.c + ygtkimage.c + ygtklinklabel.c + ygtkmenubutton.c + ygtkratiobox.c + ygtkrichtext.c + ygtksteps.c + ygtktextview.c + ygtktimezonepicker.c + ygtktreeview.c + ygtkwindow.c + ygtkwizard.c + YGTreeView.cc + YGUI.cc + YGUtils.cc + YGWidget.cc + YGWizard.cc + ) + + +set( HEADERS + YGDialog.h + YGMenuBar.h + ygdkmngloader.h + YGi18n.h + YGPackageSelectorPluginIf.h + YGSelectionStore.h + ygtkbargraph.h + ygtkfieldentry.h + ygtkfixed.h + ygtkhtmlwrap.h + ygtkimage.h + ygtklinklabel.h + ygtkmenubutton.h + ygtkratiobox.h + ygtkrichtext.h + ygtksteps.h + ygtktextview.h + ygtktimezonepicker.h + ygtktreeview.h + ygtkwindow.h + ygtkwizard.h + YGUI.h + YGUtils.h + YGWidget.h + ) + + +# Add shared lib to be built +add_library( ${TARGETLIB} SHARED + ${SOURCES} + ${HEADERS} + ) + + +# Include directories and compile options +# + +set( LOCAL_INCLUDE_DIR ${CMAKE_CURRENT_BINARY_DIR}/include ) + +# Symlink ${YUI_INCLUDE_DIRS} +# so the headers there can be included as +add_custom_target( local-include-dir + # check if the symlink already exists + COMMAND if [ ! -L "${LOCAL_INCLUDE_DIR}/yui" ]\; then + rm -rf ${LOCAL_INCLUDE_DIR}\; + mkdir ${LOCAL_INCLUDE_DIR}\; + ln -s ${YUI_INCLUDE_DIRS} ${LOCAL_INCLUDE_DIR}/yui\; + fi + ) + +add_dependencies( ${TARGETLIB} local-include-dir ) +target_include_directories( ${TARGETLIB} BEFORE PUBLIC ${LOCAL_INCLUDE_DIR} ) + +# Setup CMake to use GTK+, tell the compiler where to look for headers +# and to the linker where to look for libraries +INCLUDE_DIRECTORIES(${GTK3_INCLUDE_DIRS} ${YUI_INCLUDE_DIRS} ${CMAKE_CURRENT_SOURCE_DIR}) +LINK_DIRECTORIES(${GTK3_LIBRARY_DIRS} ${YUI_LIBRARY_DIRS}) + + +# Make the version from ../../VERSION.cmake available as a #define +target_compile_definitions( ${TARGETLIB} PUBLIC VERSION="${VERSION}" ) + + +# +# Linking +# + +# Find yui during a combined build +target_link_directories( ${TARGETLIB} BEFORE PUBLIC ../../libyui/build/src ) + + +# Libraries that are needed to build this shared lib +# +# If in doubt what is really needed, check with "ldd -u" which libs are unused. +target_link_libraries( ${TARGETLIB} +# yui + ${YUI_LIBRARIES} + ${GTK3_LIBRARIES} + ) + +# Notice that we don't link against Qt5::Svg, but we need it at runtime: +# +# It's a plugin for Qt and will be used to load SVGs (like our icons) if +# libQt5Svg is available. But we don't use it directly here, only via Qt +# classes like QPixmap and QIcon. Qt loads the SVG plugin as needed. + + +# https://cmake.org/cmake/help/latest/manual/cmake-properties.7.html#target-properties +set_target_properties( ${TARGETLIB} PROPERTIES + VERSION ${SONAME} # From ../../VERSION.cmake + SOVERSION ${SONAME_MAJOR} # From ../../VERSION.cmake + OUTPUT_NAME ${TARGETLIB_BASE} + ) + + +# +# Install +# + +# Install the headers first so the message about the lib does not scroll away +install( FILES ${HEADERS} DESTINATION ${HEADERS_INSTALL_DIR} ) +install( TARGETS ${TARGETLIB} LIBRARY DESTINATION ${PLUGIN_DIR} ) From 2cddf1013113709ddba27f7226ceb2ea274d5ec1 Mon Sep 17 00:00:00 2001 From: Martin Vidner Date: Thu, 15 Apr 2021 12:05:50 +0200 Subject: [PATCH 05/18] Get SONAME_VERSION from libyui.pc Stop relying on ../../VERSION.cmake which is in a different repo --- src/CMakeLists.txt | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 2cd38da1..cbfebcec 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -9,7 +9,7 @@ PKG_CHECK_MODULES(GTK3 REQUIRED gtk+-3.0) PKG_CHECK_MODULES(YUI REQUIRED libyui) -message(" " ${YUI_INCLUDE_DIRS} ${YUI_LIBRARY_DIRS}) +message("YUI include: " ${YUI_INCLUDE_DIRS} " YUI library: " ${YUI_LIBRARY_DIRS}) find_library(YUYU libyui) @@ -165,11 +165,13 @@ target_link_libraries( ${TARGETLIB} # libQt5Svg is available. But we don't use it directly here, only via Qt # classes like QPixmap and QIcon. Qt loads the SVG plugin as needed. +pkg_get_variable(SONAME libyui soversion) +pkg_get_variable(SONAME_MAJOR libyui soversion_major) # https://cmake.org/cmake/help/latest/manual/cmake-properties.7.html#target-properties set_target_properties( ${TARGETLIB} PROPERTIES - VERSION ${SONAME} # From ../../VERSION.cmake - SOVERSION ${SONAME_MAJOR} # From ../../VERSION.cmake + VERSION ${SONAME} + SOVERSION ${SONAME_MAJOR} OUTPUT_NAME ${TARGETLIB_BASE} ) From 69bb438fc7a12a9dbadceee87f87b1558e3afdb4 Mon Sep 17 00:00:00 2001 From: Angelo Naselli Date: Thu, 15 Apr 2021 22:27:10 +0200 Subject: [PATCH 06/18] Managed so version from libyui --- CMakeLists.txt | 7 ++++--- VERSION.cmake | 8 ++++---- src/CMakeLists.txt | 17 +++++++++-------- 3 files changed, 17 insertions(+), 15 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 4cadc53b..6b9ede91 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -53,6 +53,7 @@ if ( BUILD_SRC ) add_subdirectory( src ) endif() -if ( BUILD_DOC ) - add_subdirectory( doc ) -endif() +# TODO +#if ( BUILD_DOC ) +# add_subdirectory( doc ) +#endif() diff --git a/VERSION.cmake b/VERSION.cmake index 37fea870..8a7fad51 100644 --- a/VERSION.cmake +++ b/VERSION.cmake @@ -5,7 +5,7 @@ SET( VERSION "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}${VERSION_SHA1}" ##### This is need for the libyui core, ONLY. ##### These will be overridden from exports in LibyuiConfig.cmake -SET( SONAME_MAJOR "0" ) -SET( SONAME_MINOR "0" ) -SET( SONAME_PATCH "0" ) -SET( SONAME "${SONAME_MAJOR}.${SONAME_MINOR}.${SONAME_PATCH}" ) +#SET( SONAME_MAJOR "0" ) +#SET( SONAME_MINOR "0" ) +#SET( SONAME_PATCH "0" ) +#SET( SONAME "${SONAME_MAJOR}.${SONAME_MINOR}.${SONAME_PATCH}" ) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 2cd38da1..258c031e 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -8,10 +8,16 @@ FIND_PACKAGE(PkgConfig REQUIRED) PKG_CHECK_MODULES(GTK3 REQUIRED gtk+-3.0) PKG_CHECK_MODULES(YUI REQUIRED libyui) +pkg_get_variable(YUI_SO_VERSION libyui soversion) +pkg_get_variable(YUI_SO_MAJOR libyui soversion_major) +#pkg_get_variable(YUI_SO_MINOR libyui soversion_minor) +#pkg_get_variable(YUI_SO_PATCH libyui soversion_patch) -message(" " ${YUI_INCLUDE_DIRS} ${YUI_LIBRARY_DIRS}) +find_package(Boost COMPONENTS system filesystem REQUIRED) -find_library(YUYU libyui) +##### This is needed to be set for the libyui core +SET( SONAME_MAJOR ${YUI_SO_MAJOR} ) +SET( SONAME ${YUI_SO_VERSION} ) # @@ -157,14 +163,9 @@ target_link_libraries( ${TARGETLIB} # yui ${YUI_LIBRARIES} ${GTK3_LIBRARIES} + ${Boost_FILESYSTEM_LIBRARY} ) -# Notice that we don't link against Qt5::Svg, but we need it at runtime: -# -# It's a plugin for Qt and will be used to load SVGs (like our icons) if -# libQt5Svg is available. But we don't use it directly here, only via Qt -# classes like QPixmap and QIcon. Qt loads the SVG plugin as needed. - # https://cmake.org/cmake/help/latest/manual/cmake-properties.7.html#target-properties set_target_properties( ${TARGETLIB} PROPERTIES From fd42a80185153ce5b00a0aba83b0e9a9d5b6e803 Mon Sep 17 00:00:00 2001 From: Angelo Naselli Date: Thu, 29 Apr 2021 20:44:23 +0200 Subject: [PATCH 07/18] Removed old ycp examples --- tests/ButtonOrder.ycp | 39 ------- tests/Cursor.ycp | 21 ---- tests/Dialog-Several.ycp | 14 --- tests/FileDialog.ycp | 63 ------------ tests/Frame.ycp | 27 ----- tests/IconButton.ycp | 20 ---- tests/IconItems-ComboBox.ycp | 25 ----- tests/IconItems-MultiSelectionBox.ycp | 31 ------ tests/IconItems-SelectionBox.ycp | 25 ----- tests/Image.ycp | 68 ------------- tests/ImageMng.ycp | 91 ----------------- tests/InputField-Event.ycp | 36 ------- tests/InvalidWidget.ycp | 33 ------ tests/Label-Underline.ycp | 31 ------ tests/Layout-Align-Weight.ycp | 11 -- tests/Layout-AlignStretch.ycp | 15 --- tests/Layout-Expand.ycp | 32 ------ tests/Layout-Frame2.ycp | 18 ---- tests/Layout-HVCenter-Align.ycp | 9 -- tests/Layout-ReplacePoint.ycp | 13 --- tests/Layout-Split-Split.ycp | 21 ---- tests/Layout-Truncated-Widget.ycp | 44 -------- tests/Layout-Wizard-BackgroundWidget.ycp | 15 --- tests/Layout-Wizard-OneWidget.ycp | 13 --- tests/Layout-Wizard3.ycp | 30 ------ tests/LogView.ycp | 27 ----- tests/MainDialogs.ycp | 38 ------- tests/MultiLine.ycp | 62 ------------ tests/MultiProgressMeterHuge.ycp | 39 ------- tests/MultiProgressMeterVer.ycp | 39 ------- tests/MultiSelectionBox.ycp | 16 --- tests/PollInput.ycp | 26 ----- tests/ProgressBar.ycp | 45 --------- tests/RichText1.ycp | 26 ----- tests/RichText2.ycp | 112 --------------------- tests/RussianAccel.ycp | 10 -- tests/SelectionBox.ycp | 45 --------- tests/Sleep.ycp | 33 ------ tests/Slider-Event.ycp | 36 ------- tests/StockButtons.ycp | 20 ---- tests/StockIcons.ycp | 55 ---------- tests/Table-Edit.ycp | 60 ----------- tests/Table3-4.ycp | 68 ------------- tests/Tree-rebuild.ycp | 55 ---------- tests/Tree3.ycp | 123 ----------------------- tests/Wizard-ChangingTitle.ycp | 29 ------ tests/Wizard.ycp | 16 --- tests/Wizard2.ycp | 23 ----- tests/WizardList.ycp | 33 ------ tests/image.gif | Bin 54314 -> 0 bytes tests/movie1.mng | Bin 28074 -> 0 bytes tests/movie2.mng | Bin 3984 -> 0 bytes tests/movie3.mng | Bin 39640 -> 0 bytes tests/movie4.mng | Bin 7616 -> 0 bytes tests/movie5.mng | Bin 34394 -> 0 bytes tests/movie6.mng | Bin 9736 -> 0 bytes tests/movie7.mng | Bin 44430 -> 0 bytes tests/movie8.mng | Bin 6695 -> 0 bytes 58 files changed, 1781 deletions(-) delete mode 100644 tests/ButtonOrder.ycp delete mode 100644 tests/Cursor.ycp delete mode 100644 tests/Dialog-Several.ycp delete mode 100644 tests/FileDialog.ycp delete mode 100644 tests/Frame.ycp delete mode 100755 tests/IconButton.ycp delete mode 100755 tests/IconItems-ComboBox.ycp delete mode 100755 tests/IconItems-MultiSelectionBox.ycp delete mode 100755 tests/IconItems-SelectionBox.ycp delete mode 100644 tests/Image.ycp delete mode 100644 tests/ImageMng.ycp delete mode 100644 tests/InputField-Event.ycp delete mode 100644 tests/InvalidWidget.ycp delete mode 100644 tests/Label-Underline.ycp delete mode 100755 tests/Layout-Align-Weight.ycp delete mode 100644 tests/Layout-AlignStretch.ycp delete mode 100755 tests/Layout-Expand.ycp delete mode 100755 tests/Layout-Frame2.ycp delete mode 100755 tests/Layout-HVCenter-Align.ycp delete mode 100755 tests/Layout-ReplacePoint.ycp delete mode 100755 tests/Layout-Split-Split.ycp delete mode 100644 tests/Layout-Truncated-Widget.ycp delete mode 100755 tests/Layout-Wizard-BackgroundWidget.ycp delete mode 100755 tests/Layout-Wizard-OneWidget.ycp delete mode 100755 tests/Layout-Wizard3.ycp delete mode 100644 tests/LogView.ycp delete mode 100644 tests/MainDialogs.ycp delete mode 100644 tests/MultiLine.ycp delete mode 100644 tests/MultiProgressMeterHuge.ycp delete mode 100644 tests/MultiProgressMeterVer.ycp delete mode 100644 tests/MultiSelectionBox.ycp delete mode 100644 tests/PollInput.ycp delete mode 100644 tests/ProgressBar.ycp delete mode 100644 tests/RichText1.ycp delete mode 100644 tests/RichText2.ycp delete mode 100644 tests/RussianAccel.ycp delete mode 100755 tests/SelectionBox.ycp delete mode 100644 tests/Sleep.ycp delete mode 100644 tests/Slider-Event.ycp delete mode 100644 tests/StockButtons.ycp delete mode 100644 tests/StockIcons.ycp delete mode 100644 tests/Table-Edit.ycp delete mode 100644 tests/Table3-4.ycp delete mode 100644 tests/Tree-rebuild.ycp delete mode 100644 tests/Tree3.ycp delete mode 100644 tests/Wizard-ChangingTitle.ycp delete mode 100644 tests/Wizard.ycp delete mode 100644 tests/Wizard2.ycp delete mode 100644 tests/WizardList.ycp delete mode 100644 tests/image.gif delete mode 100644 tests/movie1.mng delete mode 100644 tests/movie2.mng delete mode 100644 tests/movie3.mng delete mode 100644 tests/movie4.mng delete mode 100644 tests/movie5.mng delete mode 100644 tests/movie6.mng delete mode 100644 tests/movie7.mng delete mode 100644 tests/movie8.mng diff --git a/tests/ButtonOrder.ycp b/tests/ButtonOrder.ycp deleted file mode 100644 index 7fd260ca..00000000 --- a/tests/ButtonOrder.ycp +++ /dev/null @@ -1,39 +0,0 @@ -/* - -This example was made to test behaviour of button ordering (initially due to bnc#479874). - - */ - -{ -import "Label"; - UI::OpenDialog( - `VBox( - `Label ("`PushButton (`id (`cancel), `opt(`cancelButton, `key_F9, `default), Label::BackButton()),"), - `Label ("`PushButton (`id (`ok), `opt (`okButton, `key_F10), Label::InstallButton ())"), - `ButtonBox ( - `PushButton (`id (`cancel), `opt(`cancelButton, `key_F9, `default), Label::BackButton()), - `PushButton (`id (`ok), `opt (`okButton, `key_F10), Label::InstallButton ()) - ) - ) - ); - any ret = UI::UserInput(); - if (ret == `cancel) y2milestone ("Cancel pressed"); - if (ret == `ok) y2milestone ("Ok pressed"); - UI::CloseDialog(); - UI::OpenDialog( - `VBox( - `Label ("`PushButton (`id (`cancel), `opt(`cancelButton, `key_F10, `default), Label::BackButton()),"), - `Label ("`PushButton (`id (`ok), `opt (`okButton, `key_F9), Label::InstallButton ())"), - `ButtonBox ( - `PushButton (`id (`cancel), `opt(`cancelButton, `key_F10, `default), Label::BackButton()), - `PushButton (`id (`ok), `opt (`okButton, `key_F9), Label::InstallButton ()) - ) - ) - ); - ret = UI::UserInput(); - if (ret == `cancel) y2milestone ("Cancel pressed"); - if (ret == `ok) y2milestone ("Ok pressed"); - UI::CloseDialog(); - - -} diff --git a/tests/Cursor.ycp b/tests/Cursor.ycp deleted file mode 100644 index 15f851c5..00000000 --- a/tests/Cursor.ycp +++ /dev/null @@ -1,21 +0,0 @@ -// Cursor test -{ - UI::OpenDialog ( - `VBox ( - `IntField (`id (`time), "Work for (secs):", 0, 10, 2), - `PushButton (`id (`work), "&Work!"), - `PushButton (`id (`cancel), "&Close") - ) - ); - - any ret = nil; - repeat { - ret = UI::UserInput(); - - if (ret == `work) - sleep ((integer) UI::QueryWidget (`time, `Value) * 1000); - - } until (ret == `cancel); - - UI::CloseDialog(); -} diff --git a/tests/Dialog-Several.ycp b/tests/Dialog-Several.ycp deleted file mode 100644 index bc29e67e..00000000 --- a/tests/Dialog-Several.ycp +++ /dev/null @@ -1,14 +0,0 @@ -// bug 389635 -{ - UI::OpenDialog(`opt (`defaultsize), `PushButton ("One")); - UI::WaitForEvent(); - sleep (2000); - - UI::OpenDialog(`PushButton ("Two")); - UI::WaitForEvent(); - sleep (2000); - - UI::OpenDialog(`PushButton ("Three")); - UI::WaitForEvent(); -} - diff --git a/tests/FileDialog.ycp b/tests/FileDialog.ycp deleted file mode 100644 index b4d8c6f1..00000000 --- a/tests/FileDialog.ycp +++ /dev/null @@ -1,63 +0,0 @@ -// Tests for file dialog calls: -// string UI::AskForExistingFile (startWith, filter, headline) -// string UI::AskForSaveFileName (startWith, filter, headline) -// string UI::AskForExistingDirectory (startWith, headline) - -{ - define void show_selected (string selected) - { - UI::OpenDialog ( - `VBox ( - `HBox ( - `Label ("You have selected:"), - `Label (`opt (`outputField), selected) - ), - `PushButton ("OK") - ) - ); - UI::UserInput(); - UI::CloseDialog(); - }; - - while (true) { - UI::OpenDialog ( - `VBox ( - `ComboBox (`id (`combo_action), "Action:", - [ - `item (`id (`open_file), "Open File"), - `item (`id (`save_file), "Save File"), - `item (`id (`select_folder), "Select Folder") - ] ), - `TextEntry (`id (`entry_path), "Some path:"), - `TextEntry (`id (`entry_filter), "Filter:", "*"), - `HBox ( - `PushButton (`id (`ok), "OK"), - `PushButton (`id (`cancel), "Cancel") - ) - ) - ); - any ret = UI::UserInput(); - - if (ret == `cancel) - break; - - string start_path = (string) UI::QueryWidget (`id (`entry_path), `Value); - string filter_str = (string) UI::QueryWidget (`id (`entry_filter), `Value); - - string ret_path = nil; - - any action = UI::QueryWidget (`id (`combo_action), `Value); - UI::CloseDialog(); - - if (action == `open_file) - ret_path = UI::AskForExistingFile (start_path, filter_str, "Choose a File"); - else if (action == `save_file) - ret_path = UI::AskForSaveFileName (start_path, filter_str, "Choose a File"); - else if (action == `select_folder) - ret_path = UI::AskForExistingDirectory (start_path, "Choose a Folder"); - - if (ret_path == nil) - ret_path = "(none)"; - show_selected (ret_path); - } -} diff --git a/tests/Frame.ycp b/tests/Frame.ycp deleted file mode 100644 index 4d87cbb0..00000000 --- a/tests/Frame.ycp +++ /dev/null @@ -1,27 +0,0 @@ -{ -UI::OpenDialog ( - `VBox ( - `Frame ("CPU &Speed", - `VBox ( - `RadioButtonGroup( - `VBox ( - `Left(`RadioButton("Normal")), - `Left(`RadioButton("Overclocked")), - `Left(`RadioButton("Red Hot")), - `Left(`RadioButton("Melting", true)), - `Left(`TextEntry ("Delay:", "20")) - ) - ), - `Frame - ( "Exact speed", - `Slider ("CPU", 0, 100, 85) - ) - ) - ), - `PushButton("&OK") - ) - ); - -UI::UserInput(); -UI::CloseDialog(); -} diff --git a/tests/IconButton.ycp b/tests/IconButton.ycp deleted file mode 100755 index 457dea2a..00000000 --- a/tests/IconButton.ycp +++ /dev/null @@ -1,20 +0,0 @@ -// PushButton with icons (relative path) -{ - UI::OpenDialog ( - `VBox ( - `Heading( "YaST2 Mini Control Center" ), - `IconButton (`id ("keyboard "), "yast-keyboard.png", "Keyboard"), - `IconButton (`id ("mouse" ), "yast-mouse.png", "Mouse"), - `IconButton (`id ("timezone" ), "yast-timezone.png", "Time zone"), - `IconButton (`id ("lan" ), "yast-lan.png", "Network"), - `IconButton (`id ("sw_single"), "yast-software.png", "Software") - ) - ); - - string tool = (string) UI::UserInput(); - UI::CloseDialog(); - - UI::OpenDialog (`Label ("Running " + tool + "...")); - sleep (4000); - UI::CloseDialog(); -} diff --git a/tests/IconItems-ComboBox.ycp b/tests/IconItems-ComboBox.ycp deleted file mode 100755 index 50d894c9..00000000 --- a/tests/IconItems-ComboBox.ycp +++ /dev/null @@ -1,25 +0,0 @@ -// ComboBox with icons -{ - UI::OpenDialog ( - `VBox ( - `Heading( "YaST2 Mini Control Center" ), - `ComboBox (`id (`mod), `opt (`editable), "Modules", - [ "Auto-Yast", - `item(`id ("keyboard" ), `icon( "yast-keyboard.png"), "Keyboard" ), - `item(`id ("mouse" ), `icon( "yast-mouse.png" ), "Mouse" ), - `item(`id ("timezone" ), `icon( "yast-timezone.png"), "Time zone"), - `item(`id ("lan" ), `icon( "yast-lan.png" ), "Network" ), - `item(`id ("sw_single"), `icon( "yast-software.png"), "Software" ) - ] ), - `PushButton("&OK") - ) - ); - - UI::UserInput(); - string tool = (string) UI::QueryWidget (`id(`mod ), `Value); - UI::CloseDialog(); - - UI::OpenDialog (`Label ("Running " + tool + "...")); - sleep (4000); - UI::CloseDialog(); -} diff --git a/tests/IconItems-MultiSelectionBox.ycp b/tests/IconItems-MultiSelectionBox.ycp deleted file mode 100755 index ce6c65b1..00000000 --- a/tests/IconItems-MultiSelectionBox.ycp +++ /dev/null @@ -1,31 +0,0 @@ -// ComboBox with icons -{ - UI::OpenDialog ( - `VBox ( - `Heading( "YaST2 Mini Control Center" ), - `MultiSelectionBox (`id (`mod), "Modules", - [ "auto-yast", - `item(`id ("keyboard" ), `icon( "yast-keyboard.png"), "Keyboard", true ), - `item(`id ("mouse" ), `icon( "yast-mouse.png" ), "Mouse", true ), - `item(`id ("timezone" ), `icon( "yast-timezone.png"), "Time zone"), - `item(`id ("lan" ), `icon( "yast-lan.png" ), "Network" ), - `item(`id ("sw_single"), `icon( "yast-software.png"), "Software" ) - ] ), - `PushButton("&OK") - ) - ); - - UI::UserInput(); - list mods = (list) UI::QueryWidget (`id(`mod ), `SelectedItems); - UI::CloseDialog(); - - string text = "Running "; - foreach (`it, mods, - ``{ text = sformat( "%1, %2", text, it); } - ); - text = text + "..."; - - UI::OpenDialog (`Label (text)); - sleep (4000); - UI::CloseDialog(); -} diff --git a/tests/IconItems-SelectionBox.ycp b/tests/IconItems-SelectionBox.ycp deleted file mode 100755 index cd107cad..00000000 --- a/tests/IconItems-SelectionBox.ycp +++ /dev/null @@ -1,25 +0,0 @@ -// ComboBox with icons -{ - UI::OpenDialog ( - `VBox ( - `Heading( "YaST2 Mini Control Center" ), - `SelectionBox (`id (`mod), "Modules", - [ "Auto-Yast", - `item(`id ("keyboard" ), `icon( "yast-keyboard.png"), "Keyboard" ), - `item(`id ("mouse" ), `icon( "yast-mouse.png" ), "Mouse" ), - `item(`id ("timezone" ), `icon( "yast-timezone.png"), "Time zone"), - `item(`id ("lan" ), `icon( "yast-lan.png" ), "Network" ), - `item(`id ("sw_single"), `icon( "yast-software.png"), "Software" ) - ] ), - `PushButton("&OK") - ) - ); - - UI::UserInput(); - string mod = (string) UI::QueryWidget (`id(`mod ), `CurrentItem); - UI::CloseDialog(); - - UI::OpenDialog (`Label ("Running " + mod + "...")); - sleep (4000); - UI::CloseDialog(); -} diff --git a/tests/Image.ycp b/tests/Image.ycp deleted file mode 100644 index 384910d5..00000000 --- a/tests/Image.ycp +++ /dev/null @@ -1,68 +0,0 @@ -// Image test -string filename = "tests/image.gif"; - -{ - UI::OpenDialog ( - `VBox ( - `ReplacePoint (`id (`replace_image), - `ColoredLabel ("Choose an image type option!", `rgb (0, 0, 0), - `rgb (255, 0, 0), 5) - ), - - `Frame ("Image type:", - `RadioButtonGroup (`id(`rb), - `VBox( - `Left (`RadioButton(`id (`static),`opt(`notify), "&Static")), - `Left (`RadioButton(`id (`animation), `opt(`notify), "&Animation")) - ) - ) - ), - - `Frame ("Image effect:", - `RadioButtonGroup (`id(`rb), - `VBox( - `Left (`RadioButton(`id (`no_effect), `opt(`notify), "&None", true)), - `Left (`RadioButton(`id (`tiled_effect),`opt(`notify), "&Tiled")), - `Left (`RadioButton(`id (`scaled_effect), `opt(`notify), "&Scaled")) - ) - ) - ), - `Right (`Label ("Resize the window!")), - `PushButton(`id (`close), "&Close") - ) - ); - - any ret = nil; - while (true) - { - ret = UI::UserInput(); - if (ret == `close || ret == `cancel) - break; - - any type_opt = nil; - if (!(boolean) UI::QueryWidget(`id(`static), `Value)) - type_opt = `animated; - - any effect_opt = nil; - if ((boolean) UI::QueryWidget(`id(`tiled_effect), `Value)) - effect_opt = `tiled; - else if ((boolean) UI::QueryWidget(`id(`scaled_effect), `Value)) - effect_opt = `scaleToFit; - - // needed for tiling (scaling sets this automatically, anyway...) - any zerowidth = nil; - any zeroheight = nil; - if (effect_opt != nil) { - zerowidth = `zeroWidth; - zeroheight = `zeroHeight; - } - - UI::ReplaceWidget (`replace_image, - `Image (`opt (type_opt, effect_opt, zerowidth, zeroheight), - filename, filename + " not found")); - - } - - UI::CloseDialog(); -} - diff --git a/tests/ImageMng.ycp b/tests/ImageMng.ycp deleted file mode 100644 index 7f59e6f0..00000000 --- a/tests/ImageMng.ycp +++ /dev/null @@ -1,91 +0,0 @@ -// Image test -// TODO: make it getting the filename as an argument - -{ - UI::OpenDialog ( - `VBox ( - `ReplacePoint (`id (`replace_image), - `ColoredLabel ("Choose an image first!", `rgb (0, 0, 0), - `rgb (255, 0, 0), 5) - ), - - `Frame ("Which MNG file:", - `RadioButtonGroup (`id(`rb), - `VBox( - `Left (`RadioButton(`id (`movie1), `opt(`notify), "&Movie1")), - `Left (`RadioButton(`id (`movie2), `opt(`notify), "&Movie2")), - `Left (`RadioButton(`id (`movie3), `opt(`notify), "&Movie3")), - `Left (`RadioButton(`id (`movie4), `opt(`notify), "&Movie4")), - `Left (`RadioButton(`id (`movie5), `opt(`notify), "&Movie5")), - `Left (`RadioButton(`id (`movie6), `opt(`notify), "&Movie6")), - `Left (`RadioButton(`id (`movie7), `opt(`notify), "&Movie7")), - `Left (`RadioButton(`id (`movie8), `opt(`notify), "&Movie8")) - ) - ) - ), - - `Frame ("Image effect:", - `RadioButtonGroup (`id(`rb), - `VBox( - `Left (`RadioButton(`id (`no_effect), `opt(`notify), "&None", true)), - `Left (`RadioButton(`id (`tiled_effect),`opt(`notify), "&Tiled")), - `Left (`RadioButton(`id (`scaled_effect), `opt(`notify), "&Scaled")) - ) - ) - ), - `Right (`Label ("Resize the window!")), - `PushButton(`id (`close), "&Close") - ) - ); - - any ret = nil; - while (true) - { - ret = UI::UserInput(); - if (ret == `close || ret == `cancel) - break; - - any effect_opt = nil; - if ((boolean) UI::QueryWidget(`id(`tiled_effect), `Value)) - effect_opt = `tiled; - else if ((boolean) UI::QueryWidget(`id(`scaled_effect), `Value)) - effect_opt = `scaleToFit; - - // needed for tiling (scaling sets this automatically, anyway...) - any zerowidth = nil; - any zeroheight = nil; - if (effect_opt != nil) { - zerowidth = `zeroWidth; - zeroheight = `zeroHeight; - } - - string filename = ""; - if ((boolean) UI::QueryWidget(`id(`movie1), `Value)) - filename = "tests/movie1.mng"; - else if ((boolean) UI::QueryWidget(`id(`movie2), `Value)) - filename = "tests/movie2.mng"; - else if ((boolean) UI::QueryWidget(`id(`movie3), `Value)) - filename = "tests/movie3.mng"; - else if ((boolean) UI::QueryWidget(`id(`movie4), `Value)) - filename = "tests/movie4.mng"; - else if ((boolean) UI::QueryWidget(`id(`movie5), `Value)) - filename = "tests/movie5.mng"; - else if ((boolean) UI::QueryWidget(`id(`movie6), `Value)) - filename = "tests/movie6.mng"; - else if ((boolean) UI::QueryWidget(`id(`movie7), `Value)) - filename = "tests/movie7.mng"; - else - filename = "tests/movie8.mng"; - - // to test inline images, uncomment next line and pass it to `Image - //byteblock data = (byteblock) SCR::Read (.target.byte, filename); - - UI::ReplaceWidget (`replace_image, - `Image (`opt (`animated, effect_opt, zerowidth, zeroheight), - filename, filename + " not found")); - - } - - UI::CloseDialog(); -} - diff --git a/tests/InputField-Event.ycp b/tests/InputField-Event.ycp deleted file mode 100644 index aad9b720..00000000 --- a/tests/InputField-Event.ycp +++ /dev/null @@ -1,36 +0,0 @@ -{ - UI::OpenDialog( - `VBox( - `InputField(`id(`field1), `opt(`notify), ""), - `InputField(`id(`field2), `opt(`notify), "") - ) - ); - - symbol widget = nil; - - do { - - widget = (symbol) UI::UserInput(); - - switch (widget) - { - case `field1: - { - string v = (string) UI::QueryWidget(`id(`field1), `Value); - UI::ChangeWidget(`id(`field2), `Value, v + "a"); - } - break; - - case `field2: - { - string v = (string) UI::QueryWidget(`id(`field2), `Value); - UI::ChangeWidget(`id(`field1), `Value, v + "b"); - } - break; - } - - } while (widget != `cancel); - - UI::CloseDialog(); -} - diff --git a/tests/InvalidWidget.ycp b/tests/InvalidWidget.ycp deleted file mode 100644 index 452b84f4..00000000 --- a/tests/InvalidWidget.ycp +++ /dev/null @@ -1,33 +0,0 @@ -// Invalid Widget -- bug 421794 - -{ - // a top dialog, so we don't get an error on the UserInput() at the end - UI::OpenDialog (`Label ("top")); - - // press the button to emit some events - UI::OpenDialog ( - `VBox ( - `Label ("Press the Button"), - `PushButton (`id (`ok), "Ok") - ) - ); - sleep (4000); - - UI::CloseDialog(); // destroy the thing - - // overwrite the memory - UI::OpenDialog ( - `VBox ( - `Label ("Wait a sec") - ) - ); - sleep (500); - UI::CloseDialog(); - - UI::PollInput(); // crash on -gtk, if button clicked -// UI::UserInput(); // use either: both crash the thing - - sleep (2000); - UI::CloseDialog(); -} - diff --git a/tests/Label-Underline.ycp b/tests/Label-Underline.ycp deleted file mode 100644 index 71911c71..00000000 --- a/tests/Label-Underline.ycp +++ /dev/null @@ -1,31 +0,0 @@ -// Underline Example - bug 559226 -// -// Escape literal '&' - -{ - import "Wizard"; - import "Popup"; - import "Label"; - - Wizard::CreateDialog (); - Wizard::SetContentsButtons ("Default button demo", - `VBox( - `PushButton("&One"), - `PushButton("&Tw&o"), - `PushButton("Escape&&"), - `PushButton("&Escape &&2"), - `PushButton("&Escape &&2&&&&"), - `PushButton("Escape &&&2&&&&"), - `PushButton("_gtk1"), - `PushButton("__gtk2") - ), - "Help", - Label::BackButton(), - Label::NextButton() - ); - - - Wizard::UserInput(); - Wizard::CloseDialog(); -} - diff --git a/tests/Layout-Align-Weight.ycp b/tests/Layout-Align-Weight.ycp deleted file mode 100755 index 0105dd17..00000000 --- a/tests/Layout-Align-Weight.ycp +++ /dev/null @@ -1,11 +0,0 @@ -// alignment - weight test -{ -UI::OpenDialog( - `HBox( - `Right (`HWeight (1, `PushButton ("Left"))), - `Left (`HWeight (1, `PushButton ("Right"))) - ) -); -UI::UserInput(); -UI::CloseDialog(); -} diff --git a/tests/Layout-AlignStretch.ycp b/tests/Layout-AlignStretch.ycp deleted file mode 100644 index 78ded82a..00000000 --- a/tests/Layout-AlignStretch.ycp +++ /dev/null @@ -1,15 +0,0 @@ -// alignment (test case for inst_productsources bug) -{ -UI::OpenDialog( - `VBox( - `HBox( - `PushButton ("Fixed"), - `Bottom (`PushButton ("Test")) - ), - `VWeight( 1, `MultiLineEdit("Description", "bla bla") ) - ) -); -UI::UserInput(); -UI::CloseDialog(); -} - diff --git a/tests/Layout-Expand.ycp b/tests/Layout-Expand.ycp deleted file mode 100755 index e0a4cc67..00000000 --- a/tests/Layout-Expand.ycp +++ /dev/null @@ -1,32 +0,0 @@ -// Widgets expand and align -{ -// stand-alone -UI::OpenDialog( - `HBox( - `VBox ( - `MultiLineEdit ("Multi Line Edit", "some text"), - `PushButton ("Yes") - ), - `PushButton ("No") - ) - ); -UI::UserInput(); - -// on wizard -UI::OpenDialog( - `Wizard (`back, "&Back", `abort, "Ab&ort", `next, "&Next") - ); - -UI::ReplaceWidget (`id (`contents), - `HBox( - `VBox ( - `MultiLineEdit ("Multi Line Edit", "some text"), - `PushButton ("Yes") - ), - `PushButton ("No") - ) - ); - -UI::UserInput(); -UI::CloseDialog(); -} diff --git a/tests/Layout-Frame2.ycp b/tests/Layout-Frame2.ycp deleted file mode 100755 index 416fec9c..00000000 --- a/tests/Layout-Frame2.ycp +++ /dev/null @@ -1,18 +0,0 @@ -{ - UI::OpenDialog( `VBox( - `Frame ( `opt (`vstretch), "CPU &Speed", - `RadioButtonGroup( - `VBox( - `Left(`RadioButton("Normal" )), - `Left(`RadioButton("Overclocked" )), - `Left(`RadioButton("Red Hot" )), - `Left(`RadioButton("Melting", true )) - ) - ) - ), - `PushButton("&OK") - ) - ); - UI::UserInput(); - UI::CloseDialog(); -} diff --git a/tests/Layout-HVCenter-Align.ycp b/tests/Layout-HVCenter-Align.ycp deleted file mode 100755 index 52d5315e..00000000 --- a/tests/Layout-HVCenter-Align.ycp +++ /dev/null @@ -1,9 +0,0 @@ -// HVCenter alignment test -{ -UI::OpenDialog( - `HVCenter (`ColoredLabel(`opt (`hstretch, `vstretch), "Hello, World!", `rgb (200, 0, 0), `rgb (200, 200, 50), 20)) -); - -UI::UserInput(); -UI::CloseDialog(); -} diff --git a/tests/Layout-ReplacePoint.ycp b/tests/Layout-ReplacePoint.ycp deleted file mode 100755 index 9dbae348..00000000 --- a/tests/Layout-ReplacePoint.ycp +++ /dev/null @@ -1,13 +0,0 @@ -// replacement stretchable test -{ -UI::OpenDialog( - `ReplacePoint (`id (`rp), `PushButton ("Push Me!")) -); - -UI::UserInput(); - -UI::ReplaceWidget (`rp, `MultiLineEdit ("", "I should be all stretched!")); - -UI::UserInput(); -UI::CloseDialog(); -} diff --git a/tests/Layout-Split-Split.ycp b/tests/Layout-Split-Split.ycp deleted file mode 100755 index 2e65b3af..00000000 --- a/tests/Layout-Split-Split.ycp +++ /dev/null @@ -1,21 +0,0 @@ -// Split in a split behavior -{ -UI::OpenDialog (`opt (`defaultsize), `HBox (`PushButton ("Okay"))); -UI::UserInput(); - -UI::OpenDialog (`opt (`defaultsize), `HBox (`PushButton ("Okay"), `VBox (`PushButton ("Nay"), `PushButton ("Pay")))); -UI::UserInput(); - -UI::OpenDialog(`opt (`defaultsize), `Wizard (`back, "&Back", `abort, "Ab&ort", `next, "&Next")); -UI::ReplaceWidget (`contents, `HBox (`VBox(`PushButton ("Okay")), `VBox (`PushButton ("Nay"), `PushButton ("Pay")))); -UI::UserInput(); - -UI::OpenDialog (`opt (`defaultsize), `VBox (`HBox (`VBox(`PushButton ("Okay")), `VBox (`PushButton ("Nay"), `PushButton ("Pay"))))); -UI::UserInput(); - -UI::OpenDialog (`opt (`defaultsize), `VBox (`HBox(`PushButton ("Okay")))); -UI::UserInput(); - -UI::OpenDialog (`opt (`defaultsize), `HBox (`VBox(`PushButton ("Okay")))); -UI::UserInput(); -} diff --git a/tests/Layout-Truncated-Widget.ycp b/tests/Layout-Truncated-Widget.ycp deleted file mode 100644 index ca318a53..00000000 --- a/tests/Layout-Truncated-Widget.ycp +++ /dev/null @@ -1,44 +0,0 @@ -// Let's create and destroy something - -{ - -list strings = - [ "What a long button I am :D", ":/" ]; -integer cur_string = 1; - -UI::OpenDialog - ( - `MarginBox (5, 5, `VBox - ( - `ReplacePoint(`id(`kill_replaceable), `PushButton( `id(`kill), - "I am a waste of space" )), - `PushButton( `id(`transform), select(strings, cur_string, nil) ), - `Left (`PushButton( `id(`quit), "Exit" )) - ) - ) - ); - -any button_id = nil; - -while (true) - { - button_id = UI::UserInput(); - - if (button_id == `quit) - break; - - if (button_id == `transform) - { - cur_string = (cur_string + 1) % 2; - UI::ChangeWidget (`transform, `Label, select(strings, cur_string, nil)); - } - - if (button_id == `kill) - { - UI::ReplaceWidget (`kill_replaceable, `Empty()); - } - - - } -UI::CloseDialog(); -} diff --git a/tests/Layout-Wizard-BackgroundWidget.ycp b/tests/Layout-Wizard-BackgroundWidget.ycp deleted file mode 100755 index 7c4a3cf4..00000000 --- a/tests/Layout-Wizard-BackgroundWidget.ycp +++ /dev/null @@ -1,15 +0,0 @@ -// Widget with background on wizard -{ -UI::OpenDialog (`opt(`defaultsize), - `Wizard (`back, "&Back", `abort, "Ab&ort", `next, "&Next") - ); - - UI::ReplaceWidget (`contents, - `VBox ( - `HVCenter (`BackgroundPixmap ("wallpapers/welcome.jpg"), - `MultiLineEdit ("", "I should have a background around me.")) - ) - ); -UI::UserInput(); -UI::CloseDialog(); -} diff --git a/tests/Layout-Wizard-OneWidget.ycp b/tests/Layout-Wizard-OneWidget.ycp deleted file mode 100755 index fa95cbab..00000000 --- a/tests/Layout-Wizard-OneWidget.ycp +++ /dev/null @@ -1,13 +0,0 @@ -// wizard, one widget test -{ -UI::OpenDialog( - `Wizard (`back, "&Back", `abort, "Ab&ort", `next, "&Next") -); - -UI::ReplaceWidget (`contents, `ColoredLabel(`opt (`hstretch, `vstretch), "Hello, World!", `rgb (200, 0, 0), `rgb (200, 200, 50), 20)); -// non-stretchable: -//UI::ReplaceWidget (`contents, `ColoredLabel("Hello, World!", `rgb (200, 0, 0), `rgb (200, 200, 50), 20)); - -UI::UserInput(); -UI::CloseDialog(); -} diff --git a/tests/Layout-Wizard3.ycp b/tests/Layout-Wizard3.ycp deleted file mode 100755 index 4e06b084..00000000 --- a/tests/Layout-Wizard3.ycp +++ /dev/null @@ -1,30 +0,0 @@ -// The widget should get center aligned on wizard, but not ordinary dialogs -{ -// stand-alone -UI::OpenDialog( - `VBox( - `Heading ("Header"), - `VSpacing (0.5), - `Label ("This text should get on top") - ) - ); -UI::UserInput(); - -// on wizard -UI::OpenDialog( - `Wizard (`back, "&Back", `abort, "Ab&ort", `next, "&Next") - ); - - -UI::ReplaceWidget (`id (`contents), - `VBox( - `Heading ("Header"), - `VSpacing (0.5), - `Label ("This text should get centered") - ) - ); - - -UI::UserInput(); -UI::CloseDialog(); -} diff --git a/tests/LogView.ycp b/tests/LogView.ycp deleted file mode 100644 index 9e41a1bd..00000000 --- a/tests/LogView.ycp +++ /dev/null @@ -1,27 +0,0 @@ -// LogView test - -{ - UI::OpenDialog ( - `VBox ( - `LogView (`id (`text), "", 5, 50), - `MultiLineEdit (`id (`source), `opt(`notify), "Source code", ""), - `PushButton (`id (`close), `opt(`default), "&Close") - ) - ); - - any ret = nil; - repeat - { - ret = UI::UserInput(); - - if (ret == `source) - { - UI::ChangeWidget (`id (`text), `Value, - (string) UI::QueryWidget(`id(`source), `Value)); - } - - } until (ret == `close || ret == `cancel); - - UI::CloseDialog(); -} - diff --git a/tests/MainDialogs.ycp b/tests/MainDialogs.ycp deleted file mode 100644 index 859cfe75..00000000 --- a/tests/MainDialogs.ycp +++ /dev/null @@ -1,38 +0,0 @@ -// This is a test for the usage of multiple main dialogs -// (that is with the defaultsize attribute). They should -// all share the same window. - -{ - UI::OpenDialog (`opt (`defaultsize), - `VBox ( - `Heading ("First dialog"), - `PushButton (`id (`next), "Next"), - `PushButton ("Close") - ) - ); - - while (UI::UserInput() == `next) { - UI::OpenDialog (`opt (`defaultsize), - `VBox ( - `Heading ("Second dialog"), - `PushButton (`id (`next), "Next"), - `PushButton ("Back") - ) - ); - - while (UI::UserInput() == `next) { - UI::OpenDialog (`opt (`defaultsize), - `VBox ( - `Heading ("Third dialog"), - `PushButton ("Close") - ) - ); - UI::UserInput(); - UI::CloseDialog(); - } - - UI::CloseDialog(); - } - - UI::CloseDialog(); -} diff --git a/tests/MultiLine.ycp b/tests/MultiLine.ycp deleted file mode 100644 index c2151198..00000000 --- a/tests/MultiLine.ycp +++ /dev/null @@ -1,62 +0,0 @@ -// MultiLine Example -{ - string description = "Below is test Archive Description, please ignore its content ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -PSA Peugeot Citroën Chooses SUSE Linux Enterprise Desktop from Novell -PARIS (Solutions Linux 2007) -30 Jan 2007 - -Giant French automaker to deploy Linux desktops, citing cost, usability, integration and support - -PSA Peugeot Citroën, the second-largest automobile manufacturer in Europe, and Novell just signed a multiyear contract allowing the deployment of up to 20,000 Linux* desktops plus 2,500 Linux servers from Novell. - -“We found SUSE® Linux Enterprise Desktop to be well supported and extremely user friendly,” said an IT representative for PSA Peugeot Citroën. “Novell's commitment to open source and close collaboration with leading hardware and application vendors to ensure the support of our IT requirements were key factors in our choice. In addition, SUSE Linux Enterprise Desktop integrates seamlessly in our Windows-based infrastructure.” - -Ron Hovsepian, president and CEO of Novell, said, “PSA Peugeot Citroën has discovered the value a market-ready Linux platform can bring to their business, and SUSE Linux Enterprise Desktop is the market's only enterprise-class Linux desktop ready for routine business use. We are pleased to provide a compelling alternative to PSA Peugeot Citroën's current proprietary desktop platform and help the organization reduce costs while advancing its next-generation IT architecture.” - -SUSE Linux Enterprise Desktop delivers ease of use at lower hardware cost and many innovative features including three-dimensional desktop graphics, integrated search and a fully compatible office productivity suite through the Novell® edition of OpenOffice.org 2, all at a small fraction of the price of the proprietary operating system and office suite alternatives. SUSE Linux Enterprise Desktop is suited for complete desktop replacements, retail point of service solutions, thin-client deployments and engineering workstations. For more information on SUSE Linux Enterprise offerings from Novell, visit http://www.novell.com/linux. -About Novell - -Novell, Inc. (Nasdaq: NOVL) delivers infrastructure software for the Open Enterprise. We are a leader in enterprise-wide operating systems based on Linux and open source and the security and systems management services required to operate mixed IT environments. We help our customers minimize cost, complexity and risk, allowing them to focus on innovation and growth. For more information, visit http://www.novell.com . - -Novell and SUSE are registered trademarks of Novell, Inc. in the United States and other countries. *Linux is a registered trademark of Linus Torvalds. All other third-party trademarks are the property of their respective owners. -Press Contact - -Ian Bruce -Novell, Inc. -Telephone: +1 781 464-8034 -Email: ibruce@novell.com"; - UI::OpenDialog ( - `VBox ( - `RadioButtonGroup (`id(`rb), - `VBox( - `Left (`RadioButton(`id(`edit_enabled), `opt(`notify), "&Enabled", true)), - `Left (`RadioButton(`id(`edit_disabled), `opt(`notify), "&Disabled")) - ) - ), - `ReplacePoint (`id(`replace_edit), - `MultiLineEdit(`id(`description), `opt(nil),"Archive &Description", description) - ), - `PushButton(`id (`close), "&Close") - ) - ); - - any ret = nil; - while (true) - { - ret = UI::UserInput(); - if (ret == `close || ret == `cancel) - break; - any edit_status = nil; - if ((boolean) UI::QueryWidget(`id(`edit_enabled), `Value)) - edit_status = nil; - else if ((boolean) UI::QueryWidget(`id(`edit_disabled), `Value)) - edit_status = `disabled; - UI::ReplaceWidget (`replace_edit, - `MultiLineEdit(`id(`description), `opt(edit_status), - "Archive &Description", description)); - } - - UI::CloseDialog(); -} - diff --git a/tests/MultiProgressMeterHuge.ycp b/tests/MultiProgressMeterHuge.ycp deleted file mode 100644 index 01ec1e90..00000000 --- a/tests/MultiProgressMeterHuge.ycp +++ /dev/null @@ -1,39 +0,0 @@ -// Simple example for MultiProgressMeter -{ - if ( ! UI::HasSpecialWidget(`HMultiProgressMeter ) ) - { - UI::OpenDialog( - `VBox( - `Label("Error: This UI doesn't support the MultiProgressMeter widget!"), - `PushButton(`opt(`default), "&OK") - ) - ); - UI::UserInput(); - UI::CloseDialog(); - - return; - } - - - UI::OpenDialog( - `VBox( - `HMultiProgressMeter(`id(`prog), [ 10000, 200, 500, 20, 100 ] ), - `PushButton(`opt(`default), "&Ok" ) - ) - ); - - UI::ChangeWidget(`prog, `Values, [ 1000, 200, 500, 20, 100 ] ); UI::UserInput(); - UI::ChangeWidget(`prog, `Values, [ 800, 200, 500, 20, 100 ] ); UI::UserInput(); - UI::ChangeWidget(`prog, `Values, [ 500, 200, 500, 20, 100 ] ); UI::UserInput(); - UI::ChangeWidget(`prog, `Values, [ 200, 200, 500, 20, 100 ] ); UI::UserInput(); - UI::ChangeWidget(`prog, `Values, [ 0, 200, 500, 20, 100 ] ); UI::UserInput(); - - UI::ChangeWidget(`prog, `Values, [ 0, 100, 500, 20, 100 ] ); UI::UserInput(); - UI::ChangeWidget(`prog, `Values, [ 0, 20, 500, 20, 100 ] ); UI::UserInput(); - UI::ChangeWidget(`prog, `Values, [ 0, 0, 500, 20, 100 ] ); UI::UserInput(); - - UI::ChangeWidget(`prog, `Values, [ 0, 0, 400, 20, 100 ] ); UI::UserInput(); - UI::ChangeWidget(`prog, `Values, [ 0, 0, 300, 20, 100 ] ); UI::UserInput(); - UI::ChangeWidget(`prog, `Values, [ 0, 0, 200, 20, 100 ] ); UI::UserInput(); - UI::ChangeWidget(`prog, `Values, [ 0, 0, 100, 20, 100 ] ); UI::UserInput(); -} diff --git a/tests/MultiProgressMeterVer.ycp b/tests/MultiProgressMeterVer.ycp deleted file mode 100644 index ca624e95..00000000 --- a/tests/MultiProgressMeterVer.ycp +++ /dev/null @@ -1,39 +0,0 @@ -// Simple example for MultiProgressMeter -{ - if ( ! UI::HasSpecialWidget(`HMultiProgressMeter ) ) - { - UI::OpenDialog( - `VBox( - `Label("Error: This UI doesn't support the MultiProgressMeter widget!"), - `PushButton(`opt(`default), "&OK") - ) - ); - UI::UserInput(); - UI::CloseDialog(); - - return; - } - - - UI::OpenDialog( - `VBox( - `VMultiProgressMeter(`id(`prog), [ 100, 200, 500, 20, 100 ] ), - `PushButton(`opt(`default), "&Ok" ) - ) - ); - - UI::ChangeWidget(`prog, `Values, [ 1000, 200, 500, 20, 100 ] ); UI::UserInput(); - UI::ChangeWidget(`prog, `Values, [ 800, 200, 500, 20, 100 ] ); UI::UserInput(); - UI::ChangeWidget(`prog, `Values, [ 500, 200, 500, 20, 100 ] ); UI::UserInput(); - UI::ChangeWidget(`prog, `Values, [ 200, 200, 500, 20, 100 ] ); UI::UserInput(); - UI::ChangeWidget(`prog, `Values, [ 0, 200, 500, 20, 100 ] ); UI::UserInput(); - - UI::ChangeWidget(`prog, `Values, [ 0, 100, 500, 20, 100 ] ); UI::UserInput(); - UI::ChangeWidget(`prog, `Values, [ 0, 20, 500, 20, 100 ] ); UI::UserInput(); - UI::ChangeWidget(`prog, `Values, [ 0, 0, 500, 20, 100 ] ); UI::UserInput(); - - UI::ChangeWidget(`prog, `Values, [ 0, 0, 400, 20, 100 ] ); UI::UserInput(); - UI::ChangeWidget(`prog, `Values, [ 0, 0, 300, 20, 100 ] ); UI::UserInput(); - UI::ChangeWidget(`prog, `Values, [ 0, 0, 200, 20, 100 ] ); UI::UserInput(); - UI::ChangeWidget(`prog, `Values, [ 0, 0, 100, 20, 100 ] ); UI::UserInput(); -} diff --git a/tests/MultiSelectionBox.ycp b/tests/MultiSelectionBox.ycp deleted file mode 100644 index 08a3b454..00000000 --- a/tests/MultiSelectionBox.ycp +++ /dev/null @@ -1,16 +0,0 @@ -// MultiSelectionBox -- test notify flag -{ -list items = - [ "Spaghetti", "Steak Sandwich", "Chili", "Salami Baguette" ]; - -UI::OpenDialog ( - `MinSize (30, 10, - `MultiSelectionBox (`id(`list), `opt (`notify), - "Plates", items) - ) - ); - -UI::UserInput(); -UI::CloseDialog(); -} - diff --git a/tests/PollInput.ycp b/tests/PollInput.ycp deleted file mode 100644 index 6f095535..00000000 --- a/tests/PollInput.ycp +++ /dev/null @@ -1,26 +0,0 @@ -// Event pooling -- test bug that causes package manager post-script -// `cancel events to be ignored. -{ - UI::OpenDialog ( - `VBox( - `Label ("Blocked - UserInput()"), - `PushButton (`id (`button), "Ok") - ) - ); - UI::UserInput(); - UI::CloseDialog(); - - UI::OpenDialog ( - `VBox( - `Label ("Un-blocked - PollInput()"), - `PushButton (`id (`button), "Ok") - ) - ); - any event = nil; - repeat { - sleep (1000); - event = UI::PollInput(); - } until (event != nil); - UI::CloseDialog(); -} - diff --git a/tests/ProgressBar.ycp b/tests/ProgressBar.ycp deleted file mode 100644 index 338f0110..00000000 --- a/tests/ProgressBar.ycp +++ /dev/null @@ -1,45 +0,0 @@ -// Auto ProgressBar example -{ - integer max_progress = 10; - integer progress = 0; - - UI::OpenDialog( - `VBox( - `MinSize (60, 0, `ProgressBar (`id (`pr), "Progress bar", max_progress, progress)), - `Right (`PushButton (`id (`close), "&Close")) - ) - ); - - symbol strategy = `same; - integer timeout = 0; - - while (progress < max_progress) { - if (strategy == `same) - timeout = 2000; - else if (strategy == `incremental) { - if (timeout == 0) - timeout = 3000; - else - timeout = timeout - 250; - } - else if (strategy == `decremental) { - if (timeout == 0) - timeout = 500; - else - timeout = timeout + 250; - } -/* else if (strategy == `random) - timeout = 2000;*/ - sleep (timeout); - - symbol event = (symbol) UI::PollInput(); - if (event == `close || event == `cancel) - break; - - progress = progress + 1; - UI::ChangeWidget(`id(`pr), `Value, progress); - } - - UI::CloseDialog(); -} - diff --git a/tests/RichText1.ycp b/tests/RichText1.ycp deleted file mode 100644 index a5843510..00000000 --- a/tests/RichText1.ycp +++ /dev/null @@ -1,26 +0,0 @@ -// RichText test - -{ - UI::OpenDialog (`opt (`defaultsize), - `VBox ( - `RichText (`id (`rtext), ""), - `MultiLineEdit (`id (`source), `opt(`notify), "Source code", ""), - `PushButton (`id (`close), `opt(`default), "&Close") - ) - ); - - any ret = nil; - repeat - { - ret = UI::UserInput(); - - if (ret == `source) - { - UI::ChangeWidget (`id (`rtext), `Value, - (string) UI::QueryWidget(`id(`source), `Value)); - } - - } until (ret == `close || ret == `cancel); - - UI::CloseDialog(); -} diff --git a/tests/RichText2.ycp b/tests/RichText2.ycp deleted file mode 100644 index 2330a99b..00000000 --- a/tests/RichText2.ycp +++ /dev/null @@ -1,112 +0,0 @@ -// RichText test (with a list of examples) -{ - list texts = [ - // simple - "

Hello world!

", - "

Operating Systems

Linux

Suse", - - // the br & hr tags - "Drinking ice tea

is good for you.", - - // Broken end element - "Broken end element elided", - - // the li tags - "Things to do
  • foo
  • baa
  • baz.", - - // unclosed tags - "No outer tag

    Unclosed paragraphs

    several of them unclosed bold", - - // Some more complete text, with an image - "

    Super Man " - + "to the rescue

    Super Man is a very " - + "estimated super hero in Metropolis, but he is looked down by others " - + "like mad scientists and politiceans. ", - - // table (from SlideShow) - "" - + "" - + "" - + "" - + "" - + "
    " - + "" - + "" - + "

    XMMS and JuK - Powerful Jukeboxes

    " - + "

    XMMS is an excellent sound player for Linux. It is easy to use and supports" - + "various formats, including audio CDs. Test the many visualization plug-ins or" - + "download your favorite XMMS skins from the web.

    " - + "

    New in KDE: JuK, which classifies your MP3s and organizes your music" - + "collection.

    " - + "

    Want More?

    " - + "

    The SUSE distribution features a wide range of applications for playing" - + "your CDs and MP3 songs. For example, KsCD is a user-friendly CD player. The" - + "track information for most CDs is available on the Internet. Simply activate" - + "the respective function to display the list.

    " - + "
    " - ]; - - UI::OpenDialog ( - `VBox ( - `ReplacePoint (`id (`replace_text), - `RichText (`id (`text), texts[0]:nil) - ), - `MultiLineEdit (`id (`source), `opt (`notify), "Source code", texts[0]:nil), - `Label (`id(`link), `opt(`hstretch), ""), - `Slider (`id (`slider), `opt(`notify), "Test text case:", 0, size (texts)-1, 0), - `HBox ( - `CheckBox (`id (`scroll), `opt (`notify), "&Auto-scroll", false), - `CheckBox (`id (`plain), `opt (`notify), "&Plain", false), - `HStretch(), - `PushButton (`id (`close), `opt (`default), "&Close") - ) - ) - ); - - any ret = nil; - repeat - { - ret = UI::UserInput(); - - if (ret == `slider) - { - integer cur_text = (integer) UI::QueryWidget (`id(`slider), `Value); - UI::ChangeWidget (`id (`source), `Value, texts[cur_text]:nil); - UI::ChangeWidget (`id (`text), `Value, texts[cur_text]:nil); - UI::ChangeWidget (`id(`link), `Value, ""); - } - - else if (ret == `source) - { - UI::ChangeWidget (`id (`text), `Value, - (string) UI::QueryWidget(`id(`source), `Value)); - UI::ChangeWidget (`id(`link), `Value, ""); - } - - else if (ret == `scroll || ret == `plain) - { - any scroll_opt = nil; - if ((boolean) UI::QueryWidget (`scroll, `Value)) - scroll_opt = `autoScrollDown; - any plain_opt = nil; - if ((boolean) UI::QueryWidget (`plain, `Value)) - plain_opt = `plainText; - UI::ReplaceWidget (`replace_text, - `RichText (`id (`text), `opt (scroll_opt, plain_opt), "")); - - integer cur_text = (integer) UI::QueryWidget (`id(`slider), `Value); - UI::ChangeWidget (`id (`text), `Value, texts[cur_text]:nil); - } - - else - { // RichText doesn't seem to pass its id... - string url = sformat ("%1", ret); - UI::ChangeWidget (`id(`link), `Value, "You pressed: " + url); - } - - } until (ret == `close || ret == `cancel); - - UI::CloseDialog(); -} diff --git a/tests/RussianAccel.ycp b/tests/RussianAccel.ycp deleted file mode 100644 index 49a97560..00000000 --- a/tests/RussianAccel.ycp +++ /dev/null @@ -1,10 +0,0 @@ -{ - UI::OpenDialog( - `VBox( - `Label("Привет!"), - `PushButton("Хоро&шо") - ) - ); - UI::UserInput(); - UI::CloseDialog(); -} diff --git a/tests/SelectionBox.ycp b/tests/SelectionBox.ycp deleted file mode 100755 index 22beb1d8..00000000 --- a/tests/SelectionBox.ycp +++ /dev/null @@ -1,45 +0,0 @@ -// SelectionBox change and lookup test -{ -list itemlist1 = - [ "Spaghetti", "Steak Sandwich", "Chili", "Salami Baguette" ]; - -list itemlist2 = - [ "Mercedes", "AUDI", "VW", "BMW", "Porsche" ]; - -list itemslists = [ itemlist1, itemlist2 ]; - -integer listnum = 0; - -UI::OpenDialog ( - `VBox ( - `MinSize (30, 10, - `SelectionBox (`id(`list), `opt (`immediate), - "Prices", itemlist1) - ), - `TextEntry (`id(`text), "Current item:", ""), - `Right ( - `HBox ( - `PushButton (`id (`next), "Change &List Contents"), - `PushButton (`id (`cancel), "&Close") - ) - ) - ) - ); - -any ret = nil; -while (ret != `cancel) { - ret = UI::UserInput(); - - if (ret == `next) { - listnum = 1 - listnum; - UI::ChangeWidget (`id(`list), `Items, select (itemslists, listnum, nil)); - } - - if (ret == `list) { - string item = (string) UI::QueryWidget(`id(`list), `CurrentItem); - UI::ChangeWidget (`id (`text), `Value, item); - } -} - -UI::CloseDialog(); -} diff --git a/tests/Sleep.ycp b/tests/Sleep.ycp deleted file mode 100644 index dd711322..00000000 --- a/tests/Sleep.ycp +++ /dev/null @@ -1,33 +0,0 @@ -// wait for event (sleep) -// strangely, the Qt UI doesn't show the buttons being pressed, though -// they obviously are since the event gets caught - -{ - UI::OpenDialog ( - `VBox ( - `Label ("Press the Button"), - `CheckBox ("Check this"), - `PushButton (`id (`one), "One"), - `PushButton (`id (`two), "Two") - ) - ); - sleep (4000); - - any widget = nil; - widget = UI::PollInput(); - UI::CloseDialog(); - - string text = "none"; - if (widget == `one) - text = "One"; - if (widget == `two) - text = "Two"; - - UI::OpenDialog ( - `VBox ( - `Label ("You pressed " + text) - ) - ); - sleep (4000); -} - diff --git a/tests/Slider-Event.ycp b/tests/Slider-Event.ycp deleted file mode 100644 index 9c06b56b..00000000 --- a/tests/Slider-Event.ycp +++ /dev/null @@ -1,36 +0,0 @@ -{ - UI::OpenDialog( - `VBox( - `Slider(`id(`slider1), `opt(`notify), "", 0, 1000, 50), - `Slider(`id(`slider2), `opt(`notify), "", 0, 1000, 500) - ) - ); - - symbol widget = nil; - - do { - - widget = (symbol) UI::UserInput(); - - switch (widget) - { - case `slider1: - { - integer i = (integer) UI::QueryWidget(`id(`slider1), `Value); - UI::ChangeWidget(`id(`slider2), `Value, i+1); - } - break; - - case `slider2: - { - integer i = (integer) UI::QueryWidget(`id(`slider2), `Value); - UI::ChangeWidget(`id(`slider1), `Value, i+1); - } - break; - } - - } while (widget != `cancel); - - UI::CloseDialog(); -} - diff --git a/tests/StockButtons.ycp b/tests/StockButtons.ycp deleted file mode 100644 index 86412b58..00000000 --- a/tests/StockButtons.ycp +++ /dev/null @@ -1,20 +0,0 @@ -{ - UI::OpenDialog( - `VBox( - `PushButton ("&Add"), - `PushButton ("&Edit"), - `PushButton ("&Resize"), - `PushButton ("&Remove"), - `HBox( - `PushButton ("&Add"), - `PushButton ("&Edit"), - `PushButton ("&Resize"), - `PushButton ("&Remove") - ) - ) - ); - - UI::UserInput(); - UI::CloseDialog(); -} - diff --git a/tests/StockIcons.ycp b/tests/StockIcons.ycp deleted file mode 100644 index abf7cee8..00000000 --- a/tests/StockIcons.ycp +++ /dev/null @@ -1,55 +0,0 @@ -// Stock Icons test - -{ - list stock_icons = [ - "Ok", - "Cancel", - "Abort", - "Apply", - "About", - "Connect", - "Disconnect", - "Edit", - "Open", - "Close", - "New", - "Quit", - "Print", - "Save", - "Save As", - "Yes", - "No", - - ]; - integer i = 0; - - UI::OpenDialog ( - `ReplacePoint (`id (`rp), - `PushButton (`opt (`icon (stock_icons[i]:nil)), stock_icons[i]:"") - ) - ); - - any ret = nil; - while (true) - { - ret = UI::TimeoutUserInput (1000); - - if (ret == `timeout) - { - i = i + 1; - if (i == size (stock_icons)) - break; - else - UI::ReplaceWidget (`rp, - `PushButton (`opt (`icon (stock_icons[i]:nil)), stock_icons[i]:"") - ); - UI::RecalcLayout(); - } - - else - break; - - }; - - UI::CloseDialog(); -} diff --git a/tests/Table-Edit.ycp b/tests/Table-Edit.ycp deleted file mode 100644 index 85b2b8b7..00000000 --- a/tests/Table-Edit.ycp +++ /dev/null @@ -1,60 +0,0 @@ -// bug 459313 - -{ - UI::OpenDialog( - `VBox( - `MinSize( 25, 8, - `Table(`id(`table), `opt(`keepSorting), - `header("Mark", "Name"), - [ - `item(`id(1), "", "Salami Baguette"), - `item(`id(2), "", "Chili"), - `item(`id(3), "", "Steak Sandwich"), - `item(`id(4), "", "Spaghetti") - ] - ) - ), - `HBox ( - `PushButton(`id(`select), "&Select / de-select"), - `PushButton(`id(`lookup), "&Lookup"), - `PushButton(`id(`cancel), "&Close") - ) - ) - ); - - any ret = nil; - repeat { - ret = UI::UserInput(); - - if (ret == `select) { - integer current_item_id = (integer) UI::QueryWidget(`id(`table), `CurrentItem); - boolean selected = UI::QueryWidget(`table, `Cell( current_item_id, 0 ) ) == "X"; - string write = ""; - if (!selected) - write = "X"; - UI::ChangeWidget(`id(`table), `Cell( current_item_id, 0 ), write ); - } - if (ret == `lookup) { - any id = UI::QueryWidget(`id(`table), `CurrentItem); - if (is(id, integer)) { - string text = sformat ( - "Line: %1", UI::QueryWidget(`id(`table), `Item(id))); - UI::OpenDialog ( - `MarginBox (1, 0.2, - `VBox ( - `Left (`Label ("Current Table Item")), - `Label(`opt(`outputField), text), - `PushButton("&OK") - ) - ) - ); - UI::UserInput(); - UI::CloseDialog(); - } - } - - } until (ret == `cancel); - - UI::CloseDialog(); -} - diff --git a/tests/Table3-4.ycp b/tests/Table3-4.ycp deleted file mode 100644 index bb850ff8..00000000 --- a/tests/Table3-4.ycp +++ /dev/null @@ -1,68 +0,0 @@ -// merge of Table3 and Table4 tests -{ -list itemlist1 = - [ `item(`id(3), "Spaghetti", 8), - `item(`id(4), "Steak Sandwich", 12), - `item(`id(1), "Chili", 6), - `item(`id(2), "Salami Baguette", nil) - ]; - -list itemlist2 = - [ `item(`id(0), "Mercedes", 60000), - `item(`id(1), "AUDI", 50000), - `item(`id(2), "VW", 40000), - `item(`id(3), "BMW", 60000), - `item(`id(3), "Porsche", 80000) - ]; - -list itemslists = [ itemlist1, itemlist2 ]; - -integer listnum = 0; - -UI::OpenDialog ( - `VBox ( - `Heading ("Prices"), - `MinSize (30, 10, - `Table (`id(`table), `header("Name", `Right ("price")), itemlist1) - ), - `Right ( - `HBox ( - `PushButton (`id (`lookup), "&Lookup"), - `PushButton (`id (`next), "Change &Table Contents"), - `PushButton (`id (`cancel), "&Close") - ) - ) - ) - ); - -any ret = nil; -while (ret != `cancel) { - ret = UI::UserInput(); - - if (ret == `next) { - listnum = 1 - listnum; - UI::ChangeWidget(`id(`table), `Items, select(itemslists, listnum, nil)); - } - - if (ret == `lookup) { - any id = UI::QueryWidget(`id(`table), `CurrentItem); - if (is(id, integer)) { - string text = sformat ( - "Line: %1", UI::QueryWidget(`id(`table), `Item(id))); - UI::OpenDialog ( - `MarginBox (1, 0.2, - `VBox ( - `Left (`Label ("Current Table Item")), - `Label(`opt(`outputField), text), - `PushButton("&OK") - ) - ) - ); - UI::UserInput(); - UI::CloseDialog(); - } - } -} - -UI::CloseDialog(); -} diff --git a/tests/Tree-rebuild.ycp b/tests/Tree-rebuild.ycp deleted file mode 100644 index 615e4784..00000000 --- a/tests/Tree-rebuild.ycp +++ /dev/null @@ -1,55 +0,0 @@ -{ - // Test Case for Bug 668602 - // Crashing in printer tool: when rebuilding tree after item is selected. - // See if Label is properly set to the item selected. - - UI::OpenDialog(`VBox ( - `Tree(`id(`tree), - `opt(`notify), - "Select destination directory:", - [ - `item( "/" , true, - [ - `item( "etc", - [ - `item("opt"), - `item("SuSEconfig"), - `item("X11") - ] - ) - ] - ) - ] ), - `PushButton (`id (`sel), "Select Value 1"), - `Label (`id (`label), "Selected: (none)") - ) - ); - - any id = nil; - - repeat - { - id = UI::UserInput(); - - if (id == `sel) - UI::ChangeWidget( `id( `tree ), `CurrentItem, "Value 1" ); - - else { - any item = UI::QueryWidget (`tree, `CurrentItem); - - UI::ChangeWidget( `id( `label ), `Value, sformat( "%1", item ) ); - - - UI::ChangeWidget (`tree, `Items, ( [ - `item( "Option 1:" , false, - [ - `item( "Value 1" , true ), - `item( "Value 2" , true ) - ] ) - ])); - } - - } until ( id == `cancel ); - UI::CloseDialog(); -} - diff --git a/tests/Tree3.ycp b/tests/Tree3.ycp deleted file mode 100644 index a0c9061b..00000000 --- a/tests/Tree3.ycp +++ /dev/null @@ -1,123 +0,0 @@ -{ - // Build a dialog with a tree for directory selection, three - // buttons with common values and a label that directly echoes any - // selected directory. - // - // The tree in this example uses the `notify option that makes - // UI::UserInput() return immediately as soon as the user selects a - // tree item rather than the default behaviour which waits for the - // user to activate a button. - - UI::OpenDialog( - `MinWidth( 50, - `VBox( - `Tree(`id(`dest_dir), - `opt(`notify), - "Select destination directory:", - [ - `item( "/" , true, - [ - `item( "etc", - [ - `item("opt"), - `item("SuSEconfig"), - `item("X11") - ] - ), - `item( "usr", false, - [ - "bin", - "lib", - `item("share", - [ - "man", - "info", - "emacs" - ] - ), - `item( `id(`usr_local), "local" ), - `item("X11R6", - [ - "bin", - "lib", - "share", - "man", - "etc" - ] - ) - ] - ), - `item( `id(`opt), "opt", true, - [ - "kde", - "netscape", - "Office51" - ] - ), - `item("home"), - "work", - `item( "") - ] - ) - ] ), - `HBox( - `PushButton(`id(`sel_opt), `opt(`hstretch), "/&opt" ), - `PushButton(`id(`sel_usr), `opt(`hstretch), "/&usr" ), - `PushButton(`id(`sel_usr_local), `opt(`hstretch), "/usr/&local" ) - ), - `HBox( - `HWeight( 2, `Label("Current Item:") ), - `HWeight( 5, `Label(`id(`echoItem), `opt(`outputField, `hstretch), "") ) - ), - `HBox( - `HWeight( 2, `Label("Current Branch:") ), - `HWeight( 5, `Label(`id(`echoBranch), `opt(`outputField, `hstretch), "") ) - ), - `HBox( - `HWeight( 2, `Label("Current Path:") ), - `HWeight( 5, `Label(`id(`echoPath), `opt(`outputField, `hstretch), "") ) - ), - `PushButton(`id(`ok), `opt(`default, `icon ("ok")), "&OK") - ) - ) - ); - - any id = nil; - - repeat - { - id = UI::UserInput(); - - if ( id == `sel_usr) UI::ChangeWidget( `id( `dest_dir ), `CurrentItem, "usr" ); - else if ( id == `sel_usr_local) UI::ChangeWidget( `id( `dest_dir ), `CurrentItem, `usr_local ); - else if ( id == `sel_opt) UI::ChangeWidget( `id( `dest_dir ), `CurrentItem, `opt ); - else if ( id == `dest_dir) - { - any current_dir = UI::QueryWidget(`dest_dir, `CurrentItem ); - - if ( current_dir != nil ) - UI::ChangeWidget( `id( `echoItem ), `Value, sformat( "%1", current_dir ) ); - - list current_branch = (list) UI::QueryWidget(`dest_dir, `CurrentBranch ); - - if ( current_branch != nil ) - { - UI::ChangeWidget(`echoBranch, `Value, sformat( "%1", current_branch) ); - - string current_path = mergestring( current_branch, "/" ); - if ( size( current_path ) > 2 ) - // Remove duplicate "/" at start - current_path = substring( current_path, 1, size( current_path )-1 ); - - UI::ChangeWidget(`echoPath, `Value, sformat( "%1", current_path ) ); - } - } - - } until ( id == `ok ); - - - // Close the dialog. - // Remember to read values from the dialog's widgets BEFORE closing it! - UI::CloseDialog(); - -} diff --git a/tests/Wizard-ChangingTitle.ycp b/tests/Wizard-ChangingTitle.ycp deleted file mode 100644 index 5b5da6a5..00000000 --- a/tests/Wizard-ChangingTitle.ycp +++ /dev/null @@ -1,29 +0,0 @@ -// wizard change must replace window title -// bug 385710 - -{ - UI::OpenDialog(`opt(`defaultsize ), - `Wizard(`opt(`stepsEnabled), - `back, "&Back", - `abort, "Ab&ort", - `next, "&Next" ) ); - - UI::WizardCommand(`SetDialogIcon( "/usr/share/YaST2/theme/current/icons/22x22/apps/YaST.png" ) ); - UI::WizardCommand(`SetDialogHeading( "Welcome to the YaST2 installation" ) ); - - UI::UserInput(); - - UI::OpenDialog(`opt(`defaultsize ), - `Wizard(`opt(`stepsEnabled), - `back, "&Back", - `abort, "Ab&ort", - `next, "&Next" ) ); - - UI::WizardCommand(`SetDialogIcon( "/usr/share/YaST2/theme/current/icons/22x22/apps/YaST.png" ) ); - UI::WizardCommand(`SetDialogHeading( "Goodbye installation!!!" ) ); - - UI::UserInput(); - UI::CloseDialog(); - UI::UserInput(); -} - diff --git a/tests/Wizard.ycp b/tests/Wizard.ycp deleted file mode 100644 index 9aa6f40d..00000000 --- a/tests/Wizard.ycp +++ /dev/null @@ -1,16 +0,0 @@ -// Problematic sizing example... -{ - term contents = `VBox ( - `MinSize ( - 80, 23, // tweak me ! :-) - `ReplacePoint (`id (`base_license_rp), `Empty()) - ), - `PushButton (`id (`show_fulscreen_license), "&Show License...") - ); - - UI::OpenDialog(`opt(`defaultsize ), contents); - UI::WaitForEvent(); - - UI::CloseDialog(); - -} diff --git a/tests/Wizard2.ycp b/tests/Wizard2.ycp deleted file mode 100644 index 3b59cb20..00000000 --- a/tests/Wizard2.ycp +++ /dev/null @@ -1,23 +0,0 @@ -// Problematic labeling example... -{ - import "Label"; - import "Wizard"; - - Wizard::CreateDialog(); - Wizard::SetContents ( - "Installed Add-On Products", - `VBox ( - `Left (`Label("select a monitor")) - ), - "

    Here you can foo.

    ", - false, - true - ); - - Wizard::HideBackButton(); - Wizard::SetAbortButton (`abort, Label::CancelButton()); - Wizard::SetNextButton (`next, Label::OKButton()); - - UI::WaitForEvent(); - UI::CloseDialog(); -} diff --git a/tests/WizardList.ycp b/tests/WizardList.ycp deleted file mode 100644 index 6161e7fc..00000000 --- a/tests/WizardList.ycp +++ /dev/null @@ -1,33 +0,0 @@ -{ -UI::OpenDialog( - `Wizard (`opt (`treeEnabled), - `back, "", `cancel, "", `cancel, "&Exit") - ); - -UI::WizardCommand (`AddTreeItem ("", "Computer", "computer")); -UI::WizardCommand (`AddTreeItem ("computer", "Hardware", "hardware")); -UI::WizardCommand (`AddTreeItem ("hardware", "CPU", "cpu@hardware")); -UI::WizardCommand (`AddTreeItem ("cpu@hardware", "MMU", "mmu")); -UI::WizardCommand (`AddTreeItem ("hardware", "RAM", "ram@hardware")); -UI::WizardCommand (`AddTreeItem ("computer", "Software", "software")); - -any ret = nil; -repeat { - ret = UI::UserInput(); - - string selected = (string) UI::QueryWidget (`id(`wizard), `CurrentItem ); - - if (selected == "mmu") { - UI::ReplaceWidget (`id (`contents), - `Label ("MMU setup") - ); - } - if (selected == "ram@hardware") { - UI::ReplaceWidget (`id (`contents), - `Label ("RAM setup") - ); - } -} until (ret == `cancel); - -UI::CloseDialog(); -} diff --git a/tests/image.gif b/tests/image.gif deleted file mode 100644 index df5038109d6c7e93358b67588a65c5936ddf8760..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 54314 zcmeF&`9Dh_(2%mGQHYYp zR!B8MNvcs2KG9T?*13KEh5MKLm;3w$*SQ|&T-W=0zn+)7r<;v!)F5yJ_;D1tQcnB# z@880LL@Z5tPuXX&7+>1dO} ze&rdIqGRT>xVT05RzmzfeE#E$wI>1neeiP^E{g_SKYsL>c=fiBL7V^Bv#=2Jb-Req}v@15%!B*|ftBJQ$x8@#1p0B;TEqiA2-LtSmU82wPU%n`P`?gW=RFPXLd++Xb z;Y*L1)xUS|(7t`26MaTUMTQCA>b!mx`DJ-p_;$<6w+CMqZh!v#`P<5iZ{Mt3obBGd zdw0Kg;J??$X5UME_|UL*pJ416YW4f~Z{NJcVlnXlpZ}*bpe@Gwx&{VN$W&JgQz8Ve z4@UbZTtWdj3K;)yVE_9~0JInoqt!il+#WVs-Y{a2SJhX5)A73G(NaB7jNhC%J=k*P z;c*aFjuy4l44u|@L~_{gD1%N%W(OrzEUrGjXycRL74Q+Jq?VNE5*jezc3dXH?bOIn zYyDWBC1ly-Ukfqx73}!){O^lT<-IQ#XQrU>949Du*Po9Uh3 zb+F1yqkTUVQ0N~cHRW_j-l!YTcRtey!1|VWbA1&~mdZ(Qrimn$l>#jMIE;{l!T^i9 zbwizPN$i8qU2^PSc$Mipw$M81RZmbOH`pm}_E3x@F;|~yL`bsKO(X4ec znnk76&6Fr23RzhXK*Af8#NaqoWFxlnzVGUBaFhRG=PQm#y3v_>$_b5gbS* zv>%h@d!HzQ-WQ<-yRlUOD1iv1n8ak{8YcS4qmNyx)9ZfCW z_q?F&h^6?;C3n7y+SP@q;vWf2fuVi0W3H_j8rslr7v*2w{I+Q#x>o z!9pnMDbVCK6$sx()Dws#MJ3wvuLJtm1Kp*7Y@Fex```Tvq{zYx{~_bDas6lXV_Qs0rnIwc)Q%+a zQU;jFF=xDpd^=tsArT_#QT4dbbyYn4=?)o3=7T>zxZTWTd5=H7n1}FDzXaiGpaXd* zCt5|?^P`Xc08))UJ8hgZ^wj*rHjD{+@j!x_D_1?z^bgkG#^j*17lQLZqpq4mk#WS4 zUC`P%oU@Eo?u=+r`nKt2d8-o3tmE;o54fL59|Qxm(k&eUm8sKIl7heFPN;hgd-*@? zJ}woZ8a+uKU*@n85moRB9RLjGk`Va}gcXgw*#7a}`Qs$W_VnvDWN)Qm9Up>lMYpBn z**}hv(=cc*|5-4!eP;iTKAkrmVI-F7yE$xR2va(3l7wjHgZc>|N=z-Z!UWUdhIOxy z$MRqnC0rny$_CcBpaloa)tn?_qq%qRt)c(}QV%vt-%$CCHo~Bsp+p8?n**5$$<|$v z3f^7GWd=kLK+N$;$Il12n0MjT6bA}qwYGE&ky$O1BY?@++(gJzNm$F(`sGQZqgN9B zhBxKr>v4M^8xjO0(%44E{6n=7B-w5fLk`bFQgq+Jizn}FDCI+O0^u4=1S%#Rhs+at zq%Da^t&we#$qBQ7gNQ8wa6Q7mDono#L>ko)VzzUblB{ypLjaK4Oze}d6d|=7qEOcQ zEL3})W9ah9EX7#}NDb`(6noAg)|e9 z3?af~?oeTH{~Pd~^DwL`9r3!Q2bEk-!VUtA;XN}Y2KsCTi=Qlb4Gm*~j#C5pLG)@e zGTC^K6v%^`CU{prm%a3kw7aDgLc1n;vQNGQT&GG@G zH2`WgfVR5yNYXYkwJs(3o9m~c>M2QDMuSX3g0l9(H9)Bg8@M1_)i(Q>7@0LWY(`a* z3Z{L=-sHfvg*})b$4PKW5opx0)|fzo)I0^qC#M+FCWBvObUW-eq(8lr^SehwGnoUF zMfH-~M0o>^Gg2v;Od~Y72f*3Y&h&Kq5CLUL0h}N_2SfsTntTk*vXvoaj|Zf3M99ru zGh(Uos}yhLKevgk1kh!U1}t;NG*ih#-syW!M}_aw|4)#*ql5MBAcwul=FV`*zTTo@ zY=i~Ghm!Ct!y8mMS0PGjM;%iKdpAZpVf*#4mHm+o`RGPh7?j2p~_*FANh6> zNhLiEMiiPUH@96kzx1DGGe7kzycZ+MeTSY0Fm^U<>D7Cm(eSK+H7T<6oqK@(Z%&_G z;6~+L(FOMO8K`-=ZoLa#qQ5EP%*p`!152t+^6SFE*U2; zKeI2dv4~ngIDK!6KR9!wgQeaS^+xZ9SM-oWeLPtDo8MBULehX$xc- zB2BOK9?2X-?WQB8m06bO=sQTEJ5RBcM)4s6fboMx^f+qau?t;G*&&S6;{Xx_#AjFe zlLh;?>gV|55!;E7S8T4rC`yYP;JwCTe>||dJM%pXZlnZ;;S67)4sm|K=#2dl^fYn@ zMH>K~en2H~5t#YJmQmI=eWv_i{^o>)0I^4kgb?w}B`C9Szbvl+xJ@B(V0te8EPbn3 zec4JsxC0Mm%qjGl&uy|w$ZMzkRL+UR8M3~@T5p3A+~^46{&?lMV37-kN+A#mX|hE) zZImAoo<%FFvpMSfF(8tE*f-u$IV44ii*m-Ha92@tS5UVH5&DFjNE{-X;SmDCEJSbx z|3Z4(?wW)mV|vlHj(itBBqb_oO31us$ubZmhw-!GXil;;kcEkyv+v$WFHKmR-uH?&!Tak_NR$vgG=&OvZ{ z0?0Q2@j}p8v@==axOA*ze_VoxO72|`Aee{15i1%N;IUjJ({^*btG@*iB8xa}FAZhI zX9H+^iiYYgI;v#;o4qJU2YLq#klPybJ2yVpQi`{ zB)c%H3NI(YfTamor7CBm&mWc+0M-m}S>+Pm3t>-%B9A4FxgYr%%CeyY|3a(re5!Fh z=M_|vBdqY}A8A&SqcULiekWxxRneYs3Ka@uR5__$LJMF)0^oAi6xd>YEL)a6Ql{v1q z?WWc=ND2VP4)f9%FXsRt_RRI#q6T9-D1njpHf($FRiETp2%goLMQ<)TTm7kK~noVVx04~cljuG}0N za<3qhxu_pM3J+1-?F3wtS#0@uY_IRQT{hh{G#B(`0HT*Lgb*^pU4=-BhYvgdUO_fc zV6jvPLj-;Kw@_Hn$-BarM?Jcy!Q_16tA%6R1<1pKT@iLV8%E(b7g1Y+0Zm59$BC9> zcbfBO9ZiN%d9IK>y)#6(*HXCm?iC=0fiU3$zjeu#8_f{{*a4&4DdE?>NzkJjFyPMZ zy46#A*NFDb4Mfb!xks1t0e;g0qy!_+uTUV z>S9FVT}MkEQip!C;nA%L@tq4X;Tc&>GJdy+;%8AYIOzT{K()x%>mii$9MI&~!i+boQu(poiiZ4{7me)= zkaLkykG#X}w6NuCwWyI-_VdBW{Hg90!}!{`c|Jg4hrIQnsC9# zvtSwr6-0s#{kfMK-s8!ETTmZu;32|szK;}x&krCIXxY!JxLOS8Z(1+v%yvydTiKt1 zC(~D++PAvg?W!L@2G@jx``maXd#{o3peB;=I`+=@|FLq8g9f0!#96kgb z?B5Z;P`?!VSj zXZi4;6BR({G2A$LL4P;aV9!1MPu9qfHuBG5Ob2IVqBJajnKI)cWmrF-pr zU+s!OWo|sG^dR=ocf`)7Yb6y=dXG<>JZ`WnBfB!H<6AOP6PU`JQPHQ3SnRz2<8S~Z ze2rMzYch1oX5d92?uH!wO}h^QFOs3~VSCn2-<1lCB+Q&{82#=uy)pp`4T`ej5jG-t zL(%4h>+*6cV?ExeXK7Q1c)pk?Q-@XG=x~vSz>K`_j6(Mqx&Ho>g2S;d1H6OJYB|*x zJNC?HPiSet4MZIGd1HACX#a>sU=wj9zBh*scNaoV^r_b6|u=-E_Pqy zH6`<>O>=k#VjB^b&2i0HdU0T%Ku!R21&(BK@0*q{dd+RO=G;8`uhJoFBIHQ4677Qu zS>B5QyOf7ihFPEZ2ahtHJN*Pq#32vSZzlQ*()4T&ynbD^PcRQZQH#!$BEr9%TO@j% zpioiWe;0ZG>bKAV&A%ajR)=qET9f9xw5NjU&!SBi)QO*eG?+Fn!F>fIKmQG+ z`JA`&d8Hsd8Nv&YZJ7C1w+Dx3w#LI{GS^G#B~%vV{{$dXk-G#Rj*{ekI5A2umNTeO zJh!2DAOD;0C%VtjTIE;6%b(YLhZ^opA*B{+;_UO0oppAHL|MEU-27uw8lri5NyVpj z#&kXt2XB438RWn!-u!3NqiIEidVJ?}Bfl~?3yh9_4>>WGV)BB%>y;JpvdypT_&tr@ z=rR?}^M2eK(v6$K(nst!;GHD-4JTnC#C&UW)E(2WeY?J1Q-Umoa23vXgZpsCiSLPT zzS|R$Vj4~}YiBkJ*ZbX2-7>I~hw>A>NV+^qx$z`S>IeQP4x}R`RXq$&uGka5W<`G8 z{qKj-eS|j;-mLZe#@63EWWLdzhCB!F-}SuqbjP<};g=YCfqtBypH-IS%wS6;P%x=* zNfRJ3@mG(+p18iRfBGYe*6EE~QxX2UC4T$Yn+{EHU(3D!72|ZH-R_#Q!O}(|{HL1Z z9uK%N4=R^gLDBy7-J6J`EpK7YTLU z?k4CnBn=cddg~D*H{gl6t|u-XJN8xoU=?_>`lK?A5%#kFt*)dUz>y<;+AV;fNeK-* z#zlQ7I``z@rlo$O>Y~d`bdR(6JUl~A*QP2fwO2B_ zx;GzLeR^Nt#lwl*(i&Y7z}CJq@2{s>O+Vm+H!=F`fbpHz@znUQb&L!6iU>$)4({Nf zwt*Z4GK%0I;OFr@#6q@y2A}ICb90*GEu98yDV5!s{KQ2@jmz|*UjFJ0|EBLz#kUXe zv0^wKRsbYI{{FdDU6^3gBM90_f1fMkz>NZQq%Wq1SW;?|AI~*YWou1UJuu_eQ6r=W zr$?@MOV|ZXSa$=(15*&f zus0n_r>WhA=9VDqr zdE|U3#yA#jDV)(hLmV=?Yx1JO-q_m>zdSDS!(ljaglgm|T)w3Pi z?2Wu9G?ecFuW!J8y_NrvCxHZ5$&J4Bu5cMmoA8egYq1w473Lhu=e1i)UNDi#bNyai$aVbPQz7H}@+-k{C&7Wr$JiXsV!73!K z;i1W^Q&oj=X_yK+#&7GT8k45^k#v!~>QeZdfe&K^<_#T`%zaDz>J&}RTU@Hn1p<+2 zp}qnzq&eO!mQmoxO;RGj%m36VmGkbp3IMRw`-8+@(MH_KBK_?Dz*cJNfnUV(Q7k#} z{Wa}t;P-Ge8Ad>vg#ZW{Luo(>S8-7?3N_csJd_-A%0xH-D`C@Q#5e{#lfPYtP(7;} z+*vrv&smh?+*Jj7abJZnEq(1urBiwE5I!b|GgYI`%YXmr>QTw$8PqU0x8tXXd5{FE zz^N`9svle350{a@ADwGKmNj<^p(qaA#%<&>D1|dUm`>|Ul(RF^cZPb8kE6-ehX}jr zCGTgW`Fc{+lSjCrgAzr=T)o8u>)Wfd##?!Yz9miXt7@-?Tr5nvrUza^8P_>tvqiD% zHk-%n$JjkP&=XjzVOkDXl9?wg)}d6z_Xw8xfugxO^cb~9LU?zbW?Z0yDGy{Sl*{Aahs3c<4wdRr zNT9vWufcZWOtow7nWR7(vq|!LxKc=;y~N>dxR)g9$ne1dQp2^+Z7>7WxK z>YC#07#;~A>`i8`Y|ndZei>c%U3Nm+I&(*to67TR&u^LVE*Lh!xuAk^S^~8WQVAqI zxtvc&E7$c|JbXqrj-bgHTFp6}zwn&h7ANWddbgw|-BY@bFWzeB+5@=pQCIR(a}zYY zVGVq^lq3@+itfQB6L$1ZeXZX{OODavGx3tN3d$|Y&IvAfS@RYua!P1$gUga#Z}`rR zq%CG9;oJLo0UAkknlJ&@-U}Q`uX{}JY6pGMV@slB?57{G_ENYPd?T1 zI8t@3?bYo^X7vL;k=E)x(|i6^i8Y2-Kc)AD4c$cC=&`~fWgmsT_*e6;d+(NZ{Z$ajceEsw4YzA=CE3@XzAKK|DZH&wpa(|1-w9)v>cQmzlsT@9%alc2>59r)OU3hTH z=#s?MZHE*#kqXYbPrnJy;a5vIrTDJ)z^rUmH#$0j3iOK;i}Ah7EYlhyu?KP}%fQfu zsH;X5W10-&c+!K0O)gdMHMg)8Ti;YVSw;az<#q@r___MD?~ajsnD}QonaVM~bNgyT zfoHgk&6(5h4d(X_E>ZI$e49Tn{mW8NGINsWG9DMW|3Q}vQy+{udt&?%ZwjRk!B3owujU_eY$Fg8<-=+kj@%8GA&oXAy zR+1A}dv{DYegIADJ>`(OtB6o{6;1{I=yL@jV&RYT;$Ib^EcJ8+VOx46|^8g zh(>0!Cs}Ol(li>vPR5uIFPK$DH{>N;!%{&h4~o^w<}KNM<99Zx1u}I~Y-M9uVEKl} zUpj%hCLc9MrF_4ZB;$H7OG%gQ6bQ=Hu~j?Rv(Z+}4G_GHEMLJE&H zsDWf^**l-)68Pz6d}6a}1lxiElNWS1dExy>*jtL41G)xYk(sOS*#>gB19#YlB-p2h z)^dBd*qZZQ^3@J}mepYW-Uaqsmbp$K6WRJ8Nnw*wojyo#-=9k|%52@8rKreb{@MI6 zWt*ae#YG1KB-iRb+5!Daxb^oPBvZ#y*C!wCdbl>vPF0Y5S>E4-xwl%}<{*R=>)7H( zx?5g$jZBJ;F15d%y`E7yguF7-rGmz5zyfRF__X?&Mtxmg11I84X|83SyeZ;0!#<=T zH+iVVhHX8p!jjb76t-+ZEa#2+1##N@pQ0d-?UZh6g|wN_27Qn8O6ZvHh>B| zKp$|cGalBbH-CCZjCyxJ>W|%)_cw~h86Xc-VAQo_yHUy-9M+t(KAp7KR|<@E$QFYn^X*fhwr zs$*I4m{uM>SP!6O_Hn6&*LlP0Bdx60v$vf%ko+JlQrGu**^^R3NO{(L!<75etlfy+qGg90iv3daM&`IRrQFOKD&Jxs@C8=e(6B5 z%myrMOuoBN)f=0Y#sTw~rnEl{=qj}?yf8c3#HPqh?mO^sMGy&9r!@{bC;2%|x>G5m zNB%o|^N?SAwDDF?-ubf8eOQ1M2TV}^HA;LRV*K9{5BGKAvEqrlSu@1Z z3TTKJ@{jhk-?3QM0&OI->@&FK^8q)nKD|uZn%|WIdY{1tCA!r6U0t|fWRQuh@M<%p zoYcNZSQ3Ch$qiZ*x1Nc}(`ZZ>^OvH*@(|dNuKWrtB*U;vlB;|DXiMCnjPm06G3PDD zd8$cNUCz|)miI;4CV^F?PGX3ImD8tBKRa%HY?OFTE%(+QzMv2I*P1@s%>Vd;CpAo- z0gZP6%KkMSzdy6~zqMZODD|06@vyh{&qna_lfPaK$r1nC;aWQMZt^EGft8n3W*FDX z6&L1I-A-LlTFxG{aJc)s?cm}#Lv~})S!HtaC9_|z9;h0ptrf5&mhSE5dYK*nF`;@m zPy`<0yN<#!-BEt|3Ssangu0cbpO8s7sK8Ly8kc>sG*TH5fRbC&d69}*Ayj0Za)=+OerM)(KHbjkn4gFK;CG!Pzt4OO-|yE2JoMLt zSK+<<&)SX_>X#sOIkiaV{GET~vf;{G6?yme&N~T+y?j7PkO>V%z{ytzWjk zBv?|vKqH;gDO-BjPKlqXWjPZh#ngyHtUCwUhe$uj zu{H=6svGohD-h!6irIVtV_03&jdRE7Pof@PqEfwN!-v9XthCnW7tX3bD-GG8WB@0V zFBJx_QwX4oa7Dquz@o0hi!E&0jd=RgS z@qm`KlaF@d_(6laZw2~mrPuAC95hR&vQN$I<35~D9Ydo4uX*!pNvGLS?lAc|`T#64 z8|+t>5|-G!EBg4PALZ;WE&DbW=5PyT_=iu%UKtLhu=^`jfAyJlkiMfd$N8=vn_{DS zP}r_zKvp}K#9xEs4j|MJ>XkX~I?bAUC%U)V-&FLmjAHtvubA&u0VKI(Jchu8B~X$6 z1KOD44Z+_kKk{S(s}O|DzB%J{_+iXIzYhmNOOI}x4Hs!{a|wO_xzoUhD3nRjWp6GO zQsj^kmW5FYR0d02$B^FOFb%J!HYl$creNT&ABjh<<|sAtiOa9Z1CIlRQP?nkJ~1~69xWnc1F4YeHX7>kuTzRn%EmSx z9gRn3OYQ`bjJa0SU6_l5j%){e5T1TMYF3B+5iAd2UZ-0>IEZh+(LV zFyI7_YU*DqTSM2c$~GdNa_AapL|Q2Zc@#xW9MXaog_hE12KOm^pw_HUbSlLfdkr9p#(NaD*IyH-0Qq_ni}3fQHrRMI#M3DDEp+7Eis>7UyOxRBXHB~TwQR- z607KQapdgsmQFY+7L|gd0SO7xp&m?}h?b}BB7BGhoUb{FnAWWz@P1v907TGE5Or~D zIm!9toi|s%Y8!6sj)g6fB9+9q2TXHX4qol((R+pm^yz05S=`r~=riKS-@}<;FaTF* zow*APT=hhW_)4PDr+YIYH5-z@`#azBs``Cd1xlxkX+3DiwVO5HjN<S*Exf*7xU)NdwUlE^P-ed*NJ1I!bt(GE`5rZ@B`90W^jjf z__3(xEhAt^J_zLF?^)+tWtu+RyKFokAEW+1-4nE@G<-6_7d|K|E+|&e|+UViYQ85USp^6gKb8tzHM6Qo0g}6&z>Ga zw7kEItdP1|cqw=FXyFN2_4`?GzPb0(DsH3-K?m$Qz(E!&h%L}tgwr*Az=AJ5C)2p-;z10U~By_#{@hzirEqpqJk zsI_2)PeFdSJ!?~^UNm0SQ@I_l)9OuPr~nI+s& zzT$!c1J3g{7Wf#qG^gV2J z^G@t;zz1OZjl;bNdHZc}ugu}bVp2g`UEZ&_J@2-#vdUBR0F-o!yCQ(F6R@P?GrsLc z?Bf;|hh%M{Bcyn!6X;`NRQkV7j0g`#B>fnY21IOJzW_VOoY^EMa6g^ zZe4lsi>}WX5i>$t*aeUCVb|ipOva%w&haoDsK-S;&xb|OGSXI&sSK2EdeQD@C?8&t zv7q$v{LvG&LA~QZB%v58Cu2DoBpSkorkg?2U8vd{M@Nx3(82apfM%mBK&H@2w%~(W z=78n3QpdWiQ%bO%BzxtR{pTl=XHoEH@xbyAMoj?>aXZxjAc3jyxp@wL67I$?8ksER z*c3#%9i@nAaARudKV+_d{{c90_tPK61kbVv1`I25LE>OqLa0K4l*&Mc2~SP#M(Gpb zDpn^gJqseA|BrS2cn0LP2Cddbyt@U%Qc=)3yvxIr(=uD7yIW*2N7T@!@=~ zDzuF6oi*QEL7XC zzu4hR1R^25DnJ=N8b|l#n&i3p;i%*Pe1NhhRm!C0PO zgFe@m3RA1S>}yzy5~6$o;L`bXn-@`tV9$qz>fa3N*uM%LsEFgO=37Y-g~uvf?m)}W zVGBCQC?Tj!1T@kWG#{*v1QnciiJ?K-ZP4SXCL9mG zu3Q6Ds|dV+l8M^hbW|`2QZ=l5y?C8MaNF2#ZV6EA8K5s6P~olTo(^rnh!7&sA7isN z1+%pTt%ZK{Btk zvDoq*9z=sv_>e_tt01)HJtjIKu(>@xWZ@gqgo@JSwkdOOZV2qCa)DH+?N5q8LmZUY zSXn6n+s=R_QkXI?Q3jka0^x=|^>#=bN=~IbjnKRx5xw*s`eJ9@@9Hp}dgE9)u*)6{ z5kl*zh+}lio(qFfJ4^f9bFAbs9$9+n0iM@@WFB-U5w6r$)bh*c$fG;kjgaF^IzcP)y+SZ@2Z#q%UYcme|oE9d#mZLjR~XOT;zFd(aPXID_!D^XaUSh)G_;C4PLah*Z#WAMV`|{w`w&i zjG-MWOuwAb%MaM3a~k%2Hdf+0Kp7Vr6L`;i0)}V=F+xZcxLaiff)T#< z^dw6fT$Kw8VgP-Idiu`a+jFB1HCWmP?^MDe_FPvINPpQ$@T30 zR00wq=vwDDfw+t4bw9vBybJ5Jn|4yAgXW^Uig`im6A=!CZ4T5yN1Q!&-A0M&Jr-CH zXaEy=J!g$bHsM39A7Z!D;TIgh&9vB@jb{!3nY*Xq2DI%-m#7lk`qo=7md2oeardc_ z%?Lhd2B!p3laxMG>`beU8-gr3%_YXQM6dM|efN@%^V`O5=e7|~U8?UYG9eEcN_+6x zeCz5gs4^2Z@RV5BD-*e<%< z?$(LS9`P6$NwyESyaVYA;Ge1*PRIsrZF~^Te^B2w+%z(r7QyEw`N$d1F1b3m6?I4E?5Lss|By|EZ=rBDxia3G%E>;MH9oKshh1&C}H{A|tB6_g@@vw^h zi_?MQzs|qty!S$m>USycOiD<3*hI8A&#%wt+KtfZ?S|msYuHf5lTk;=R|t0+dxtmgVUM_!U9;&Y zVRSVg?NO8-17=BwZ>F+0oCdULJLbfWFb{5Bcqw2>OVWAxm~K4xrVFwra^+qgabyH3 zNt|%u!zj4L1EwESd_Vp>5696zIul^~!pCgGqfbO%M3Mlg{e9)`?NA5aT*4b*=L-ZD_qN8V+Oc%eS$alN02*)# z36+TVsg8-VL0Tes4)^)HQh4Fd=U86^wp(bS-nU=9ugPJdQ>taB@XBiE!gr_7j*QPI zuYD#=ea_oEN%5VP#KFm8&cT3Fh#Ss?gqd49Iq-K*%kuY!m9kaEfHM zg6)RWWq$bb;3|3)knX9Dv23`*ZrZhoMjFN*tDK1eIF5vZ%PM=4IK+ z|6b=XRvmAE4zE|0wSHW<|1)*}kJFkD@jO7?>-6=GYf`{HDN*EW<*$CcuX!>;j{Q=m z0Q_1^*hCB~Hj60Fg=B6FX+Hu_?j2V;`o&G=#}*!Z3mw|P`7?6#4?S|lLj7TJ=k*Oo zKN-^^DTIQ&PLz)L?=Qiwc2H){eF>K?yU7gdRe%a03!;8 z;X>iylq$YGMp5bJ+cX{@ud^~^!Nb0ul`cNq8C>u@>r)Owvqqobp*EjQ= zixhw+U=83K0T_JyG~pr{hBTI1T?y&nz2n$frYp20w7eTY+DjMCzB(5>blO0rhR1QM z-QIsp(d>-`f-k?-^~44#9U3aXR;4=ZD%Z;OJUrB8w?Y~W*LJ-=JOUiNFjAPDdhi+E z@=`)OhJayg%J|elAA0lQ_o~;YY4hz6rN=QzWwmZ^i#NLi>C7m4BiB%v=h)1R-U2UK zNA&m4dP|&8_*A}ZC%Jic=<2524U6`}t@QlCq1H0IOyw*WVJ+@cL%-=Dbu*O*mT zdK|7R;^rN$iz1h*W^-tT*BWz)qP13R)v}zyb`=TOtmA-M;C-FB;OWuF0a_e6dap z<(>W0PnA}SRZDTpRYFrqcIJf#v^S`7ndEJsC66_ID9t5f-NB%VJHWC?NWmFgsmgaV zYcgfXl;BdfDRmFdSZsTt%R${%rEU&Ex}Fi{$H|lzfetL%{-DIhl)fSfNk>abT?ZTO zAW6uBD;=#@A)BXBmq2|@HSg$soT~s=eEHgCW3g?5J+Ub)M?PgCS1B9US4W}1Nz&o_ z2ZDB_WD(wBj2#k)Q2I;9Ms&2|6y*uc-uHP=)`?gKYrp*RkJwM!NIFOs*3C=Of<-)U zcffpClD|@BM{kj#gJ7wxXrq7@03BaiORy`}Ib(cAKVgGj*_Gz{6AFU~;+Jt((>-YM zN)WFXt(jS_;HzVd=1VI$OwP2uu-JKJYi0w@c4d`xZf0g$JvAqrd>b)1`Ti~FXj0(Af0 zr$JS2qB2Dey~tR@YH;^4Yb&z9pX*Z8f?@8#rYhY3qb=m>=$;u@e#8-p+Ol2Q@^s!Q4! zK>hW~E(*!AEXq~F<>hjMkfb|HWX-%M{cK<~(AyHEC?XBi{uHLgiV3#9iYYZ1xM_O} zFE9Dl8>L~uO7%HU#xH>@orZU^UZFyL*l1W0zkBtIuuy59@(V^~VPPV74kkYbJPhe8SZ`)_lou!&k1RD?en941$z3(pORW zL&wT}*xnq(h5QQ#)|9YowYRij!!V{iPf3vA+eC}&PUIw3u$v*1F_ zpXIkr=tHb)v&z&#fb25Ifs)aE(!z&^=fvw*aT2!0$e7ad)|fbivcB?FRVrM4TIT2j zmkZ`64zcUGyU&l*JU6|<1wog90^@H?)G3c!!B#Vv@}>`aOL%QkowLxZ>8B-`qCAU2 zhOys)-LA(ChV?DAFRj1>fetP#!ELjQIl2#@$g_J8E00y~08GXv8A!<)Sj41$`ZFTc z)29K{;yEkm6P41!#w+~D@d`~0VySgX@!GhaTr|;Ni^D82uwqIDa+$3zr`S@og{|^o zNaNTv|154S;EO{j05q&8RnIl@)|1kHhFJSpo7tl@iQQXJ_gCXTZiK zqYa+Jx%wn#{K1Z1z)i$BJ6FQq?VR8&WzUiokvCMvfIGZ5-FGtn;t3OTsQYLYag&DSIY0;`Oewz0pcpR4s zI6*2j!CB$St(Ws|w;c=sO4{{D)lL8jYM59~yf?^1Npepb_yAIzbvm+cOJ0pHz8B0+ zRD62YkVyD~hLe!S;Zly{)g%p*83kx^-1qU zD$?+iS*xw8fgJX}M^7;Yap||*8M%h#VN(+QLmfAZmy$EE{r}#^ zGw1m^zQ_FrX$fNc(miX9M0##>YzHMeYeZk^Z=kyzu@~r$e1?nnz?XKXt<$ycd64c>FIm>Bm$`$DC?GA**@K) zzVFGN%Ar277$QSD%PGZup%2^Q_+#MxDDrC;IiGxQpL!YoW8dz%^qIOJCyRuMO@6n; zjD@WG*QEA&NCOkGCqjYSC-=46*kT(CL6spI#*RCLR=K}$(a{8OA_t`J=2CIXJjONg z%xCWR%$|kpO>IB7`BUMFNdiM_uW3L8AkFE^D*6Q~^EJO5y7?JuSP{BRERJH9@D74*{Qw*H>7v%p{7+T6l^sBlW=?1f&Jj9a-7lV@e_p1Oa6-Qk4dk=4{VTk5|M%(Op z{eWSfiw)u|XrONDwX-sScAHK}KeI6nj#IIB;ulBf4><1<73VN)0G_G?Q;n_-?GYt$ z8G!>_O`Sml+X4KeItmq3S#pyUu*_0{59xp|kyTBBY_kUO$5_%!jO+Ofv-oZsI;;EP zwaPLFBZ2LQL<6flqt_F45iNk6NTWRg_Sc5w5!tZ>ueo$RXjm7hAHdCdSkqbB@r-Gv zn@b-`nPy(}yfqOSaw!=UC&0lvP~srdX7a|hVWKkm8X=XnE3i6L0=6LN9SC>P9fh1| z4Dn9pT6eNIj~QubW*3owr zs(`+3dXIYT(6ug>GL>aBchiQF!dk(-FUfa30UJbif^&D60s_1)N7HmF>Pdp7HLH4 z_}G|(;$&~D3AUZPk$F9j1!35Be4d4L(aEGt`&igvi= zklJfl?{iP0WHg1hVh-qk=x27lBejH^fAaSY35Uc*MxPp8_)&SK2f8S}t(B;1Bja|- zs*`oUz&CD$<2A~<_p|cH+s-QSW{`)H6MD~~{ge%i*lC>4wWUtMtV3t)WhQ{MT833T zYM#GtDW>4mX!GNYzBF$@WytrzK#MVCg~*eO61Txy_&`_6rb+mzEUlb(yhWn({Aiba z1|VrWT=H&MEJ$8f2skZWYEyyF#uPV*UG|;uT`hk1DAepg_mf+H*E6YAVJ{i66Y`li zjQWa=?8g1YT|JW8acUk?U+?N&0;E$dbn5T?mTkI!*~XkR<7@|3I-a z?H1|y_~aFLklbq}nTK*h`z{TQE+!YLQW*xpECbJ5BJGA^u^Zm7p_yf~d&~=&kX8ee!9k5VB_m`?$^(?KDY zzIJ63DeDXV2fF+Zbon3X^8W<7j^u#&oYXa1iMk)(2}yF(u{G?gtFl}qqnAKg%VbmORKXFgT1N3; zdk)%wocJouMahZHRB8i&6u?C#kqdvy=AfU;KE>X=oU1$=nHe(pSYfX%i6AWBfg-IPK6fI>Vh87bm+BZH5UpM&Gk8n9Vt+ z84)BG#Z*3Q2yigbc$Shb2h@3^DHS5(s>Gz7bMWpH+rS2;_+$*QBnoV&x~ZVOCs&Wd z956glLG9rfA=pJ~B4$W!hz93>CT2w3GSa%{4ddh6Ko8*rT35&lXs(es;PYPGh>ukg zi4@!So#Yow_Ox8V2XS<$1JXw-g0GwJ&EKp70zdE}*#+BxQu)TX6F;Zi_jQOnF4cSL zC3o$K5fNq;(F5B6+oe>x`jWZ0Vi$tz= zRm|gtU$kCiS6ju1u>+5ZgiPl30*HH!Li~CzGrJl-Jh+J2N zkiS2P>x%Dvgf^M(I%r7diNP?_x?mHh$9*19pGG+=bW84}LpUEXuNkWiP;A*pzH2eY zh`_*@nY0#IRmR;mD85De+q_`5yrTAhec@W{_X`x;v~=>ozs$=V6EQEHUzPX$$Gi|m z|28kh|Ckqc$OQVsM@`C=R}u#!C&hT2GNm2(TX=cq?0kHjS$2Uaj0Lbl2Y} zOh+0om~FIcp=mHS#`7$S+SO{-^elhN*?`tllJDd1ls()a*N&JMw3w{je={%7?dPns zYyOy*rpHtN&AhDq2fd63BIbn;F%>f=%HOwX$#*gFM$0qUJSs}JnI)FmC+RJ8#h9ow zL@OUnp-KIU9K!C;pXiQ#7G5v!kztK@V>oqq3$KsP(v(G9Gc!Bj)yVf z|9o;YBIcSYAd+>5E_y@=4pm;zS&zI3_^iBiMhm3&#sjOazJ^B?m&fd1JK(*2Bh`B4 zrS_1oc>UlmqJueK(>A-j6S>%z`*39@Feg3Zg$pV%GJAT$ah}wl)!-tfuGOp+D8_$Wevi9%~baBD$qQMd4n`F-K z$F54w^n0Dgy^LB7qxSQaQSqxXg<$`t3{n|vb8cVKWtWG!C_`cLW&pRaUq+DtKF!HY zi*rG!f4v(Y(l29*r6yb6IFNoL*}X&4GMI60ZRS=su=G0d!Q~7MAj^f6 zg<1uK5aX2hW*MYr72yD-oc8q zSt~DLlhj11*O;?fjwVFM`zuzvuza)%$wPyUjp)pUE~z17$c#K@*@*+|>f<=yFiC_I z(PUJzfP5ejq;Viy+sK3W_vpire$HWbBx(~MNar1{CgovY2T26yN!4f8#qUty6Qx<2 zDr~_021fGreoZVE)?*^Yk!m;(xl8n6=> zgB>b8D%gtadWCfQ*e5+RDqe-O?QyYx9e(fCK`M7U7Cxjrokrp(2X4hgth72Ij>Vf^ z=!ys!ZvM>N(Q4a_SOpX^aeN{t#4a~y)@?VMv-QF20#mQ!e*g^NfdH6|a^AUasI_>s z<9v}+9;G8WXtW6_^}&fuDE<2CRlk5)+K-3PKF_>~l5)f=Qlg152S%C`EJa7#axsaS|h2JrAH#6&cI zub8(8jHiQ6A>jyvskANceo#1Y{||$C^PMA;d=I_%TM9i zzD|Nu;Fp+qVdhgiyeiWAN#K53B4g}fkRx_w|6$53sP@K?fZQ^O5 zv-ZSpj!EcABXS)AU_|J3_`d;+8UkRrAral42!P>lM#Q}=cUTxxn+W7Hi*{AUNXP^arI5Yb=^MC{Qk8)A`Te;YUxW){Eb?p$MTuAvlmC1jU%TV1P zgcgfH)DX-OmeaVaSCI$QWjMbFoMP#DQ4iMmeeUs9E}}SHhR(tEK-| zE^xadzeUTkvldY<Sbw1VV;^@?j{u%hv42Rd#_g5;!O6A zW`$p$K+O%bV0i7aFvf`sSqVCuM=B6+B5CNlCL2OJGYP~@)HF_yj`f2B6k-4FrN+mh z-A5K6Wg^x$sU_k>Cpg+3oR3+HM04=<9h7>?3L6(^-w6GTi4*jM5-~gI`vXKApdU)w z0oVgCaTrW{={_*Jq_vKMGDav59@?UfjS+yGUvyL4P(KZ@0}nf&il0qkgO==`7jG|I z3=1R*aDMnehkRTb2N%jlKNq-mrC6*Y+ooDEb&;A78Yepg`zos;}&*z zoz)*g^BUb{u?_7k0E6%~lD!vjT!^Q8HKDQfp*}4|i2mbS@PQUEj+>1OZNjK-GY=JD z%PX}LAwVLz4wdbD12I=}{H<^s31X)l@Iy?8A-BY8{p*AIV?%{wJ-uOp{Y~yARekzw^_}@@ zA#}{rEN*KP5Xrwbls$4$bRgdXn^F*-9MZHuEhGvPy|p7G?+eDC-qf#D)#*@6NH&e( zfs@O$b*sm+Jc9j~*S;Co`uJ9MDhA_9rrjCC#?VJBskeS7T!i43bM6=<=b}UeMW`4L zYFv5gf%Ol9jDY%}irYWB$|(Zp4?g@IGx48&f(bc(sIO=XBh7Gv%2e$Jb8>9FDr89? z*|y@)_t5<&!deJ0uxDh#sSu#B{jcU_Y@UJu`t7|9cYh>Q6NHd68EeMF9pHh9aJ4pV zN|gtmk%LN?v1_T<z$ZcI!ew4J@_^*0c%f<9$ z5q9jt>5+@9{jqyu@5M@>YA4auc-0-87*od)3>)`0{Ct`tD&+b_Up`;Tc-nbAX7~~C zdQ;ArN8D=U7>+l+rfKqM^{JxAC<5m}r6bgn3EBM3Qe1fekc?Ts!Z*rrv$I`=PL~gi zK}Mmn&3fnES8Ar!dsN&Wt2$6DI3n<3zra5MH}cd2<8DBEVXnp1lUB`KiRKp%w|B8|2aj3IW|uxm zFOpZgJ^LK}INE}DE#ajS?=|VKIt7Db(litnTMQ1P+*a6gF`Hk-9ekz!P+)fwE&T+H zr4lJxGO@gk`anoxp8}%)J~)o7Zw7Nia0VQ{STz{P2AiI|xmpMYv;F?|(IQoM(sS;~2Y`RP#F4W_oP1_>^O-TVd1-aD)00)2Am%qyd+<>x`Bu~O zn2+@*KmNS^5vh1NJ-XRV!|eeQg;Ap`MVLgwv!vk@q7M>9Hyi5y+q`km`+dWDD?J#zDb z{wRQcLtVpHmHI}B`^EPfdRlF9_bD`if0X83VzdP%Nk;opq8%pZZQB zOiAnTru7zrI|&-T2JPtYAHM9qhABM?snNfeZha`D5h8E?wf&^1pOXE z)sny>XT8eYin>;M0sTQyq&`Zb;IPblf7Zyy;lrk;8biW0_j6qbi`60?|F{Y4161wi zwReOccRrmVmCz?5&1q+?c^O$dlB-71S-QcEOZ8W`D)v(dF7JxX)(IXm)|h=alr_A?M;q#@KW%Gk0(evx7J1I-vy1Y(Aq(xwimY)rEd?am;c6^K%+u=D zNtAw}+n4`)Iz`X=)G0am&K283V&nzAZA` z`(EMx%E^fWa1{`55s_!sqK}ck$~wWy*Oq&cs~mj2Sz0CSwDA^&hi(l1(UPIa`cvO7 zoTjs`cubq$+CjKn;H{lwy8*DhUdD1j57|nX#S_{d$Q8uHxU)ZvzB8qFKQYW#RpqX{ zU#D!&w|^CO{7hF|ZU;%baL?Y3Hh1aIBHBke3ris{aEbUS?aGl(YRB0HD-`CuP5)={ zM#gTsh_rd9%i9ZGJHFUlNIY1N3^V*?3(MKY{`|~YZ3Guc)1DXtvK7mQAJwrJqdy#V z4klhHuFTUC)00~3!1^U)Q|6PUs#pU-tMA)UlqY%1pY7*=O`SEmM~F%oKiUnvj@xg* ze0fS)aQdj615c2%I__M=F0-xQ)?2J9p4P$~&3yXc$iCeDl+AzD5T?$ekMJlv)vGRZ zLerf)D={QVlSGh9l_ay#4>YAR%qx$+APGU!lJ%L62CF1z);bjK`s+~QC6?rx+!g1u zN|ErbmOs;3n&1;1Fm!xOru!TZ^Oxu@t7x9WY51I|tB;gFoe7vMIcW^?Alol0Vri)U zWywCQE}QP_17~Xz>a3||uCmF+)za>f;xl_{7Nbb)PacWl8n!M^chBjfLWN9fJ{yTT zcey^8mD>LZl1Wbn4a@waKx!W*ZbPM`B}YU~Q=DCagaC>BY|}u&Vt2N!D10Hu-!nk= zPJHz{0G4(Nf04D1c+K%ijp!zFq?${roHo8l+vd}$Z4QGhQ@nYJ6#$EbPJ4W`8#m~( z48P@01-;*VDi(Wq7;F1rm>f?`tQqXbm?XO|TXB$NE})oIe#~-(UF>!+k!OCclu4p< zGV*6*?b@*&tGD%uMJwrcBX3tAQB(SJ%9ijbGE8BQpsi^PEI0Yu*{>Y%c9!~M6b);% zEF0=46ZzmrGE*9WQ7;DT?CywmY{B-0zn4&WX?+;Y9+%ytN`l3fI&SLHHKh{;vNDgN zJw%z!Vle_Yd1ZbL^`55Jv>D?qz-N5kwX5i{b|N<1bHJEJU#t2)UdfV^!_G-bja+h( zr@c0?3rE^PsXU8yYr4PH?>-KC&Wo(!;Yck77|1wU_9s2pZJd63R@PvVY{1-t0!)1* z@2L$5;R9>rYX`*#)`=a@wr5A86NRsF<*$0pAHH1?GYEbsauCMUy?3!uV`%RV5Rkp3v*j5Yqb$_qGLI(`mdL<9ZzIr>$`m4PM0@iKxcBqhd=}56 ztaSFHQA9}L4Oc~30^WI{9hu}3f}!3iZC-WM{rUis6RK-(#z@Yk4uKEFHg1oJ@5h?D zZbZCEJcm3*6KY~~%A_JUWDD#Kqs+z3e%7+4z5y$#S85AlTMosg(=uqI|b*Hvjo zu=#WMd1(zIls2J)FjvjMY;T^j^|191bH&yPOO#7=XwD&$0uQimRPM9~X#K;O1i(!r zBZDJxEx|Y;`cdw@KA^nhZA@CpGkrBT8Z4j6kusq5Der!_N<5qj^qc0WkD%qm@pZ`H-HtIAY=BZ+au$L3 z3|#Yy2RS6iZYrls4*ja(15HfTa0|VSw1iW?98fxe;5h4*;V-5z%SPu1*tofkZpUH% zDn23}OlJxWe#Q8RS7>K?&U^oIh^8o(Ox9tm6@)^xb$!|tal4hwy#kcYM>BD&)Hl-A zO<4H?zIG_65^|Q%YF|8F-W}Yd88+2B+w~v&M)7f^GE)1qf>8R+s z5nhRZczO>QcyU!{Wv-Tp4r~p3+<4nfVg?)MC@C2Hwq}?5XUF8ie?ZEspR*>Xrm!@k z?OH|*&XFvToZoEQ6OGR?*fJFqb79&+U)@p%R(hc{&yo)n;Eo$lCTpPwvRMlFX5n6E-b*Lqfc!h| z+Z|gR8`2K(B;ERxMx=hfxca-LQ})z8*)~V4@rewHnPAMdXm=?qBI}jSp}s5W0(9&p zV7JGL^S&F+E)(b0Mr*VrZ?o=w{BrjqJa4fZo9Om+;KQSI$jMkyHIRv8Dw*}iq%hPgE=bEFN5Xwq z1lC4#=WxQ-nw|^F(`YI7&%7$_CK`7K`e@c4&*b4QvEV0>|rSr zSf(*7n^cw>_v~kTmeXmEpJy)qiHmf?hP;0CgoP0mWzuSqIpL8a3XnRPYMveS&<&&^ zP;Mb^mv}ZL5DXi1|68L#@yi3i5Gdby8P~*w25+o;W+feLN6ujBl`&+O-4KnkC*|zl z8io1m8MXToYw(A4KI?k!P7FpE6k8w%^a@P(X~5*GR#B0{y9M5a(*;GvbHLNq52)?O;xDicW|URT*l}- ztZRE6y?DPcIIlUGGIgn zi)Vc92WnKbcC9>UD?xNhXzS(KaUkrEPGR0yUO)WovIEdGa^_YLqEl?wr$cs5e3<0M z=*jS%b3dULh4L7MByAlmf568F9cR{E!U=u%IaGX-Q20YrXqGyi7tW{_zKHUgEV-EG zW~QRTaG1VT-FOFmcg=EOo5unW^<|Z8*&xUr6uUw**ucQFnVG)zm8ZL5uE?RhRW`aY zpM6kt*ABeNqupz=yK95Gb<;t(=n4g7$3xk4Vo2BzQ zf~NZ3aU35UX^5>nx2<(5?7j1iB$Ntw(Dj19ZeE~ciBGe{y*3e%|I4*I|I=jopC-%y zG+F+iH(82)L|_3Z9@!+MLjxp7s13I6k^X~;PZm_aF$~%O^v>xj%x*4>!AE8o5~ zMHFt5h|Lv$cK_kIPKS3Kk579<6NWuHu>Uwx15qP7skL5y(6`E%TlBGeRQ1QSNuMr~$#{#~M7=svuIr zhYur7mKz2+|7x<}%l?0wEXw~hSt3^L5Ba;vLiw*Ii{2Wuvwr`lO_p{4OOr(=e_s24 zZ?Yh@7yyt66GGNmniAT0mUJkGsm!ONC`*$knuJ~SJ{K{uR;IiW9^*Vj#nvl{1AOud zWWn!~CIXF1ka&GG_xYM#t&^piJ(YT;+GbVe#wF%+*FL zB!e|iZP%{846u3ylmBHA8`dr%>O_5j;*Xj=> zjG>PU)|NUT2MF|lHc)cANImVCCyRk1pWn2t-aML)v7;W-+)s1^jYe3)?O$8M9d$tS zhp^UC0!ns?LAp=Np;UasD8#cQvdEa8)WCD*B09=h$~2ijYj@lnjiQcMcw8(5fXvh; z*EQC_2vfdw=zZdn$b)S4RLfe~&hW0y)v~nQ zAEf|~e($1YnC-w$>aGLhpe+}Zflg6* z!oy0HOcr%+IEx(tp4MdRh$9=7#6u#aMc*vkb2}Oq&%fy7E}!)0~4XUl6oP_rav@ z-Wnb3rr7SYI>s>l!Pvo1t!JhaRKh_KJa#ua1;Cij2_*LM8H0P_?IIL2^d?WG?wUdu zR7Q$Ie}gD3%ha~$#q5i|H0IXgkqeQ4^K`ki1K@m+)rWOkx;Qp4^Nz9hl887= z4nJU$ZAXffN|iA@osn`F))JO#+~&P{9hH&0pK`iG|w#}=M#zJ zYcuSUS+-@YKRksW>$Jo|iDbmCWxCh@Q)a>GrfF)XnF^Bk13S*&+b=Evy=mDSZSf!t ztH^`G2~3ETMKAM=x6W}ugo=!#3Epw?WikR(WJNqQR)pAOB+HVQzMhOk#&fBp1KOS8 zqw+ahhmfee7RUMfq!yTURdq-&7@gFbGwipxpL{s*Jz#=lqMRh$aRjtrl`jxIPp{ z$L6uz4+@XOJizNF`x_xvrmNJsY)b?eu%u$}Fu?p0bkLTqz7=X+vwbG0Og3SweEill z3~I3iZIMiInZky0iuz+gMQZtv;Bw+TfZPCia3LJI3Xv{lpGy9oaIi0q4w`(VxK_jN^g~174oJNW@i&JZBA9i zZ36dJFUDZwiEBQIpbp~E-oVL_R&1$fdGFyur@wP8I3j36u9EhyB2b|}R7J4u@luuF zrZU^u>gI&%gUQF}2Z~~O1eED(iV}Fbyu{h!In{4ar|ipX z3>w^qA!{CZ@(XmZ1M=lHG<#Q3_-iQtj=88KF&BL7pO_0BVlmFL-{A1%rsA|}2^ic7 zpP#YAxZn$Y-=GlJ^3v`?_kqI>G_+6hPWkL+0u^I}JZG@cf08ad?0=Fj$jZjQlP;e; z|L7L~d#HGWiwkKNlOAFTwDk(-&;M2~>{vNq?aw`3lgOP#?rk}!sYxeQH|%F*q)vdw zBY7Ym_C?m;&V}lbqupW*|Lt6mra|(VFZLHVi_@O9UmWpnbrE1}D3c4O<`SgxPt4{0NW0P7_JKsdgqK#U(~IKa%%kVg zNwj(gd`UX_f>R?(^HrEOyxy1=9+UiU;{tRl(%Lmkx?jj)aLH%ddOD5YR#4b`%NlBn zk3jkUULh=d-WfgZDA1CI$qvm|Pbl2W<>oJR9T`~9v9!MK;jm7n8n$hy*xiYo)??7PNs3s?%_a9$bVZ z2?n|RpMU(zzPD|`i{0AmI$^}WAa;h_BUslH@w0sqQ9$@MTe-kyJB)2IDwdp^VUfB= zfaPXEsYtzo-+54oPO!%uxWTkHci#UJmy#TCHxjLgU!#p5}lE*{z*D zdPQ{uCNBAmVnN^M(2GWfkc|*J`K6DT;iqM^DFDEE6EO&jNriD6gy;!V5~|Mbkmz^w2umJ2+a8EDF23eel)jOOF8&eod=iDY zyI?NY#b^-g<#d)9M!vG7EK=8QV2FQ+^fCNK;c0i=kw8>K~nVlcE27@ zs-DNgVAtEEu00fX7!XCq`saY#>3$Ec1NuTRXnU?!5#U0rHs+6B=^*GTHAhc(9k?!vaLG9h%$GtK^m}&V`5a2oE6f+B%5koH* z+-*D_5id0RNYUEQyOzSo#*)t!n#pbCV-pG<=+q%S6m-9YFD4^MeI3R(84^T1#KE9q zvj3G6hmYw^%&i9pM8W-q_b0~Miwq!DA1Ekg@au&nV+3!|M_+hEJ~$rXLf*D2+Yt$s zyiWvG9arxYL~P4=Fuwk2#Cxtvg0N9A1Rc?>;vgb=Y{i5ZUiW!#bIqbCFU)_)F5Z*$HFp!?d<8 zg+Whz`{~E`;#aEY6iq-1j|JqETvcS6-G8}-`26kg6J7ON?6fnpFL7SP^ZSEp?;Y?< zHbHA8qjY~zGLttLvr)Q4^CR0qfPG`lZE#|{>FMgEL?K|nyKwmT+l1X4 z;z%ftDBFS*Vkp$-UgWB~>hHPR`LQR5fx5HTLz})A;_7{KNu?-R7`InKF5viW(Sx%c zzoDzXP}dsob<}4(sdu%v=B(*8>PoO9J4kCd*NK956TW-vRW-5seU#I!%}Lk488lhn zj#eY%z78qq3$eS{uOA=*G4|Otx7!d>_3p_%0;l`4)5k9+?>Yf8C_n^k#OOD?pI`1RnaIT2)a*3Og9E`JRDSm_AAb6P^;M4;8f2J40=(I(d`c6|HV zu;8##t@Zg^44a{F$m>1B3-=qnlN!JO4wyl2JG8Qh^u~hu(1wbS-+j@CS1?M~p^)pS z#de$>{tV;C&vB_&*p-J<@8(~o-?eorRWs9y6*g-KOb5*5C>}q~9$k!P&n{fWG@iQm zd?k}3*njx)(&@a4pK2cf5`QUFY?zWxb#wEWf*iCc zE@q^67w6SjxtA0bW@o+j<2YnuvjuvGC9o1%B3?yEx24{{&bKb~cp}iW5m~$QL(gy$ z5Iya)%9Br*&@hWPsv_KdFLOCeV6w`kPE7i*16FAVl1nwVPH%CEV2@M|Kt{z2=uDDE?EM`U=H)~rd$Za3?d?b2>( z-02IOqNR^JiMP0DInwKo=CGIg%Ww(^f3|J={5{h1NZ=%yD; zH72~{7~juyU!^7Fu{Bn(IrfC~pTCEqJgdJRnUk)4p)d`eeTm<;4E=56~oTJ8q= zSl{Gl`a<(byd~MGERxg8x5&#e__N|z?hN(r5qW)2O^g_6j)T=sZQXV4uWy7XKthK~ zFLV_7GQ@Cfo-<=f;A5I~brW`TFWpqH+R^gXJen#!Zauksv>ru^!r||@?X;S5s2{+} zIdS`$6yMGl>q#x1L~)yso;631eLRsiPLwyNL7Fq;kq+g=iwFoVVy0m@8Ghk zo?*LFwfS51Ss8e_+-Y__NZ=YDfx9NqADu*pm z`D%pY07P8a&B?W@r(1fVb&^xMDs^v(wrn+oM(p2}jQ2}QI8Q0`0s-+ZV*$f4EbIrT zR-Q=jj>i`FiyD^bxKs>gqbV-6-UX#|)Fb&pS;^iOFKo@RgwUD>AMbqe%R!wzfKPo* zc3Z#vC63yMp;AM;Hw325-uqJ%Si_k)NK8Bc0G?RQy=3HMEJT!q#LAbX2=r=Z&tH1m zF!>=XU-4UcBjRZUxG5cl{kW5k;sQuJjoTir;0p9JjqDdz41kTT07sx$^2l6Q1NV)f=7r;;h-R+&kEKVA zMhfJTGg<}mJuf|qEPMQ`boXwgSMP3Cz=_*dr+;bm0bmJh;TluqcKP`ulp?(OVct24 zZWL(feoD;ExOpz^jAJ4`W%o#C=KNA-b;^!QLlPf&JIBv_G|wj;%ma5$UEG<8k~Rts zZ{T(|t8G$m&g)qxAxoNkizRn5mWGEn7KeBqzx>p`>e3@E47qmE*+`lEENy!9Nn!?{ zX;rn;awGM=U^2*5yOy(IgIynL>2sy#mp7S0S>zYQdga>Sw5guVP)I-r-E76n6o}>Y z0iyL+rc{v$1Yls1H;z-`@9>j~LH5ePsO!5tMC}A3s{r|IHQQ&{bpp;PzJw8@`O*LO z=_pYpK4>~k&VDEcs|IjDMH%*9Obr9gC}kE4sfDb!&oEBpzQ?hexPga-kTM@_6Wj-d z1#8JxdfI6eZV!o0k~-#1Lfzh0lmc=gpp3Z2?DT6%b!trzHy}rx9#bf_tf_i#Jl8yf z@t0BvAlDm^LlW*fe8@=s>Nk0dwPrWi(+q|}TfL_rMj&M=fOIbDofZw$6wgPpKxNih zj@x8xS1t`0Uok(4Np8vw=h1?lsEmgz{G8*Z+A21;6l8TD6SwA7u`G6-uX74!NJM7o zgu<~X9)>8ML~wE=O;h9& z<=o6W8f)zjnRHnps07<8e@*y&@_QRqqnmkLI;I%ow}*#!;vn~x#V9Y^IqS^pq=SzI zsm}*}#d1RKp1Q!6P|nm;>DJ3_obJO8^}bdv6t3Bd<%ucsZ$S|c&vV@wD6KhdSJ{#E zIUfS6v^Z2HlGtSSu%?*O>NkXGAxoJgl+L7r?<+0z<+a;N2l?{>;7l#ZH5c9zS(fE-{{>gM-S!AN-cUD_S2 zB|x5>i~`1aGli>~!JUB*)d22PbK3FaJ?r}wPV;>hcHd1=rhQDl|8rC$F!GdSD?`i@ z#uPPQ!b#SDbo$=yY6Pcd_@=*!5pUG`cyRIPUztWgtxBYz!J<|EHzQkg=?O8aPBeIk zrHtOcNyEDD^5zvY7x^Jxu7M>S?F$92KCYW9U2A^BCouVHXK&c5>C_fmY@rFX#1dO5 z>x_ZS<0Xd`Z2AQ6HH6Hx89yixo%O!u~UY1jk_Ti1+wBC2t3V;8x z6+nTZszumbD{?bYv=;on_aipUO-u#r(%+5_M427LCL&| zxjmZ(fRcjG^SV5-^tG#i;1VWf^5+}nes6^Udd^sP)l)}xNb(;3smbF=z>}E%GGBFv zP5~9;&mJ)TDcq+!RQ*AqJD}_|YHT;%C$*>BP05%4y)Q}BaJQ|CN*rhDdUUCT6>J&o zv%ToxBdz0q!himQ!g4CJ0isn$(- zhM^2Q30Emsx}p5OxP3;R;yIw zB6X3S$KaokeJuB!#RHQGWzAd5b>_L=N;yI_U0|k?7t2RKof66B3|738;E^JHN*9%wISPq+O zyIaN&r7nY|l|Vp21G*lPCv{d%uC4ar)H6}EV?8z7u7U#7+Ark~Tv-b6O@-tUjWWi8 zz{|4@D0w<_N3SR=X%eVn)Y{(yc2;&Y zei`hZ9j;F-`xC!`*GbOR;pjJzRZHd~eHOMOeai*?4nC5eqY7mVg;a7$QW@fmfZ6`W zK#26>dSDVkoXU`EWPvn_ISpJf3T8=j3FAiV>ljS4+JV+>j43pbCL!7M9Wdg6%z>dQ zL#k2dXsTER(h1`0umppsOYXica`|e>zOTdASqhuZAn6;Lv2fXw^-uZ+)hAczI=~!* zY%W5s3uCJz8W>*!?}(Oxz|#4;iPb-T_{!t&2m%@Q!7TG>zZ_9mmBy%==&Fw4-zCrl z-moDDwB9qKL}kg94b`>6hf?`Jx?%fzhA!!RijNfqu)=)lQ|a+v)vgnLgxOXFYROyl ztF-*=1%9(ovU9yJs+x5PaKeOLPx`nKu}S%AA6sPcQm*P5_@$dQHFj@A@hyGse2D z!zyyPh~|Q^zuXQt+P1kdbm;*Hs_#qq8|qS-w1 zO{=0Z?P)X9zMHf!XhRf6p$*N_zAz*z$+Td!Xb6R3rlg`WQ7IoX5fUOx%@JgrniV?@Z%rKF0#TvR$O0oYDp$zyb(FW?ac`D&TFOAWRj0UpGoGo+9 z|L+wek|Mne4mdc`dO>Ov2f|RotNtA{0)le%y%mX|q5nUOuBcBrVrQ3m-yJgSce_^} z@ToZZ;e~7Bh8SySblkthsFqjYK3vzWu+2X#<9|lW_ZBG;;ANRD788S@5hP>%`dKm# z;D)!9QpER+NKVm{rCq!~L%}}kaNMOy$EEhLFWVYq05cq|Dmx~FU3-R=L>EX=w-x3^Y_QU?$zuUvV)ERQ=Z<4p!Coo=Nh9WOTKg6tE zG+K*4t;L`IU&No*Oq?|nXU)V}GjaZR2Wrj4Su=6gOq?|nXU)V}GjY~Toc~jPS~GFh zOq?|nXU)V}GjY~ToHY~Yf9gwXCeE6Pvu5I~nK)}E&YFp{X5y@wIBO=(nu)V!;;flC z|Noje;-q6XARcM~KtIq501~TW;$Fjx%jPpB6xT=hb8CC@v3fq$Uf1h-i*c5FU-e(F z?<)nNirMei8wSdZobvp*m;L&kkIm3dDOw~vK5v&=B{MnGjWh`vcOzeaIVLeJURj4U?vy^DvFKXbo|hEORY36Y7X`=SCZkh3 zes=2YbEA`MJxVQ_mpxWb{`U0m`9U8ys&woiIiHbm27cLoWCxf3axy*uLE8{w70rnqZt zJfxmnXwv|AY8bomHSTh1u)S#i9At}&E+`^_QdAKWoy4X*s{c7>@C*-yVbRADCs-uN zXeOLlcmKWw`s%?mbQefYPl%Vn=m)M+5N*!|jrcAppbdTMu5oxkQerD>rjjusI3iL@2xnzFx zJyx+wgD~5&Ow(l&g2}0q^BL)V=%i7qS?lE*A5m?JYw0!Rouj|^?yep<<*w+@t%9)) za3Df0&WN-y$M`mg0Q`0Lk4$}jn*>VD?-jT_Q-65f1A8jWY=ygV^!0nZzhe>usXasM zhMbO)-6VCeB$5P1fc1Fss(rW(b>x)kJ@SUv2XAN^3J_(IJ4cB;xvOQwM@RXW0n&s2 zq#RbbCK)l0)U}pqnkFpf1``5etZhoFd3P69L_-}CR?P)}bZWgympQMlJ#In-@W7Do z{v-w_SOiO^lwzy|jH?VR($4K#)N&SG`lhhjmPJDZaa{ffzgZIG%jol<)hukTO2crD zVnYnFM@aA4L(~;tdDZry(1;R%q~8Rnc6^)+tk5tD$$WITGMd?i%{!aL*Dzs0R(=F2 z8w7|iqA-xCz=CvrK<)?@Ra8kmtQ7oq*r-3p+H0<`cA!$|L2@s;9t&BCXy`-%WK%## zc{h!*M^W(@VU`IGlIg#q7pR$Fuy`GIj3EkW* z^ns8V#*0NFU4=D`HWva6qi*}fOV?-D&& z*Gb3hV$(52B<9BbPtRsIvxUc5&_d}(098a*mJVCZ-zb*qF-G0We$NAZ{|Y56*?d_m zfJWefj>aOT8(T>uie9m@Km|kQGC(_6rz2%a>XF~?wN-(}MurrSO{X(_qcgVvfn4Us z>_7i|I0I{S@UZC=Mok|3$~KAhaz!+TrXTOLVg*fQ=oUR`tCIJuOPHE~Al~VNm>`~y z=WZH|O;<+PBFORwIDi88$4Rs^XWeYx?XF9B|A*<&X{{4c z45`f#5%)g)yd|-+=cfx{l)efPxLO=nr5cqGRef5c3l`E!5#?%xgBY3F54L0i%&n?L zUMwfzBIZ0Z7E3Ve>{^EWhz+PiV#J5g{bPI6i-~z_`nG~8bif^^(oIhL&O|0PNX)z7 z0EtAbOUOMnL0mw1dPc3{H>%`UU!)8~( zgLOKA8@*g11_7Z#8wTVHcv8+Re?Uk=sg0T7k5GH`ZVDeMipUD?4&=`_##&@+Fgc~d z*HXpjI-Q3^+rJg`ZFB=M%5loF0W9WUJP#O!Agn5HY$j6~@GjNIAff_RJ+L*B`!C>Q zR1@eq`m5b7){Cc3H78&!sr1bzY*HX)XCB?`&`{F>#JulVW0jSZmQgqM8bN?oj>UwD zhV=&o40HV;nY}|lZ~*lj!PEQ7ba`9uLgdE@i^=>Q*jdQK({y=CJgn+q?wS|mXhdg- zEusMR&PXOoLcZX-LAPoqkKu&lZ!{tpiEY{~(I;rAvAu1#N=SW_;;P}pyB1Z)xq0G2 z&ST>fG+8#AX*nx=_0fi;xHTEjK1-Mk?B~l>Hj|+K)AlK}Zp{u#kX#}SapwoG$av43Z zRuqh^KqM>xo*Gh+Rq1ynJ*Xr}h3&D)8~&Ww;AM@Kq2?3V6Vg;JQ~iSwr8+o`{4h>N zjAIs$z|&Grh&oO637STUsaYoeD?K!ocfLx{* z3DHRbRXYg4@ie+do!P>M_AF%6)ZYtPEVUP;F9vD-@>Gpz4LuS2>%O$*TLV#Zd8?7- z!V^9H^S{!DI|y^FyMDLOxwIYVQ{}Q*;r=t+l*hjtz{)h*2V3pmGO*@C80lb5b zpL~qH5nO~>?HT`PVMcn1r=xB0Z{_1yj4PF-`s&*9YxT*G_vPwVUa&@D=AnND_9xy%5>kZkrmjU!IC?OiMz# z0S)os9@ddxo>*HZG<7R``9*fu?(GlSp`&?mX;`#baOUMS)Q7W~A!+H-T)>}5R|==Y zBWSxm=*|_oMtba|P1*+1adEh4oolAyY+C;nSVeSj5bc%}gZ#OUDK~;fwI9RxXK$)V zm`2kOG)SldR$H0SKSHy*$e9lZ3BO&*=O8m-4lWjbn4KNul`Hvzu4R{opd#O=LEEWj zM1_#8)cx{23vjCI$Q82E!IGUd~cnfrUDreY2l$L7cQ7dK-R@Mr?bF40hNz@$53XF@X$cv~5=IT3f%Pt*pdTLv_D>08m z0I^}gh%p&swU+O6eD8G9fAJX)(%ge5O*2EiNLeUTKrsUj0hSi_K$czb9)D4m%b9p-U(x_3 zP{JKzT49k{0vj5~!}=stIF+&qzqv68NekklSMOaB*J%QaT6P|GwGbhUS->^>>sQ9m zV(-F22zme)2RYY^`(Y0PFm7NM&vjp#17i|GktB$ffJhdK9~#&d(rg3RX$cXw#oXlq zgu`cUte65~K|29vK*5&WBM3aO(bu6#mXd7S2pzY-CHWYYAi5RORBuJRY|3jjzjtfM zr_Gsy%&EL>*jNekZeu>*jNI1rV@CIro*B$j9f-y1N(m3T{hQ)x3O(N~D#h0;o&78Ey{7yH7zD!W~!N z!KT<&94l%i77@-uAO3Tlv0ChMZVry4+&3ix&ylxbmc5cITC)KNp@F<&E{=qXC3PMj zZ8Ln2J|2S#%Y|!nkz0i*A2wo-C~b$AL#vNUL>c7u8GVRlpG*VqXI2EWx>SjP2C-WB zIsWSp*!~fi-vlNTn>WSznTlXV3VJ;eb(q!gJ*n=2HyqDxbKF3V{TU)Aa&{46=c6H- zSVSfvQ*7M$5Ybd3I+e=1cuz;?AUc#1B42I4Sx_bJ6@{CC!Pwh2uPUdP{i58$T!{#G z0Rt2BXm|A^=@@Zl>5lo)IvkfGbN)_mQs<_XkR9%5Pi~)Q49aORBpurxiA7)X)Z4uP z%4zUdR_}`S86a5L6z+!%=iRk=b$9z0%Wqqe>(m=?QBK=PQNPliwsBF!l}G%j@QNq= zJ8sqNOAib}wjLru@_y)(Gd&^et;WG?!AR&3yZ`d%{*y<06Xh4X*{@|eFF zGkDuG=Sac2y%)xd{4%gG6!SDzFdi#}smBmqD+q^IsC^&>2B2WvmO|YS=OsVG3%Ao6APU% zOhc6Xu(TpoJa?Kt@uk+u{gh2Q)4n}5<-_Y;f2*cVYmO7A(1ezEpU~c{w=%$+umx}q zJn~yXUxlr%>kd!9!=;Gp8so$JE}+*p^-7&+gn3*%dsHc4x~z)6zYkV6-rgvY?~vB? z;P3RbQ;Sa|+qed?!3+^LZF1wIPJ{>yB%&1A$fv%9=N7MmUU?=EE)2B1GXHoj>}c<) zqcf4!iFeTz)|0HtzDYOUj4K6MyYF&{bBnk-6|s8ly}?=N)<^8tgJ{A}7|vInlL1zI zg}s_64dRUh!xKxHUHmWoo?2HWh(O^)dx>3xQ5eF;E>|`oLzV(F17>sYH{@S?Yf=OG z#_BDd5uaU{oRLMU`oG%uFHoW}qwy6Xa{QRO|Dyvdn=@6y;Z&XP%HBpPbHqY!Kc?}K zvu`WkZ!lBcDcIAdhZg%Ffuc9^Wai$QiM^~rrNM~+67uo(Z)!2$)L6oy{gdN&P+8co zQIkh7l&@~=s`xK60Pm|%bE8N&;J%4*L>6c zhWINxc+MYrSysfUn7jKM34fbWx_V*XY9HjltCxCEd*GEw_UWwjpyFX*!CnV_&=^*0 zUD($Gmi^mLX#L_V_~HKz;Y(W7y(p}!8N&gevj-NR4?_u?f;-M-h#^1g?C&?79|+A< zGrYxs4AO>xrqH*jy+?ZjFZN$RTVcQXe*2O6;I}X9oBqbR)Oql7#m{-pPgm|uwW(vV zZ>kcuyx$`|zhMg8b!}efI`LPXZhluEbqGwl(C)LkpeFcX%SG4o7;_QhkvD@69K5|8!R?~LT^4LeEaeB>(ub- ziZ12vr8mF-oaj<*TFlA*s+0k?tUBkus9v_+(a1W9uB}vvh*!~edC{A_63cRbqW$lD z7m`B;f5js!4zDV)r=D$G6ninQzrK9pcMHimZt1wIE|)!+W++X+L)}afjSbF~Ky>Es2&f$iL=O6sffz9lN)R_V~S@Nb50k>yh#K87!axDoY z6)EjhsP>}V8q|~yZFVbkfq^_3H4bhMug;UtkiZ<-L&--eBLKn;D(PIV3tsEz{Ofd* zOTW5-d-ctfD{=u33zavX5V!1T#?Hq83_cH5;|83yFJ0t!YuX-zN@Rt)v_#coe~rAU zeMM+F91&+;eEZibztFWYh9t=HWIAYKP$XDBPW&6KRXA#s*+F`=)t`ye&r~k=9;9^pV~4 zfTZw6UnBI!JXzuZzNJtl^RGAO@o^k*8}IDJmix)E6jL>`P2ZaD;(2kvf0?edyj4b7 zL9TAP!#r=MLeIF6FR~-wlwc}ZTydyNcd__pC!r^UH{(t-Oj|b;M(Z zCmZk2u1XDA?a1-+xSL*37g#bHZCQV6KUPOl$DR^5Z0~w$K1Wl(hr%KDFY#_lY+0t= zcKsYhkdj%7AMG{zAkDJ#Iob5%nT_g0S80m7wT-zgknUPC5TIOC;!t#JKjp^Vf-(BW zIUG;&9d75L!6Mn0;vkT*DRn3Y-J>JsTbzEqu7obMoAT9(u{WDABD?nt-1A0UaJ;Hr*kH&b=`#bOTJ5q=N%R%)z@ z^R|U6E1NoKmT)Mhpp&rw%;x(>9~R&q;`q|*=XC@oY{Pi`E?D~^yH=)FwSEyglOb4L z{9s?#6(Fq?cMqgjTwN-i*2*&q*qw@*NsRM%2YB4tcgF{E4N+cIOvkgsQAXMm9J1u; zWsWOBORDuiK{MI(kG0Hx33VD0Wl@li9~qCRm(lMae^=qdz~e z_k?)f{yuD7GFwZ1dEh=Nsp4-(eV(QTMGBS^%<)03M9%2qc7y)v@3-5%$N?ko=X<1- z13Yz4ehvv+EM2d0^ZN;1GhwXU%a-l4aEWGdTz-R5c>OiTuW)wgOj+2}??QL1POb@5 zy8Rts#24GvfPzeg)7T~q@ZaZi0eQrnMdcGmRl}Kw-Wud9iDead>EzjT>gwf`F*(1- zuDpkip7j56=d)ew6fg){7rgx>>?I19*(*dUk3S4?C+_&uzZ;=mL2_B_W_unbgW_^9-7Xd*7J zvm)0Z8vtmUxPrd;N`ll;p`J=vUMoI*%if0Tba@#yzLVFpVjKQ2GEd~?CCiu6?dK_2 zWO)1hYmxo5u)CKexpDnfVNtjvLH#x^*V4ydRwdD81KstJjqb8?(Wfgi_|?1 z68fH|v|Jn~7I>={KS_xp6CZ=pcpN=u+n$R~IGt4~x_zmng#;i~Knj}Czq0G+xg1k~ zcOlh!e2;*K&=)GVnwNm+;}oQk-#WlZ>@&VV~yo>sy z2$LE9Z9Oavwe|5cP{5WoJLawZj94yHS6=3yQKbA>V0LG_syWDYRkET4&tFrK)F|Ks z)Zf8I0wD+qx%djA-Angh;%_H){?RnX(#s?F+s8;5o-wg$xALun`BK3*2?ofM0kZy- zT{$7eIphDuV2%hAffQl4>XC5ReKm*RYb=p>zQ0yBoN};y4Et(B6I(JZddrDvWNwSg zM4#ur7L@Fh5r^cTxg15F1dGi8d1qt}Po$i=H5R@hO#J^(Z9MnJIA3G*$Y9exQ?VdNhlbyt96|C#k>?_f3qjK1qAoUJ7Mj*X*)Z zifv*(N=k~Smob@Kr`Dtu^uARn$-?A}ZC7ZQ5gobcVjviIiqACA1(Q(L8qZ^#t zsFn=ujI1F@IZyMRM78X;{O9}!{P%Tg)SA@!6IG+hG2OtUZOK|6_strtc3eALK~r*j z^eNzlrFON`&*B{ri}>yUpA#)_4SweYkc+bjkG&I}XFu3>(qQu+bkPOcdPfqbV8?Pfc{siFSPTYF>wN9`df|i|d)Tn$ zA9!}tuhGL==0`Z7g2(EX%-hm2&n!KU#oZ9mzm9MF(|VG>^#y5c5veO75GfYTw&4)v{)lJVa&e{WE9HzduRD<8 zt*~5$Q{>;KXOqMY%#QWvEjhL1z`%==I8v$W1KSGP&$1S`G6z|`Zb$5WK3wligT|h# zVEQ*vi|s)1?=Mz!XnM}Ze%+e=d>jroNd^(sr{#EzPw^y^sz&pMOE><~jHBe0DWC;` z336biiJnawnuKIfs;B2e7E^2Gu5KH!PrmD)vW?C>2KklvD-mSbk;fwjhyZo znPpmw)@{~@gM)j)^wV;cXB{|<^mkmnGp_Ls1`Z^;Q92XHbF(DER!e6j%+<21Jo}m$ zMu`w}uX}L4=|87iA3yI)(XV`0%#dWeTXGo+Ojbk?Xy|3crbCKYOiHJ0ABVAc!+I6N zVHe7H{fgnXRe_cjkd<9q`py2bdz!Rr6}=$v`+7npvruiuYjS(g}c2_sr_~+$KjoBL&XS^rZHyH|{+4HiS3K$u0Vdd&>XAXE8?ghh{q?cX|M+-+- zFhW{E5dgNnw3?~vCd?2$n_8Qb8|%M3*7fy%M1eSi>dFN3YdPLV-2Q~NTaL5#>WR>n z)4m-m+D3$q&*VFC53fx|lFEYMs|}XTkDqi`s|emPQ}y7k`oU^|`SqRSpB{$wl5t_P zpJSuf;2@0QfLG&nv@AQ8?zOl#(D5X?oQ~h~>TbI4(5|G%FYYj!^zB#uvs~q7Sq`|C zSA!LR5Nc}c^8fCQS@GB)ksQ> zip3O(T!CC7!%!^xkld1!ue$|-va?n4f@qLKkS{ zv+mgQQeCop0;AfOQonfDaV&@u$IavUb#~itjT~a>je127e@b$CZ@FGh6zJ*RmEvmZ qY%%gVVyIYc)VEwcBLX%N(cF{G4ZT7_9x^s?;f+wpyo?0k@V@|NN|c!Z diff --git a/tests/movie1.mng b/tests/movie1.mng deleted file mode 100644 index fbea0917ba14bacb087096eb0506d08bb195060f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28074 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 MKIX*CbTjw=01+a_tN;K2 diff --git a/tests/movie2.mng b/tests/movie2.mng deleted file mode 100644 index ed66435ce541977854738a98732053723d6940e3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3984 zcmd6qdo)!28prp{#55R`+qjGwN)p0EZc&WOFhir)WkMH8kz7W`sFXoSYEr2P$8Bg* z??e}2qRE(Xi4e+L#88IHrHkk~XRFgW?>XzNbE?jpK6NxlbPg9LylL|nAP zUNHasmNw7lgW!SY=H%c_;ZI&Pli^|IoXoHJR{%#>wPtsms=toU;ro-_Q;( zJs@MzJSF{oEYPGZ`mPvNan#o@ruI4g&fF>g(%mSp*jjz~XSs5$jlpqGnUZtK<1DOA zZ1NtH!-2RjPr3?CN z>t7xL(+~XsP;qJn4m|x^{oxDx3C)vzTqMI(?wDxfaUTi}W~#_%1u3i{mPa>Toy*XT zT2{>2#w6)>U{wdWLmRiGrMD~)Z`K9IN8tL*0G0>Tg zvXmWD&~TeOvqs(XBlh0RuRZxnhcF5-|IG{h7g;s)r|SC0RY(R_QL5{7@r`I%Vupuad$f4kM%Cv6*S*rqw<+6k1-=!g?!7 zJWh-7#(h-aTckyyN)qIVMZS(H+0~D!W}){Zb{6l-5q&67U4HsRMjGlhJ5*=w>)tLW zwlb?`R31$hIF3M-pln4Ji{dIJn{kS}k$kBUtM{0mh~jwh)0@7?7c-%l<#{--zB3Uz z21yy$nC)1-PC7x=*GoV@6yF<>{ODwsM&ZL*9XrTi9t!xnjs$D+r2HRr)U96~RsW-- zhSRJ5rK8xSNPy4D-Kn-8wS+ZerA&md@$1M(=h7bZO+2C*2oCh9ATqNz(v8TfH!Yh*hsA?sYD4pOw*trRq4c}6;-~k0W@s!v#E$=JcnMp;X){aU zcku*8>8l)1)TxjSiyhqiZR~Y_=a)THXyYHp2MXECu6SlLY*vk&^h$AFpTt|a8x5 zXq}}QfHz4x@Tsp7w$ruc z25);-6b83}%Hn(wophkUefx#a6bjgM{ zoX!ea&K+6I1mIsI7b|2-L*H zS9xk=E4fBltqB@fa_UPZ?mm<>KdAbV2 zHG-=Xnv;J=l>|LZJZhks6-4|k(4=V=m1?z9{+liyxuQuu;ri5(c6210r^1VAKN3ef z54?=KU9%E@Fpid&tB!l4%m4UCNSYS6B`a7>J?70?WI%p9oL?PxrZ|Fmv)C|k^xQOl zPj?{-Zf3thAY_W{7N6baf3O1$pc6beL}Yxca)zPJgB?U^P6ve~OF8+)mLgu0@D9T- zjdzIc*akILMRFeaO~wEqKEgXy63#z4yS~V=FiBGvci{utZ?DL+F#>53n3rmM4xj~w zExFrXDzaHY*~N}fA?BOz?nmI61*R{+r0Q8uoP0Q_U-Yt;_}+AShrnA-(x0oqo2Y!i zEt!?8qKO3h_tM+D?xAdHT5Ae}y8AGTPb}#tvB|z4mN`{~3GPr`B}C*mf|gkiEiJ1E zqr`Lyp9DI*m0H_etC+Q?E5=laL$H+qHOCj#ui_`$Co@Q!{bL$z;jR@Xb{~ueYxR+# z4=jo-{E|KfLe|tky`vA#*xfw#plB>^=KhY)DZayz@`K5lnmg_)oIf)+1Ks&vq0fn( zN?m*wem`0K2bXMK&5_xsXHE!HV8#4+OsXpd+IPz_~j`hyR gaug;I<9`VSmLL?-8mm8R{%;fl9^fyc4tB2ZuQB=N3IG5A diff --git a/tests/movie3.mng b/tests/movie3.mng deleted file mode 100644 index 9278819eb316443bb129bfc31eb2e218e8e25329..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39640 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 J#(FXJe*mM4stN!A diff --git a/tests/movie4.mng b/tests/movie4.mng deleted file mode 100644 index 1678bf66c7d91accbfab06824fe9d07c91aa14d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7616 zcmeHMYfMx}6h7s|cvTVhxBD z3RWD8iH{%_9}!!s28&c9ik)hGw6O|StEd>I4_n`MdS;1@>7Q!)_YS$)d+yA9=R4=@ zH?wzG8yOYm;?&Ox0N#lVH%`UR0KDAs>Vns+P4&DzSlUk0L#IZn<((==2$5V~)Q0z6 zLnay`K*&E0k2xcsSR%rV9Z$A?RaJ&hTuiTc&`1bf1$-Ad-UsE`SN30*C-K z5F4Qp3n$}fkbY!ioKwyT=OEpp#TaLlGr}227T8G{r<7B|DM(T{mM~5zCxjC~jyRPA z<3KqO4(JtGBN&oKmPiZx&@o~oG-BaokO4^>8)b|z1~NW$ix#Df5=KFWi!88{P(}zN zfYBo<9Ls<*APg`(%m>oM*_aNDA4y<@$Qr?rG_u5@$O9cCHbNs7$jr%Zw6PINK_(L8 zL$_!VLJ44AF z)zwv3R~Hl%WMpKR&1R#~=;h_*<|eV9Y3xV>a!kgF)0bb~TdMbH&}s}V<28w{$6h46 zmf6?V&MEk1bpF}ARIixR(Vgncd&Jf@goebg*|yyNt17PV{d20NQ`VWgX}#XQaeZ%W z@4f2U84sEQ%~uP&Px01MI^Ruq$DRI6>e9KmE0({-HTe| za`egJ#m%ePq^t|$cOsQATWG9pS}L_=B%~!l@X*1-OeqP;Ns$T3*2IO{(K@|Oul4sI z=^rrCU$31KI98jOW=*$c2B&1E+pLMYq;%cqlj&zGs8KM*ZXOy&5O17H3zkbM{WT+8f+fn+nim~?@Z@L&#P6QaW{(=vp|w$g&R_JnKBZS`TR+aABgeeUG9*MS+R}-%NpSFBRz7 zWyieUJ#=`2v=LOk3oG#rUU^|u4xE$&CwW};y1zPu{!vrKH4*$Sl-GqXyCkk0GzEzF zV)E+(x(5b#w#IF3_cA$OOlbF>r8;NWe*9GT`B|#KaXsMd6YYY2Ri#%I^{Sgv*U%r~7Lb@Optc+qH&n&=@})>{vweU}+LZdtN7l=NDeP`{_L z{`ttDgNHH~+^Kf&qv%x8siM<2(`nXAoz}^78DpF0>VW+HIrkHExm(6gaoS&5;ZtNE zvflNat39aG4~08=hOQd=v&HR;7?%dPXtwx0>tys!Y(C;sw7p9MpE1O``OZh-_8xQB zk2mXgUe5U~{=o43!_OXl+}e1nWTwZ3nT0-<+w;bpNxS{{XrSub5uZd|?i(8MFWEvQ M{#Rs>_R;r$12o?V!vFvP diff --git a/tests/movie5.mng b/tests/movie5.mng deleted file mode 100644 index 81544780fd05c1fece95aeb1fcd9354002b5656b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34394 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 diff --git a/tests/movie8.mng b/tests/movie8.mng deleted file mode 100644 index caae44c7f3dd57bb212b9a5f78edc33ea08f90ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6695 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 Date: Thu, 29 Apr 2021 20:45:54 +0200 Subject: [PATCH 08/18] Removed old ycc --- ycc/Makefile | 16 --- ycc/ycc.cpp | 269 --------------------------------------------------- 2 files changed, 285 deletions(-) delete mode 100644 ycc/Makefile delete mode 100644 ycc/ycc.cpp diff --git a/ycc/Makefile b/ycc/Makefile deleted file mode 100644 index e5336bd0..00000000 --- a/ycc/Makefile +++ /dev/null @@ -1,16 +0,0 @@ -# Yast Control Center (Yast-GTK) - -CC = g++ -CFLAGS = -Wall `pkg-config gtk+-2.0 --cflags` -LIBS =`pkg-config gtk+-2.0 --libs` - -all: ycc-gtk - -ycc.o: ycc.cpp - $(CC) $(CFLAGS) ycc.cpp -c -o ycc.o - -ycc-gtk: ycc.o - $(CC) $(LIBS) ycc.o -o ycc-gtk - -clean: - rm -f *.o *~ ycc-gtk diff --git a/ycc/ycc.cpp b/ycc/ycc.cpp deleted file mode 100644 index 9269ee07..00000000 --- a/ycc/ycc.cpp +++ /dev/null @@ -1,269 +0,0 @@ -/* Yast Control Center (Yast-GTK) */ - -#include -#include -#include -#include -#include -#include -#include - -/* Definitions */ -#define YAST_GROUPS "/usr/share/applications/YaST2/groups/" -#define YAST_ENTRIES "/usr/share/applications/YaST2/" -#define ICONS "/usr/share/YaST2/theme/current/icons/32x32/apps/" - -/* Globals */ -static GtkWidget *window; - -/* Get all names of files in a certain directory. */ -#include -#include -#include -#include -#include - -std::set subfiles(const std::string& path) { - DIR *dirStructP; - struct dirent *direntp; - std::set sfiles; - - if((dirStructP = opendir(path.c_str())) != NULL) { - while((direntp = readdir(dirStructP)) != NULL) { - std::string filename; - struct stat buf; - filename = path + "/" + direntp->d_name; - - if(std::string (direntp->d_name) == "." || - std::string (direntp->d_name) == "..") - continue; // ignore . and .. directories - - if (stat(filename.c_str(), &buf) == 0 && S_ISREG(buf.st_mode)) - sfiles.insert(direntp->d_name); - } - closedir(dirStructP); - } - return sfiles; -} - -/* Erase everything from the given characters. */ -void erase_from (std::string &str, const std::string &chars) -{ - for (unsigned int i = 0; i < chars.length(); i++) { - std::string::size_type pos; - pos = str.find (chars[i], 0); - if (pos != std::string::npos) - str.erase (pos); - } -} - -/* The widget with the icons. */ -class View { - GtkWidget *m_widget; - GtkAdjustment *adjustment; - std::map m_stores; - std::list sort_keys; - -public: - View() - { - m_widget = gtk_notebook_new(); - gtk_notebook_set_tab_pos (GTK_NOTEBOOK (m_widget), GTK_POS_LEFT); - } - - ~View() {} - - GtkWidget *getWidget() - { return m_widget; } - - void addGroup (const gchar *name, const gchar *icon_path, - const gchar *nick, const gchar *sort_key) - { - // calculate position - int pos; - { - std::list ::iterator it; - for (it = sort_keys.begin(), pos = 0; it != sort_keys.end(); it++, pos++) - if (strcmp (it->c_str(), sort_key) >= 0) - break; - sort_keys.insert (it, sort_key); - } - - // label widget - GtkWidget *tab_label, *image, *label; - - GdkPixbuf *icon = NULL; - if (icon_path) { - GError *error = 0; - std::string path = ICONS + std::string (icon_path) + ".png"; - icon = gdk_pixbuf_new_from_file (path.c_str(), &error); - if (!icon) - g_warning ("Could not load icon: %s.\nReason: %s", icon_path, error->message); - } - - tab_label = gtk_hbox_new (FALSE, 0); - label = gtk_label_new (name); - if (icon) - image = gtk_image_new_from_pixbuf (icon); - - if (icon) - gtk_box_pack_start (GTK_BOX (tab_label), image, FALSE, FALSE, 0); - gtk_box_pack_start (GTK_BOX (tab_label), label, TRUE, TRUE, icon ? 6 : 0); - - // page widget - GtkListStore *store = gtk_list_store_new (3, G_TYPE_STRING, GDK_TYPE_PIXBUF, G_TYPE_STRING); - m_stores [nick] = store; - - GtkWidget *icons_view; - icons_view = gtk_icon_view_new_with_model (GTK_TREE_MODEL (store)); - gtk_icon_view_set_text_column (GTK_ICON_VIEW (icons_view), 0); - gtk_icon_view_set_pixbuf_column (GTK_ICON_VIEW (icons_view), 1); - g_signal_connect(G_OBJECT (icons_view), "item-activated", - G_CALLBACK (executeCommand), this); - - GtkWidget *page; - page = gtk_scrolled_window_new (NULL, NULL); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (page), - GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); - gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (page), GTK_SHADOW_IN); - gtk_container_add (GTK_CONTAINER (page), icons_view); - - // add those to the notebook - gtk_widget_show_all (tab_label); - gtk_notebook_insert_page_menu (GTK_NOTEBOOK (m_widget), page, tab_label, NULL, pos); - } - - void addEntry (const gchar *group, const gchar *name, - const gchar *icon_path, const gchar *execute) - { - GtkListStore *store = m_stores [group]; - if (!store) { - g_warning ("Didn't find group '%s' for entry '%s'.", group, name); - return; - } - - GdkPixbuf *icon = NULL; - if (icon_path) { - GError *error = 0; - std::string path = ICONS + std::string (icon_path) + ".png"; - icon = gdk_pixbuf_new_from_file (path.c_str(), &error); - if (!icon) - g_warning ("Could not load icon: %s.\nReason: %s", icon_path, error->message); - } - - GtkTreeIter iter; - gtk_list_store_append (store, &iter); - gtk_list_store_set (store, &iter, 0, name, 1, icon, 2, execute, -1); - } - - static void executeCommand (GtkIconView *iconview, GtkTreePath *path, View *pThis) - { - GtkTreeModel *model = gtk_icon_view_get_model (iconview); - GtkTreeIter iter; - if (gtk_tree_model_get_iter (model, &iter, path)) { - gchar *command_; - gtk_tree_model_get (model, &iter, 2, &command_, -1); - - std::string command = command_; - g_free (command_); - - command += " &"; - printf ("running %s\n", command.c_str()); - system (command.c_str()); - - static GdkCursor *cursor = NULL; - if (!cursor) { - GdkDisplay *display = gtk_widget_get_display (window); - cursor = gdk_cursor_new_for_display (display, GDK_WATCH); - } - gdk_window_set_cursor (window->window, cursor); - g_timeout_add (1500, set_normal_cursor_cb, NULL); - } - } - - static gboolean set_normal_cursor_cb (gpointer data) - { - gdk_window_set_cursor (window->window, NULL); - return FALSE; - } -}; - -/* Main code */ -int main(int argc, char* argv[]) -{ - gtk_init (&argc, &argv); - - window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_window_set_title (GTK_WINDOW (window), "Suse Control Center"); - gtk_window_set_default_size (GTK_WINDOW (window), 650, 400); - g_signal_connect(G_OBJECT (window), "destroy", G_CALLBACK (gtk_main_quit), NULL); - - bool is_root = getuid () == 0; - - View view; - { // adding groups - GKeyFile *file = g_key_file_new(); - std::set groups = subfiles (YAST_GROUPS); - for (std::set ::iterator it = groups.begin(); - it != groups.end(); it++) { - if (!g_key_file_load_from_file (file, (YAST_GROUPS + (*it)).c_str(), - G_KEY_FILE_NONE, NULL)) - continue; - - gchar* name = g_key_file_get_locale_string (file, "Desktop Entry", "Name", 0, NULL); - gchar *nick = g_key_file_get_string (file, "Desktop Entry", "X-SuSE-YaST-Group", NULL); - gchar *icon = g_key_file_get_string (file, "Desktop Entry", "Icon", NULL); - gchar *sort_key = g_key_file_get_string (file, "Desktop Entry", - "X-SuSE-YaST-SortKey", NULL); - if (name && nick) - view.addGroup (name, icon, nick, sort_key); - - if (name) g_free (name); - if (nick) g_free (nick); - if (icon) g_free (icon); - if (sort_key) g_free (sort_key); - } - g_key_file_free (file); - } - { // adding entries - GKeyFile *file = g_key_file_new(); - std::set entries = subfiles (YAST_ENTRIES); - for (std::set ::iterator it = entries.begin(); - it != entries.end(); it++) { - if (!g_key_file_load_from_file (file, (YAST_ENTRIES + (*it)).c_str(), - G_KEY_FILE_NONE, NULL)) - continue; - - gchar *group = g_key_file_get_string (file, "Desktop Entry", "X-SuSE-YaST-Group", NULL); - gchar* name = g_key_file_get_locale_string (file, "Desktop Entry", "Name", 0, NULL); - gchar *icon = g_key_file_get_string (file, "Desktop Entry", "Icon", NULL); - gchar *command = g_key_file_get_string (file, "Desktop Entry", "Exec", NULL); - gboolean needs_root = g_key_file_get_boolean (file, "Desktop Entry", - "X-SuSE-YaST-RootOnly", NULL); - - if (group && name && command && (!needs_root || is_root)) - view.addEntry (group, name, icon, command); - - if (group) g_free (group); - if (name) g_free (name); - if (icon) g_free (icon); - if (command) g_free (command); - } - g_key_file_free (file); - } - - gtk_container_add (GTK_CONTAINER (window), view.getWidget()); - gtk_widget_show_all (window); - - if (!is_root) { - GtkWidget *dialog = gtk_message_dialog_new (GTK_WINDOW (window), - GtkDialogFlags (0), GTK_MESSAGE_INFO, GTK_BUTTONS_OK, - "You are executing the control center as an ordinary user.\n" - "Only a few modules will be available."); - gtk_dialog_run (GTK_DIALOG (dialog)); - gtk_widget_destroy (dialog); - } - - gtk_main(); - return 0; -} From 88b540bea941dfd90aa3ea095aff963f14ed8acd Mon Sep 17 00:00:00 2001 From: Angelo Naselli Date: Thu, 29 Apr 2021 20:49:12 +0200 Subject: [PATCH 09/18] Removed unused variables --- VERSION.cmake | 6 ------ 1 file changed, 6 deletions(-) diff --git a/VERSION.cmake b/VERSION.cmake index 8a7fad51..c7e4313a 100644 --- a/VERSION.cmake +++ b/VERSION.cmake @@ -3,9 +3,3 @@ SET( VERSION_MINOR "51" ) SET( VERSION_PATCH "0" ) SET( VERSION "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}${VERSION_SHA1}" ) -##### This is need for the libyui core, ONLY. -##### These will be overridden from exports in LibyuiConfig.cmake -#SET( SONAME_MAJOR "0" ) -#SET( SONAME_MINOR "0" ) -#SET( SONAME_PATCH "0" ) -#SET( SONAME "${SONAME_MAJOR}.${SONAME_MINOR}.${SONAME_PATCH}" ) From ac9e620e34d1eb9204fdea073934849a92b382bb Mon Sep 17 00:00:00 2001 From: Angelo Naselli Date: Thu, 29 Apr 2021 20:50:22 +0200 Subject: [PATCH 10/18] libyui-gtk --- CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 6b9ede91..7b56dd08 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -15,8 +15,8 @@ # Show the complete compiler commands with all arguments: # make VERBOSE=1 -cmake_minimum_required( VERSION 3.10 ) -project( libyui-qt ) +cmake_minimum_required( VERSION 3.17 ) +project( libyui-gtk ) # Options usage: # From 9a41965ad952be186607a6fcbe4f1705fb795ffc Mon Sep 17 00:00:00 2001 From: Angelo Naselli Date: Sat, 1 May 2021 21:52:23 +0200 Subject: [PATCH 11/18] Removed link (commented by now) need libyui.pc to be fixed to remove code --- src/CMakeLists.txt | 42 +++++++++++++++++++++++------------------- 1 file changed, 23 insertions(+), 19 deletions(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 258c031e..7766455e 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -13,6 +13,7 @@ pkg_get_variable(YUI_SO_MAJOR libyui soversion_major) #pkg_get_variable(YUI_SO_MINOR libyui soversion_minor) #pkg_get_variable(YUI_SO_PATCH libyui soversion_patch) +message (STATUS "Using ${YUI_LIBRARY_DIRS}/libyui.so.${YUI_SO_VERSION}") find_package(Boost COMPONENTS system filesystem REQUIRED) ##### This is needed to be set for the libyui core @@ -122,26 +123,25 @@ add_library( ${TARGETLIB} SHARED # Include directories and compile options # -set( LOCAL_INCLUDE_DIR ${CMAKE_CURRENT_BINARY_DIR}/include ) - -# Symlink ${YUI_INCLUDE_DIRS} -# so the headers there can be included as -add_custom_target( local-include-dir - # check if the symlink already exists - COMMAND if [ ! -L "${LOCAL_INCLUDE_DIR}/yui" ]\; then - rm -rf ${LOCAL_INCLUDE_DIR}\; - mkdir ${LOCAL_INCLUDE_DIR}\; - ln -s ${YUI_INCLUDE_DIRS} ${LOCAL_INCLUDE_DIR}/yui\; - fi - ) - -add_dependencies( ${TARGETLIB} local-include-dir ) -target_include_directories( ${TARGETLIB} BEFORE PUBLIC ${LOCAL_INCLUDE_DIR} ) +##- set( LOCAL_INCLUDE_DIR ${CMAKE_CURRENT_BINARY_DIR}/include ) +##- +##- # Symlink ${YUI_INCLUDE_DIRS} +##- # so the headers there can be included as +##- add_custom_target( local-include-dir +##- # check if the symlink already exists +##- COMMAND if [ ! -L "${LOCAL_INCLUDE_DIR}/yui" ]\; then +##- rm -rf ${LOCAL_INCLUDE_DIR}\; +##- mkdir ${LOCAL_INCLUDE_DIR}\; +##- ln -s ${YUI_INCLUDE_DIRS} ${LOCAL_INCLUDE_DIR}/yui\; +##- fi +##- ) +##- +##- add_dependencies( ${TARGETLIB} local-include-dir ) +##- target_include_directories( ${TARGETLIB} BEFORE PUBLIC ${LOCAL_INCLUDE_DIR} ) # Setup CMake to use GTK+, tell the compiler where to look for headers # and to the linker where to look for libraries INCLUDE_DIRECTORIES(${GTK3_INCLUDE_DIRS} ${YUI_INCLUDE_DIRS} ${CMAKE_CURRENT_SOURCE_DIR}) -LINK_DIRECTORIES(${GTK3_LIBRARY_DIRS} ${YUI_LIBRARY_DIRS}) # Make the version from ../../VERSION.cmake available as a #define @@ -152,15 +152,19 @@ target_compile_definitions( ${TARGETLIB} PUBLIC VERSION="${VERSION}" ) # Linking # -# Find yui during a combined build -target_link_directories( ${TARGETLIB} BEFORE PUBLIC ../../libyui/build/src ) +# https://cmake.org/cmake/help/latest/command/link_directories.html suggests to use target_link_libraries +# and anyway LINK_DIRECTORIES command will apply only to targets created after it is called, so must be set +# before add_library in the case. +target_link_directories( ${TARGETLIB} + PUBLIC ${YUI_LIBRARY_DIRS} + PUBLIC ${GTK3_LIBRARY_DIRS} +) # Libraries that are needed to build this shared lib # # If in doubt what is really needed, check with "ldd -u" which libs are unused. target_link_libraries( ${TARGETLIB} -# yui ${YUI_LIBRARIES} ${GTK3_LIBRARIES} ${Boost_FILESYSTEM_LIBRARY} From 5a7c5b48619ea0e946651c3f2332346d04a6bbe7 Mon Sep 17 00:00:00 2001 From: Angelo Naselli Date: Sat, 1 May 2021 21:53:30 +0200 Subject: [PATCH 12/18] Removed yui/Libyui_config.h not needed any more. Changed icon loading as GtkImage using YGUI::loadIcon or GdkPixbuf using YGUtils::loadPixbuf. Both look for a full pathname or theme icon. --- src/Y2CCGtk.cc | 2 +- src/YGBarGraph.cc | 2 +- src/YGComboBox.cc | 2 +- src/YGDialog.cc | 213 ++++++++++++++++++++------------------- src/YGDumbTab.cc | 5 +- src/YGFrame.cc | 2 +- src/YGImage.cc | 2 +- src/YGInputField.cc | 2 +- src/YGLayout.cc | 2 +- src/YGMenuBar.cc | 21 +--- src/YGMenuButton.cc | 2 +- src/YGProgressBar.cc | 2 +- src/YGPushButton.cc | 68 ++++--------- src/YGRadioButton.cc | 2 +- src/YGSelectionStore.cc | 26 ++--- src/YGText.cc | 2 +- src/YGTreeView.cc | 2 +- src/YGUI.cc | 36 +++++-- src/YGUI.h | 13 ++- src/YGUtils.cc | 42 ++++++-- src/YGUtils.h | 15 ++- src/YGWidget.cc | 2 +- src/YGWizard.cc | 2 +- src/dummy.cc | 2 +- src/test.cc | 2 +- src/ygtkbargraph.c | 2 +- src/ygtkfieldentry.c | 2 +- src/ygtkfixed.c | 2 +- src/ygtkhtmlwrap.c | 2 +- src/ygtkimage.c | 2 +- src/ygtklinklabel.c | 2 +- src/ygtkmenubutton.c | 2 +- src/ygtkratiobox.c | 2 +- src/ygtkrichtext.c | 2 +- src/ygtksteps.c | 2 +- src/ygtktextview.c | 2 +- src/ygtktimezonepicker.c | 2 +- src/ygtktreeview.c | 2 +- src/ygtkwindow.c | 2 +- src/ygtkwizard.c | 2 +- 40 files changed, 263 insertions(+), 238 deletions(-) diff --git a/src/Y2CCGtk.cc b/src/Y2CCGtk.cc index 1e72faad..1d3eac3d 100644 --- a/src/Y2CCGtk.cc +++ b/src/Y2CCGtk.cc @@ -2,7 +2,7 @@ * YaST2-GTK - http://en.opensuse.org/YaST2-GTK * ********************************************************************/ -#include + #include #include diff --git a/src/YGBarGraph.cc b/src/YGBarGraph.cc index aa30c1ae..d0fc14d9 100644 --- a/src/YGBarGraph.cc +++ b/src/YGBarGraph.cc @@ -2,7 +2,7 @@ * YaST2-GTK - http://en.opensuse.org/YaST2-GTK * ********************************************************************/ -#include + #include "YGUI.h" #include "YGWidget.h" #include "ygtkbargraph.h" diff --git a/src/YGComboBox.cc b/src/YGComboBox.cc index 72c6995c..53d86f86 100644 --- a/src/YGComboBox.cc +++ b/src/YGComboBox.cc @@ -3,7 +3,7 @@ ********************************************************************/ #define YUILogComponent "gtk" -#include + #include #include "YGUtils.h" #include "YComboBox.h" diff --git a/src/YGDialog.cc b/src/YGDialog.cc index b1cf2625..b9a06486 100644 --- a/src/YGDialog.cc +++ b/src/YGDialog.cc @@ -3,7 +3,7 @@ ********************************************************************/ #define YUILogComponent "gtk" -#include + #include "YGUI.h" #include "YGDialog.h" #include "YGUtils.h" @@ -14,6 +14,7 @@ #include #include "ygtkwindow.h" #include "YGMacros.h" +#include /* In the main dialog case, it doesn't necessarly have a window of its own. If @@ -49,105 +50,97 @@ class YGWindow YGWindowCloseFn m_canClose; void *m_canCloseData; - YGWindow (bool _main_window, YGDialog *ydialog) - { - m_widget = ygtk_window_new(); - -# if GTK_CHECK_VERSION (3, 12, 0) -# else - gtk_container_set_resize_mode (GTK_CONTAINER (m_widget), GTK_RESIZE_PARENT); -# endif - - g_object_ref_sink (G_OBJECT (m_widget)); - -# if GTK_CHECK_VERSION (3, 14, 0) -# else - gtk_window_set_has_resize_grip (GTK_WINDOW (m_widget), TRUE); -# endif - - m_refcount = 0; - m_child = NULL; - m_canClose = NULL; - m_busyCursor = NULL; - m_isBusy = false; - - { - std::stack &stack = YDialog::_dialogStack; - YDialog *ylast = stack.size() ? stack.top() : 0; - if (ylast == ydialog) { - if (stack.size() > 1) { - YDialog *t = ylast; - stack.pop(); - ylast = stack.top(); - stack.push (t); - } - else - ylast = NULL; - } - - GtkWindow *parent = NULL; - if (ylast) { - YGDialog *yglast = static_cast (ylast); - parent = GTK_WINDOW (yglast->m_window->getWidget()); - } - GtkWindow *window = GTK_WINDOW (m_widget); - // to be back compatible - std::string dialogTitle = "YaSt"; - -#ifdef LIBYUI_VERSION_NUM - #if LIBYUI_VERSION_AT_LEAST(2,42,3) - dialogTitle = YUI::app()->applicationTitle(); - #endif -#endif - if (parent) { - // if there is a parent, this would be a dialog - gtk_window_set_title (window, dialogTitle.c_str()); - gtk_window_set_modal (window, TRUE); - gtk_window_set_transient_for (window, parent); - gtk_window_set_type_hint (window, GDK_WINDOW_TYPE_HINT_DIALOG); - AtkObject *peer = gtk_widget_get_accessible (GTK_WIDGET (window)); - if (peer != NULL) - atk_object_set_role (peer, ATK_ROLE_DIALOG); - } - else { - gtk_window_set_title (window, dialogTitle.c_str()); -#ifdef LIBYUI_VERSION_NUM - #if LIBYUI_VERSION_AT_LEAST(2,42,3) - GdkPixbuf *pixbuf = YGUtils::loadPixbuf (YUI::app()->applicationIcon()); - if (pixbuf) { // default window icon - gtk_window_set_default_icon (pixbuf); - g_object_unref (G_OBJECT (pixbuf)); - } - #endif -#endif - if (YGUI::ui()->unsetBorder()) - gtk_window_set_decorated (window, FALSE); - } - - if (_main_window) { - int width = YUI::app()->defaultWidth(); - int height = YUI::app()->defaultHeight(); - gtk_window_set_default_size ( window, width, height ); - gtk_window_resize( window, width, height ); - if (YGUI::ui()->setFullscreen()) - gtk_window_fullscreen (window); - } - gtk_window_set_role (window, "yast2"); - } + YGWindow (bool _main_window, YGDialog *ydialog) + { + m_widget = ygtk_window_new(); + + g_object_ref_sink (G_OBJECT (m_widget)); + + m_refcount = 0; + m_child = NULL; + m_canClose = NULL; + m_busyCursor = NULL; + m_isBusy = false; + + { + std::stack &stack = YDialog::_dialogStack; + YDialog *ylast = stack.size() ? stack.top() : 0; + if (ylast == ydialog) { + if (stack.size() > 1) { + YDialog *t = ylast; + stack.pop(); + ylast = stack.top(); + stack.push (t); + } + else + ylast = NULL; + } + + GtkWindow *parent = NULL; + if (ylast) { + YGDialog *yglast = static_cast (ylast); + parent = GTK_WINDOW (yglast->m_window->getWidget()); + } + GtkWindow *window = GTK_WINDOW (m_widget); + std::string dialogTitle = YUI::app()->applicationTitle(); + gtk_window_set_title (window, dialogTitle.c_str()); + + if (parent) { + // if there is a parent, this would be a dialog + gtk_window_set_modal (window, TRUE); + gtk_window_set_transient_for (window, parent); + gtk_window_set_type_hint (window, GDK_WINDOW_TYPE_HINT_DIALOG); + AtkObject *peer = gtk_widget_get_accessible (GTK_WIDGET (window)); + if (peer != NULL) + atk_object_set_role (peer, ATK_ROLE_DIALOG); + } + else { + // if extension is present we consider a full path name, theme icons don't have extensions + std::string icon = YUI::app()->applicationIcon(); + if (boost::filesystem::path(icon).has_extension()) + { + GError *err = 0; + if (!gtk_window_set_icon_from_file (window, icon.c_str(), &err)) + { + yuiWarning() << "Could not load icon: " << icon << "\n" + "Reason: " << err->message << "\n"; + } + } + else + { + gtk_window_set_icon_name (window, icon.c_str()); + } + + if (YGUI::ui()->unsetBorder()) + gtk_window_set_decorated (window, FALSE); + } + + if (_main_window) { + int width = YUI::app()->defaultWidth(); + int height = YUI::app()->defaultHeight(); + gtk_window_set_default_size ( window, width, height ); + gtk_window_resize( window, width, height ); + if (YGUI::ui()->setFullscreen()) + gtk_window_fullscreen (window); + } + // https://developer.gnome.org/gtk3/stable/GtkWindow.html#gtk-window-set-role + // If a window already has a unique title, you don’t need to set the role, since the WM can use the title to identify the window when restoring the session. + // gtk_window_set_role (window, "yast2"); + } - if (_main_window) - main_window = this; - - g_signal_connect (G_OBJECT (m_widget), "delete-event", - G_CALLBACK (close_window_cb), this); - g_signal_connect_after (G_OBJECT (m_widget), "key-press-event", - G_CALLBACK (key_pressed_cb), this); - g_signal_connect (G_OBJECT (m_widget), "focus-in-event", - G_CALLBACK (focus_in_event_cb), this); - // set busy cursor at start - g_signal_connect_after (G_OBJECT (m_widget), "realize", - G_CALLBACK (realize_cb), this); - } + if (_main_window) + main_window = this; + + g_signal_connect (G_OBJECT (m_widget), "delete-event", + G_CALLBACK (close_window_cb), this); + g_signal_connect_after (G_OBJECT (m_widget), "key-press-event", + G_CALLBACK (key_pressed_cb), this); + g_signal_connect (G_OBJECT (m_widget), "focus-in-event", + G_CALLBACK (focus_in_event_cb), this); + // set busy cursor at start + g_signal_connect_after (G_OBJECT (m_widget), "realize", + G_CALLBACK (realize_cb), this); + } ~YGWindow() { @@ -543,12 +536,22 @@ void ygdialog_setTitle (const gchar *title, gboolean sticky) void YGDialog::setIcon (const std::string &icon) { - GtkWindow *window = GTK_WINDOW (m_window->getWidget()); - GdkPixbuf *pixbuf = YGUtils::loadPixbuf (icon); - if (pixbuf) { - gtk_window_set_icon (window, pixbuf); - g_object_unref (G_OBJECT (pixbuf)); - } + GtkWindow *window = GTK_WINDOW (m_window->getWidget()); + + // if extension is present we consider a full path name, theme icons don't have extensions + if (boost::filesystem::path(icon).has_extension()) + { + GError *err = 0; + if (!gtk_window_set_icon_from_file (window, icon.c_str(), &err)) + { + yuiWarning() << "Could not load icon: " << icon << "\n" + "Reason: " << err->message << "\n"; + } + } + else + { + gtk_window_set_icon_name (window, icon.c_str()); + } } typedef bool (*FindWidgetsCb) (YWidget *widget, void *data) ; diff --git a/src/YGDumbTab.cc b/src/YGDumbTab.cc index cf56698d..ef892d26 100644 --- a/src/YGDumbTab.cc +++ b/src/YGDumbTab.cc @@ -3,7 +3,7 @@ ********************************************************************/ #define YUILogComponent "gtk" -#include + #include "YGUI.h" #include "YGWidget.h" #include "YGUtils.h" @@ -52,8 +52,7 @@ class YGDumbTab : public YDumbTab, public YGWidget label = gtk_label_new (YGUtils::mapKBAccel (item->label()).c_str()); gtk_label_set_use_underline (GTK_LABEL (label), TRUE); if (item->hasIconName()) { - std::string path = iconFullPath (item->iconName()); - GdkPixbuf *pixbuf = YGUtils::loadPixbuf (path); + GdkPixbuf *pixbuf = YGUtils::loadPixbuf (item->iconName()); if (pixbuf) { image = gtk_image_new_from_pixbuf (pixbuf); g_object_unref (G_OBJECT (pixbuf)); diff --git a/src/YGFrame.cc b/src/YGFrame.cc index eb91fcc1..55b41086 100644 --- a/src/YGFrame.cc +++ b/src/YGFrame.cc @@ -3,7 +3,7 @@ ********************************************************************/ #define YUILogComponent "gtk" -#include + #include "YGUI.h" #include "YGWidget.h" #include "YGUtils.h" diff --git a/src/YGImage.cc b/src/YGImage.cc index 2376ba85..7f4b0afa 100644 --- a/src/YGImage.cc +++ b/src/YGImage.cc @@ -3,7 +3,7 @@ ********************************************************************/ #define YUILogComponent "gtk" -#include + #include "ygdkmngloader.h" #include "YGUI.h" #include "YGWidget.h" diff --git a/src/YGInputField.cc b/src/YGInputField.cc index fb14db4d..5ce665b5 100644 --- a/src/YGInputField.cc +++ b/src/YGInputField.cc @@ -3,7 +3,7 @@ ********************************************************************/ #define YUILogComponent "gtk" -#include + #include "YGUI.h" #include "YGWidget.h" #include "YGUtils.h" diff --git a/src/YGLayout.cc b/src/YGLayout.cc index 076ad8ea..9c012205 100644 --- a/src/YGLayout.cc +++ b/src/YGLayout.cc @@ -3,7 +3,7 @@ ********************************************************************/ #define YUILogComponent "gtk" -#include + #include "YGWidget.h" #include "YGUtils.h" diff --git a/src/YGMenuBar.cc b/src/YGMenuBar.cc index 39f2e140..7ad6c97a 100644 --- a/src/YGMenuBar.cc +++ b/src/YGMenuBar.cc @@ -152,26 +152,9 @@ void YGMenuBar::doCreateMenu (GtkWidget *menu, YItemIterator begin, YItemIterato std::string action_name = YGUtils::mapKBAccel (yitem->label()); if (yitem->hasIconName()) { + // if extension is present we consider a full path name, theme icons don't have extensions - GtkWidget *icon; - if (boost::filesystem::path(yitem->iconName()).has_extension()) - { - icon = gtk_image_new_from_file(yitem->iconName().c_str()); - } - else - { - GtkIconTheme * theme = gtk_icon_theme_get_default(); - std::string ico = boost::filesystem::path(yitem->iconName()).stem().c_str(); - if (gtk_icon_theme_has_icon (theme, ico.c_str())) - { - icon = gtk_image_new_from_icon_name (ico.c_str(), GTK_ICON_SIZE_MENU); - } - else - { - // last chance, just to add an icon - icon = gtk_image_new_from_file(yitem->iconName().c_str()); - } - } + GtkWidget *icon = YGUI::ui()->loadIcon(yitem->iconName()); GtkWidget *box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6); GtkWidget *label = gtk_label_new (action_name.c_str()); diff --git a/src/YGMenuButton.cc b/src/YGMenuButton.cc index 719544e7..450aba8e 100644 --- a/src/YGMenuButton.cc +++ b/src/YGMenuButton.cc @@ -3,7 +3,7 @@ ********************************************************************/ #define YUILogComponent "gtk" -#include + #include "YGUI.h" #include "YGUtils.h" #include "YGWidget.h" diff --git a/src/YGProgressBar.cc b/src/YGProgressBar.cc index 8c1a25ae..3ed3d567 100644 --- a/src/YGProgressBar.cc +++ b/src/YGProgressBar.cc @@ -7,7 +7,7 @@ */ #define YUILogComponent "gtk" -#include + #include "YGUI.h" #include "YGWidget.h" #include "YGi18n.h" diff --git a/src/YGPushButton.cc b/src/YGPushButton.cc index 3217b61a..9927b905 100644 --- a/src/YGPushButton.cc +++ b/src/YGPushButton.cc @@ -3,7 +3,7 @@ ********************************************************************/ #define YUILogComponent "gtk" -#include + #include "YGUI.h" #include #include "YGUtils.h" @@ -89,51 +89,27 @@ bool m_customIcon, m_labelIcon; setStockIcon (label()); } - virtual void setIcon (const std::string &icon) - { - GtkButton *button = GTK_BUTTON (getWidget()); - if (icon.empty()) { - m_customIcon = false; - // no need to worry about freeing the image, let it live with button - GtkWidget *image = gtk_button_get_image (button); - if (image) - gtk_widget_hide (image); - } - else { - m_customIcon = true; - std::string path (icon); - if (path[0] != '/') - path = std::string (THEMEDIR) + "/" + path; - - char *p = strdup(path.c_str()); - char *p1 = strdup(path.c_str()); - char *dname = dirname(p); - char *fname = basename(p1); - char *name = strtok (fname, "."); - GtkIconTheme * theme = gtk_icon_theme_get_default (); - gtk_icon_theme_add_resource_path (theme, dname); - gtk_icon_theme_prepend_search_path (theme, dname); - gtk_icon_theme_rescan_if_needed (theme); - GError *error = 0; - GdkPixbuf *pixbuf = gtk_icon_theme_load_icon (theme, - name, // icon name - 16, // icon size (default button size) - GTK_ICON_LOOKUP_FORCE_SIZE, // flags - &error); - free (p); - free (p1); - if (pixbuf) { - GtkWidget *image = gtk_image_new_from_pixbuf (pixbuf); - gtk_button_set_image (button, image); - // disregard gtk-button-images setting for explicitly set icons - gtk_button_set_always_show_image (button, TRUE); - g_object_unref (G_OBJECT (pixbuf)); - } - else - yuiWarning() << "YGPushButton: Couldn't load icon image: " << path << std::endl - << "Reason: " << error->message << std::endl; - } - } + virtual void setIcon (const std::string &icon) + { + GtkButton *button = GTK_BUTTON (getWidget()); + if (icon.empty()) { + m_customIcon = false; + // no need to worry about freeing the image, let it live with button + GtkWidget *image = gtk_button_get_image (button); + if (image) + gtk_widget_hide (image); + } + else { + + GtkWidget *image = YGUI::ui()->loadIcon(icon); + if (image) { + gtk_button_set_image (button, image); + gtk_button_set_always_show_image (button, TRUE); + } + else + yuiWarning() << "YGPushButton: Couldn't load icon image: " << icon << std::endl; + } + } virtual void setDefaultButton (bool isDefault) { diff --git a/src/YGRadioButton.cc b/src/YGRadioButton.cc index 80fc069d..de7f411d 100644 --- a/src/YGRadioButton.cc +++ b/src/YGRadioButton.cc @@ -3,7 +3,7 @@ ********************************************************************/ #define YUILogComponent "gtk" -#include + #include "YGUI.h" #include "YGUtils.h" #include "YGWidget.h" diff --git a/src/YGSelectionStore.cc b/src/YGSelectionStore.cc index 06f3f63d..8242f2f7 100644 --- a/src/YGSelectionStore.cc +++ b/src/YGSelectionStore.cc @@ -3,12 +3,13 @@ ********************************************************************/ #define YUILogComponent "gtk" -#include + #include #include #include #include "YGUtils.h" #include "YGSelectionStore.h" +#include "YGUI.h" static inline int getYItemCol (GtkTreeModel *model) { return gtk_tree_model_get_n_columns (model) - 2; } @@ -58,18 +59,17 @@ void YGSelectionStore::addRow (YItem *item, GtkTreeIter *iter, GtkTreeIter *pare void YGSelectionStore::setRowText (GtkTreeIter *iter, int iconCol, const std::string &icon, int labelCol, const std::string &label, const YSelectionWidget *widget) { - GdkPixbuf *pixbuf = 0; - if (!icon.empty()) { - std::string path (widget->iconFullPath (icon)); - pixbuf = YGUtils::loadPixbuf (path); - } - - if (isTree) - gtk_tree_store_set (getTreeStore(), iter, iconCol, pixbuf, - labelCol, label.c_str(), -1); - else - gtk_list_store_set (getListStore(), iter, iconCol, pixbuf, - labelCol, label.c_str(), -1); + GdkPixbuf *pixbuf = 0; + if (!icon.empty()) { + pixbuf = YGUtils::loadPixbuf (icon); + } + + if (isTree) + gtk_tree_store_set (getTreeStore(), iter, iconCol, pixbuf, + labelCol, label.c_str(), -1); + else + gtk_list_store_set (getListStore(), iter, iconCol, pixbuf, + labelCol, label.c_str(), -1); } void YGSelectionStore::setRowMark (GtkTreeIter *iter, int markCol, bool mark) diff --git a/src/YGText.cc b/src/YGText.cc index 4a5a9581..33febea3 100644 --- a/src/YGText.cc +++ b/src/YGText.cc @@ -3,7 +3,7 @@ ********************************************************************/ #define YUILogComponent "gtk" -#include + #include "YGUI.h" #include #include "YGUtils.h" diff --git a/src/YGTreeView.cc b/src/YGTreeView.cc index 6540812d..44d1c2a2 100644 --- a/src/YGTreeView.cc +++ b/src/YGTreeView.cc @@ -7,7 +7,7 @@ #include "YGi18n.h" #define YUILogComponent "gtk" -#include + #include "YGUI.h" #include "YGUtils.h" #include "YGWidget.h" diff --git a/src/YGUI.cc b/src/YGUI.cc index bcfc0cbb..42a7ecb9 100644 --- a/src/YGUI.cc +++ b/src/YGUI.cc @@ -18,6 +18,7 @@ #include "YGUtils.h" #include "YGDialog.h" #include +#include static std::string askForFileOrDirectory (GtkFileChooserAction action, const std::string &path, const std::string &filter, const std::string &title); @@ -189,11 +190,33 @@ void YGUI::checkInit() g_object_unref (provider); - GdkPixbuf *pixbuf = YGUtils::loadPixbuf (THEMEDIR "/icons/32x32/apps/yast.png"); - if (pixbuf) { // default window icon - gtk_window_set_default_icon (pixbuf); - g_object_unref (G_OBJECT (pixbuf)); - } +} + + +GtkWidget* YGUI::loadIcon( const std::string & iconName ) const +{ + // if extension is present we consider a full path name, theme icons don't have extensions + GtkWidget *icon = NULL; + if (boost::filesystem::path(iconName).has_extension()) + { + icon = gtk_image_new_from_file(iconName.c_str()); + } + else + { + GtkIconTheme * theme = gtk_icon_theme_get_default(); + std::string ico = boost::filesystem::path(iconName).stem().c_str(); + if (gtk_icon_theme_has_icon (theme, ico.c_str())) + { + icon = gtk_image_new_from_icon_name (ico.c_str(), GTK_ICON_SIZE_MENU); + } + else + { + // last chance, just to add an icon + icon = gtk_image_new_from_file(iconName.c_str()); + } + } + + return icon; } static gboolean ycp_wakeup_fn (GIOChannel *source, GIOCondition condition, @@ -376,11 +399,8 @@ void YGUI::askSaveLogs() //** YGApplication -#define ICONDIR THEMEDIR "/icons/22x22/apps/" - YGApplication::YGApplication() { - setIconBasePath (ICONDIR); } void YGApplication::makeScreenShot (const std::string &_filename) diff --git a/src/YGUI.h b/src/YGUI.h index e22da1f9..491583be 100644 --- a/src/YGUI.h +++ b/src/YGUI.h @@ -5,7 +5,7 @@ #ifndef YGUI_H #define YGUI_H -#include + #include #define YUILogComponent "gtk" #include @@ -25,6 +25,17 @@ class YGUI: public YUI static YGUI *ui() { return (YGUI *) YUI::ui(); } + /** + * Load an icon. This tries several locations: + * + * - The given pathname + * - The icon theme from the current desktop + * - The default icon if failing others + * + * If the icon does not have a filename extension it is retrieved by name from theme. + **/ + GtkWidget* loadIcon( const std::string & iconName ) const; + protected: virtual YWidgetFactory *createWidgetFactory(); virtual YOptionalWidgetFactory *createOptionalWidgetFactory(); diff --git a/src/YGUtils.cc b/src/YGUtils.cc index 2bc3623c..7b35ffd8 100644 --- a/src/YGUtils.cc +++ b/src/YGUtils.cc @@ -6,11 +6,12 @@ */ #define YUILogComponent "gtk" -#include + #include #include "YGUtils.h" #include "YGUI.h" #include "YGi18n.h" +#include static inline void skipSpace (const char *instr, int *i) { while (g_ascii_isspace (instr[*i])) (*i)++; } @@ -533,17 +534,38 @@ void YGUtils::setPaneRelPosition (GtkWidget *paned, gdouble rel) void ygutils_setPaneRelPosition (GtkWidget *paned, gdouble rel) { YGUtils::setPaneRelPosition (paned, rel); } + GdkPixbuf *YGUtils::loadPixbuf (const std::string &filename) { - GdkPixbuf *pixbuf = NULL; - if (!filename.empty()) { - GError *error = 0; - pixbuf = gdk_pixbuf_new_from_file (filename.c_str(), &error); - if (!pixbuf) - yuiWarning() << "Could not load icon: " << filename << "\n" - "Reason: " << error->message << "\n"; - } - return pixbuf; + GdkPixbuf *pixbuf = NULL; + if (!filename.empty()) + { + GtkIconTheme *icon_theme = gtk_icon_theme_get_default (); + if (!boost::filesystem::path(filename).has_extension() + && gtk_icon_theme_has_icon(icon_theme, filename.c_str())) + { + pixbuf = gtk_icon_theme_load_icon (icon_theme, + filename.c_str(), + 16, // icon size + GTK_ICON_LOOKUP_FORCE_SVG, // flags + NULL); + + } + else + { + GError *error = 0; + pixbuf = gdk_pixbuf_new_from_file (filename.c_str(), &error); + if (!pixbuf) + { + yuiWarning() << "Could not load icon: " << filename << "\n" + "Reason: " << error->message << "\n"; + g_warning ("Couldn’t load icon: %s", error->message); + g_error_free (error); + } + } + } + + return pixbuf; } // Code from Banshee: shades a pixbuf a bit, used e.g. for hover effects diff --git a/src/YGUtils.h b/src/YGUtils.h index bd4d97b0..dd2fdee9 100644 --- a/src/YGUtils.h +++ b/src/YGUtils.h @@ -46,8 +46,19 @@ namespace YGUtils /* Instead of setting GtkPaned::position in pixels, do so in percents. */ void setPaneRelPosition (GtkWidget *paned, gdouble rel); - /* Saves some code and standardizes the error. Returns NULL if failed. - Don't forget to g_object_unref it! */ + /* + * + * Load a pixbuf. This tries several locations: + * + * - The given pathname + * - The icon theme from the current desktop + * - The default icon if failing others + * + * If the icon does not have a filename extension it is retrieved by name from theme. + * Returns NULL if failed. + * + * Pixbuf need to to g_object_unref it to be removed. + */ GdkPixbuf *loadPixbuf (const std::string &fileneme); /* Shifts colors in a GdkPixbuf. */ diff --git a/src/YGWidget.cc b/src/YGWidget.cc index 29d9ae8a..9caffc74 100644 --- a/src/YGWidget.cc +++ b/src/YGWidget.cc @@ -3,7 +3,7 @@ ********************************************************************/ #define YUILogComponent "gtk" -#include + #include #include "YGWidget.h" #include "YGUtils.h" diff --git a/src/YGWizard.cc b/src/YGWizard.cc index 5ed5f7ed..a3f0ad08 100644 --- a/src/YGWizard.cc +++ b/src/YGWizard.cc @@ -3,7 +3,7 @@ ********************************************************************/ #define YUILogComponent "gtk" -#include + #include "YGUI.h" #include "YGWidget.h" #include "YGUtils.h" diff --git a/src/dummy.cc b/src/dummy.cc index aca55dab..c7b51fa5 100644 --- a/src/dummy.cc +++ b/src/dummy.cc @@ -2,7 +2,7 @@ * YaST2-GTK - http://en.opensuse.org/YaST2-GTK * ********************************************************************/ -#include + #include int main (int argc, char **argv) diff --git a/src/test.cc b/src/test.cc index f274f9af..a58efdbc 100644 --- a/src/test.cc +++ b/src/test.cc @@ -3,7 +3,7 @@ ********************************************************************/ #define YUILogComponent "gtk" -#include + #include #include #include diff --git a/src/ygtkbargraph.c b/src/ygtkbargraph.c index f087e620..fc132cc5 100644 --- a/src/ygtkbargraph.c +++ b/src/ygtkbargraph.c @@ -5,7 +5,7 @@ /* YGtkBarGraph widget */ // check the header file for information about this widget -#include + #include "ygtkratiobox.h" #include "ygtkbargraph.h" #include diff --git a/src/ygtkfieldentry.c b/src/ygtkfieldentry.c index 5c6922d5..241328c1 100644 --- a/src/ygtkfieldentry.c +++ b/src/ygtkfieldentry.c @@ -5,7 +5,7 @@ /* YGtkFieldEntry widget */ // check the header file for information about this widget -#include + #include "ygtkfieldentry.h" #include #include diff --git a/src/ygtkfixed.c b/src/ygtkfixed.c index 36d619a7..e4c40955 100644 --- a/src/ygtkfixed.c +++ b/src/ygtkfixed.c @@ -5,7 +5,7 @@ /* YGtkFixed container */ // check the header file for information about this container -#include + #include #include #include "ygtkfixed.h" diff --git a/src/ygtkhtmlwrap.c b/src/ygtkhtmlwrap.c index 8199e770..b6961294 100644 --- a/src/ygtkhtmlwrap.c +++ b/src/ygtkhtmlwrap.c @@ -5,7 +5,7 @@ /* YGtkHtmlWrap widget */ // check the header file for information about this widget -#include + #include #include #include "ygtkhtmlwrap.h" diff --git a/src/ygtkimage.c b/src/ygtkimage.c index b5c74998..f850536c 100644 --- a/src/ygtkimage.c +++ b/src/ygtkimage.c @@ -5,7 +5,7 @@ /* YGtkImage widget */ // check the header file for information about this widget -#include + #include "ygdkmngloader.h" #include "ygtkimage.h" #include diff --git a/src/ygtklinklabel.c b/src/ygtklinklabel.c index fcabea28..e335561d 100644 --- a/src/ygtklinklabel.c +++ b/src/ygtklinklabel.c @@ -5,7 +5,7 @@ /* YGtkLinkLabel container */ // check the header file for information about this container -#include + #include #include #include "ygtklinklabel.h" diff --git a/src/ygtkmenubutton.c b/src/ygtkmenubutton.c index b7b72e95..a0a772d8 100644 --- a/src/ygtkmenubutton.c +++ b/src/ygtkmenubutton.c @@ -5,7 +5,7 @@ /* YGtkMenuButton widget */ // check the header file for information about this widget -#include + #include "ygtkmenubutton.h" #include #include diff --git a/src/ygtkratiobox.c b/src/ygtkratiobox.c index 0b9010f9..43b827e2 100644 --- a/src/ygtkratiobox.c +++ b/src/ygtkratiobox.c @@ -5,7 +5,7 @@ /* YGtkRatioBox container */ // check the header file for information about this container -#include + #include #include "ygtkratiobox.h" diff --git a/src/ygtkrichtext.c b/src/ygtkrichtext.c index 2b68050a..ec010efc 100644 --- a/src/ygtkrichtext.c +++ b/src/ygtkrichtext.c @@ -5,7 +5,7 @@ /* YGtkRichText widget */ // check the header file for information about this widget -#include + #include "ygtkrichtext.h" #include #include diff --git a/src/ygtksteps.c b/src/ygtksteps.c index 9c6357db..a2530f00 100644 --- a/src/ygtksteps.c +++ b/src/ygtksteps.c @@ -9,7 +9,7 @@ Textdomain "gtk" */ -#include + #include "ygtksteps.h" #include #define YGI18N_C diff --git a/src/ygtktextview.c b/src/ygtktextview.c index ffb5f6ee..0d624943 100644 --- a/src/ygtktextview.c +++ b/src/ygtktextview.c @@ -5,7 +5,7 @@ /* YGtkTextView widget */ // check the header file for information about this widget -#include + #include "ygtktextview.h" #include diff --git a/src/ygtktimezonepicker.c b/src/ygtktimezonepicker.c index 1d51813c..7d963f4b 100644 --- a/src/ygtktimezonepicker.c +++ b/src/ygtktimezonepicker.c @@ -5,7 +5,7 @@ /* YGtkTimeZonePicker widget */ // check the header file for information about this widget -#include + #include "ygtktimezonepicker.h" #include #include diff --git a/src/ygtktreeview.c b/src/ygtktreeview.c index c04cfd2e..5c0d83f6 100644 --- a/src/ygtktreeview.c +++ b/src/ygtktreeview.c @@ -8,7 +8,7 @@ Textdomain "gtk" */ -#include + #include "ygtktreeview.h" #include #define YGI18N_C diff --git a/src/ygtkwindow.c b/src/ygtkwindow.c index 5807768c..5c7d740b 100644 --- a/src/ygtkwindow.c +++ b/src/ygtkwindow.c @@ -5,7 +5,7 @@ /* YGtkWindow widget */ // check the header file for information about this widget -#include + #include "ygtkwindow.h" #include diff --git a/src/ygtkwizard.c b/src/ygtkwizard.c index e687ab6f..74428248 100644 --- a/src/ygtkwizard.c +++ b/src/ygtkwizard.c @@ -9,7 +9,7 @@ Textdomain "gtk" */ -#include + #include "ygtkwizard.h" #include #include From e96817756aba2893e5e3d18addba4fd3cbf844bb Mon Sep 17 00:00:00 2001 From: Angelo Naselli Date: Sun, 2 May 2021 20:01:34 +0200 Subject: [PATCH 13/18] Added back libyui-gtk.pc --- CMakeLists.txt | 5 +++ PROJECTINFO.cmake | 17 ---------- SOURCECONF.cmake | 68 -------------------------------------- pkgconfig/CMakeLists.txt | 35 ++++++++++++++++++++ pkgconfig/libyui-gtk.pc.in | 20 +++++++++++ 5 files changed, 60 insertions(+), 85 deletions(-) delete mode 100644 PROJECTINFO.cmake delete mode 100644 SOURCECONF.cmake create mode 100644 pkgconfig/CMakeLists.txt create mode 100644 pkgconfig/libyui-gtk.pc.in diff --git a/CMakeLists.txt b/CMakeLists.txt index 7b56dd08..3afe707d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -23,6 +23,7 @@ project( libyui-gtk ) # cmake -DBUILD_DOC=on -DBUILD_EXAMPLES=off .. option( BUILD_SRC "Build in src/ subdirectory" on ) +option( BUILD_PKGCONFIG "Build pkg-config support files" on ) option( BUILD_DOC "Build class documentation" off ) option( WERROR "Treat all compiler warnings as errors" off ) @@ -53,6 +54,10 @@ if ( BUILD_SRC ) add_subdirectory( src ) endif() +if ( BUILD_PKGCONFIG ) + add_subdirectory( pkgconfig ) +endif() + # TODO #if ( BUILD_DOC ) # add_subdirectory( doc ) diff --git a/PROJECTINFO.cmake b/PROJECTINFO.cmake deleted file mode 100644 index d034b0cf..00000000 --- a/PROJECTINFO.cmake +++ /dev/null @@ -1,17 +0,0 @@ -##### PROJECTINFO for CMake - -SET( BASELIB "yui" ) # don't change this - -##### MAKE ALL NEEDED CHANGES HERE ##### - -SET( SUBDIRS src ) -SET( PLUGINNAME "gtk" ) -SET( LIB_DEPS GTK3 ) -SET( INTERNAL_DEPS Libyui ) -SET( LIB_LINKER boost_system boost_filesystem ) # define the libs to link against with their -l name for separated with spaces, e.g. pthread dl... -SET( EXTRA_INCLUDES ) -SET( PROGSUBDIR "" ) -SET( URL "http://github.com/libyui/" ) -SET( SUMMARY "Libyui - Gtk User Interface" ) -SET( DESCRIPTION "This package contains the Gtk user interface\ncomponent for libYUI.\n" ) - diff --git a/SOURCECONF.cmake b/SOURCECONF.cmake deleted file mode 100644 index d932ed35..00000000 --- a/SOURCECONF.cmake +++ /dev/null @@ -1,68 +0,0 @@ -SET( ${TARGETLIB}_SOURCES - YGBarGraph.cc - YGComboBox.cc - YGDialog.cc - ygdkmngloader.c - YGDumbTab.cc - YGFrame.cc - YGImage.cc - YGInputField.cc - YGIntField.cc - YGLabel.cc - YGLayout.cc - YGMenuBar.cc - YGMenuButton.cc - YGPackageSelectorPluginStub.cc - YGProgressBar.cc - YGPushButton.cc - YGRadioButton.cc - YGSelectionStore.cc - YGText.cc - ygtkbargraph.c - ygtkfieldentry.c - ygtkfixed.c - ygtkhtmlwrap.c - ygtkimage.c - ygtklinklabel.c - ygtkmenubutton.c - ygtkratiobox.c - ygtkrichtext.c - ygtksteps.c - ygtktextview.c - ygtktimezonepicker.c - ygtktreeview.c - ygtkwindow.c - ygtkwizard.c - YGTreeView.cc - YGUI.cc - YGUtils.cc - YGWidget.cc - YGWizard.cc -) - -SET( ${TARGETLIB}_HEADERS - YGDialog.h - YGMenuBar.h - ygdkmngloader.h - YGi18n.h - YGPackageSelectorPluginIf.h - YGSelectionStore.h - ygtkbargraph.h - ygtkfieldentry.h - ygtkfixed.h - ygtkhtmlwrap.h - ygtkimage.h - ygtklinklabel.h - ygtkmenubutton.h - ygtkratiobox.h - ygtkrichtext.h - ygtksteps.h - ygtktextview.h - ygtktimezonepicker.h - ygtktreeview.h - ygtkwindow.h - ygtkwizard.h - YGUI.h - YGUtils.h - YGWidget.h -) diff --git a/pkgconfig/CMakeLists.txt b/pkgconfig/CMakeLists.txt new file mode 100644 index 00000000..ced6a9fb --- /dev/null +++ b/pkgconfig/CMakeLists.txt @@ -0,0 +1,35 @@ +# CMakeLists.txt for libyui-mga/pkgconfig +# +# Support for pkg-config: +# +# Generate a libyui.pc file from libyui.pc.in and install it to +# /usr/lib64/pkgconfig. +# +# A .pc file specifies how to use a development package, in particular linker +# flags (-lyui-gtk), compiler flags (including include directories) and paths. +# See man pkg-config. +# +# Notice that libyui-mga linking is needed for libyui-mga-* plugins + +include( ../VERSION.cmake ) +include( GNUInstallDirs ) # set CMAKE_INSTALL_LIBDIR + +FIND_PACKAGE(PkgConfig REQUIRED) + +PKG_CHECK_MODULES(YUI REQUIRED libyui) +pkg_get_variable(YUI_SO_VERSION libyui soversion) +pkg_get_variable(YUI_SO_MAJOR libyui soversion_major) +#pkg_get_variable(YUI_SO_MINOR libyui soversion_minor) +#pkg_get_variable(YUI_SO_PATCH libyui soversion_patch) + +##### This is needed to be set for the libyui core +SET( SONAME_MAJOR ${YUI_SO_MAJOR} ) +SET( SONAME ${YUI_SO_VERSION} ) + +set( PKGCONFIG_INSTALL_DIR ${DESTDIR}${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}/pkgconfig ) + +# Generate libyui.pc where some CMake variables are expanded from libyui.pc.in, +# but only expand @VARIABLE@, not ${VARIABLE} +configure_file( libyui-gtk.pc.in libyui-gtk.pc @ONLY ) + +install( FILES ${CMAKE_CURRENT_BINARY_DIR}/libyui-gtk.pc DESTINATION ${PKGCONFIG_INSTALL_DIR} ) diff --git a/pkgconfig/libyui-gtk.pc.in b/pkgconfig/libyui-gtk.pc.in new file mode 100644 index 00000000..57781e9a --- /dev/null +++ b/pkgconfig/libyui-gtk.pc.in @@ -0,0 +1,20 @@ +# +# Pkg-Config file for libyui-gtk +# +# Generated by CMake from libyui-gtk.pc.in +# + +prefix=@CMAKE_INSTALL_PREFIX@ +exec_prefix=${prefix} + +datarootdir=${exec_prefix}/share +datadir=${datarootdir}/libyui +libdir=${exec_prefix}/@CMAKE_INSTALL_LIBDIR@ +includedir=${exec_prefix}/include + +Name: libyui-gtk +Version: @VERSION@ +Description: libyui-gtk - Gtk plugin for libyui GUI-abstraction library +Libs: -L${libdir} -lyui-gtk +Libs.private: -ldl -lpthread +Cflags: -I${includedir}/yui/gtk -I${includedir}/yui -I${includedir} From b4f7e177c8cbe2400ebd374a5ba538e246c04f71 Mon Sep 17 00:00:00 2001 From: Angelo Naselli Date: Mon, 3 May 2021 22:10:02 +0200 Subject: [PATCH 14/18] Right linkdir --- pkgconfig/libyui-gtk.pc.in | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pkgconfig/libyui-gtk.pc.in b/pkgconfig/libyui-gtk.pc.in index 57781e9a..845f1d55 100644 --- a/pkgconfig/libyui-gtk.pc.in +++ b/pkgconfig/libyui-gtk.pc.in @@ -11,10 +11,11 @@ datarootdir=${exec_prefix}/share datadir=${datarootdir}/libyui libdir=${exec_prefix}/@CMAKE_INSTALL_LIBDIR@ includedir=${exec_prefix}/include +plugindir=${exec_prefix}/@CMAKE_INSTALL_LIBDIR@/yui Name: libyui-gtk Version: @VERSION@ Description: libyui-gtk - Gtk plugin for libyui GUI-abstraction library -Libs: -L${libdir} -lyui-gtk +Libs: -L${plugindir} -lyui-gtk Libs.private: -ldl -lpthread Cflags: -I${includedir}/yui/gtk -I${includedir}/yui -I${includedir} From b9666e78f4da0161fe577811255b03913da26d5e Mon Sep 17 00:00:00 2001 From: Angelo Naselli Date: Sun, 9 May 2021 17:58:40 +0200 Subject: [PATCH 15/18] Fixed doc building --- CMakeLists.txt | 7 +++---- doc/CMakeLists.txt | 24 ++++++++++++++++++++++++ 2 files changed, 27 insertions(+), 4 deletions(-) create mode 100644 doc/CMakeLists.txt diff --git a/CMakeLists.txt b/CMakeLists.txt index 3afe707d..509220e6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -58,7 +58,6 @@ if ( BUILD_PKGCONFIG ) add_subdirectory( pkgconfig ) endif() -# TODO -#if ( BUILD_DOC ) -# add_subdirectory( doc ) -#endif() +if ( BUILD_DOC ) + add_subdirectory( doc ) +endif() diff --git a/doc/CMakeLists.txt b/doc/CMakeLists.txt new file mode 100644 index 00000000..2a080c84 --- /dev/null +++ b/doc/CMakeLists.txt @@ -0,0 +1,24 @@ +# CMakeLists.txt for libyui*/doc + +include( ../VERSION.cmake ) + +find_package( Doxygen REQUIRED dot ) + + +# +# Doxygen-generated autodocs +# + +if ( DOXYGEN_FOUND ) + + set( DOXYGEN_GENERATE_TREEVIEW yes ) # Enable views tree HTML frame + set( DOXYGEN_QUIET yes ) # Less verbose output + set( DOXYGEN_WARN_LOGFILE doxygen-warnings.log ) + # See build/CMakeDoxyfile.in for more supported variables + + doxygen_add_docs( doc ../src ) + +else() + message( WARNING "Missing doxygen package" ) +endif() + From 0aabd71649920d765f8e83fb0d0ec88d3257d235 Mon Sep 17 00:00:00 2001 From: Angelo Naselli Date: Sun, 9 May 2021 18:16:30 +0200 Subject: [PATCH 16/18] Bumped version --- VERSION.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION.cmake b/VERSION.cmake index c7e4313a..d6826009 100644 --- a/VERSION.cmake +++ b/VERSION.cmake @@ -1,5 +1,5 @@ SET( VERSION_MAJOR "2" ) -SET( VERSION_MINOR "51" ) +SET( VERSION_MINOR "52" ) SET( VERSION_PATCH "0" ) SET( VERSION "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}${VERSION_SHA1}" ) From 225d415b6bd80d74fccef4045d114400f7235b32 Mon Sep 17 00:00:00 2001 From: Angelo Naselli Date: Sat, 5 Jun 2021 11:51:55 +0200 Subject: [PATCH 17/18] Fixing from PR #78 review comments --- pkgconfig/CMakeLists.txt | 17 ++++++++++------- pkgconfig/libyui-gtk.pc.in | 5 +++++ 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/pkgconfig/CMakeLists.txt b/pkgconfig/CMakeLists.txt index ced6a9fb..ba5bc11e 100644 --- a/pkgconfig/CMakeLists.txt +++ b/pkgconfig/CMakeLists.txt @@ -1,15 +1,16 @@ -# CMakeLists.txt for libyui-mga/pkgconfig +# CMakeLists.txt for libyui-gtk/pkgconfig # # Support for pkg-config: # -# Generate a libyui.pc file from libyui.pc.in and install it to +# Generate a libyui-gtk.pc file from libyui-gtk.pc.in and install it to # /usr/lib64/pkgconfig. # # A .pc file specifies how to use a development package, in particular linker # flags (-lyui-gtk), compiler flags (including include directories) and paths. # See man pkg-config. # -# Notice that libyui-mga linking is needed for libyui-mga-* plugins +# This .pc file is intended for extensions of the Gtk UI plug-in, not for +# applications using libyui. include( ../VERSION.cmake ) include( GNUInstallDirs ) # set CMAKE_INSTALL_LIBDIR @@ -19,16 +20,18 @@ FIND_PACKAGE(PkgConfig REQUIRED) PKG_CHECK_MODULES(YUI REQUIRED libyui) pkg_get_variable(YUI_SO_VERSION libyui soversion) pkg_get_variable(YUI_SO_MAJOR libyui soversion_major) -#pkg_get_variable(YUI_SO_MINOR libyui soversion_minor) -#pkg_get_variable(YUI_SO_PATCH libyui soversion_patch) +pkg_get_variable(YUI_SO_MINOR libyui soversion_minor) +pkg_get_variable(YUI_SO_PATCH libyui soversion_patch) ##### This is needed to be set for the libyui core -SET( SONAME_MAJOR ${YUI_SO_MAJOR} ) SET( SONAME ${YUI_SO_VERSION} ) +SET( SONAME_MAJOR ${YUI_SO_MAJOR} ) +SET( SONAME_MINOR ${YUI_SO_MINOR} ) +SET( SONAME_PATCH ${YUI_SO_PATCH} ) set( PKGCONFIG_INSTALL_DIR ${DESTDIR}${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}/pkgconfig ) -# Generate libyui.pc where some CMake variables are expanded from libyui.pc.in, +# Generate libyui-gtk.pc where some CMake variables are expanded from libyui-gtk.pc.in, # but only expand @VARIABLE@, not ${VARIABLE} configure_file( libyui-gtk.pc.in libyui-gtk.pc @ONLY ) diff --git a/pkgconfig/libyui-gtk.pc.in b/pkgconfig/libyui-gtk.pc.in index 845f1d55..2f5b4f03 100644 --- a/pkgconfig/libyui-gtk.pc.in +++ b/pkgconfig/libyui-gtk.pc.in @@ -13,6 +13,11 @@ libdir=${exec_prefix}/@CMAKE_INSTALL_LIBDIR@ includedir=${exec_prefix}/include plugindir=${exec_prefix}/@CMAKE_INSTALL_LIBDIR@/yui +soversion_major=@SONAME_MAJOR@ +soversion_minor=@SONAME_MINOR@ +soversion_patch=@SONAME_PATCH@ +soversion=@SONAME@ + Name: libyui-gtk Version: @VERSION@ Description: libyui-gtk - Gtk plugin for libyui GUI-abstraction library From 00b708f90bffd76557be9ff33c3225b97a62ecc8 Mon Sep 17 00:00:00 2001 From: Angelo Naselli Date: Sun, 6 Jun 2021 16:32:22 +0200 Subject: [PATCH 18/18] removed dead code as requested --- src/CMakeLists.txt | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 48dfa64e..eddf60fa 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -123,22 +123,6 @@ add_library( ${TARGETLIB} SHARED # Include directories and compile options # -##- set( LOCAL_INCLUDE_DIR ${CMAKE_CURRENT_BINARY_DIR}/include ) -##- -##- # Symlink ${YUI_INCLUDE_DIRS} -##- # so the headers there can be included as -##- add_custom_target( local-include-dir -##- # check if the symlink already exists -##- COMMAND if [ ! -L "${LOCAL_INCLUDE_DIR}/yui" ]\; then -##- rm -rf ${LOCAL_INCLUDE_DIR}\; -##- mkdir ${LOCAL_INCLUDE_DIR}\; -##- ln -s ${YUI_INCLUDE_DIRS} ${LOCAL_INCLUDE_DIR}/yui\; -##- fi -##- ) -##- -##- add_dependencies( ${TARGETLIB} local-include-dir ) -##- target_include_directories( ${TARGETLIB} BEFORE PUBLIC ${LOCAL_INCLUDE_DIR} ) - # Setup CMake to use GTK+, tell the compiler where to look for headers # and to the linker where to look for libraries INCLUDE_DIRECTORIES(${GTK3_INCLUDE_DIRS} ${YUI_INCLUDE_DIRS} ${CMAKE_CURRENT_SOURCE_DIR})